가비지 컬렉션 과정

Java에서는 개발자가 메모리를 명시적으로 해제하지 않는다. 대신에 Garbage Collector가 더 이상 필요 없는 객체를 찾아 지우는 작업을 한다. 이 가비지 컬렉터는 두 가지 가설 전제 하에 만들어졌다.

Weak Generational Hypothesis
        1. 대부분의 객체는 금방 접근 불가능 상태가 된다. 할당되고 짧은 시간 내에 사용이 종료되어 불필요한 상태인 것이 거의 대부분이다.
        2. 오래된 객체에서 젊은 객체로의 참조는 거의 발생하지 않는다.

이 가설의 장점을 최대한 살리기 위해서 메모리를 몇가지 영역으로 분리하여 관리하는 것이 효과적이다.

JVM Memory 영역
- Young 영역 : 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
Old 영역 : 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 
- Perm 영역 : Method 영역이라고도 부른다. Class, Method 등 메타 데이터가 저장된다. 

GC 종류
        - Minor GC : Young 영역에서 발생하는 GC
        - Major(Full) GC : Old 영역에서 발생하는 GC

GC 발생 과정
1. 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
2. Eden 영역이 가득 차 Minor GC가 발생하면 살아남은 객체가 Survivor 영역 중 하나로 이동해서 Age가 증가한다.
3. 다시 Eden 영역이 가득 차 Minor GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 이동해서 Age가 증가한다.
4. 그 Survivor 영역이 가득 차면 그 중에서 살아남은 객체가 다른 Survivor 영역으로 이동해서 Age가 증가한다.
5. 이 과정을 반복하다가 계속해서 살아남은 객체의 Age가 threshold 설정 값(default 16)이 되면 Old 영역으로 이동한다.
6. 이 과정을 반복하다가 Old 영역이 가득 차면 Major GC가 발생한다.

이 절차를 확인해 보면 두개의 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 Survivor 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아니라고 생각하면 된다.


참조 링크 - Java Garbage Collection

'Development > Java' 카테고리의 다른 글

UnsupportedClassVersionError 에러 해결  (0) 2018.07.16
Garbage Collection 방식  (0) 2018.05.12
Garbage Collection 용어 정리  (0) 2018.04.26
AES256 암호화 오류 해결  (4) 2017.10.06
반복문 성능 비교  (0) 2017.07.27
가비지 컬렉션 용어 정리

GC (Garbage Collection)
- Java Application에서 사용하지 않는 메모리를 자동 수거하는 기능

STW (Stop-The-World)
- GC가 메모리 정리를 위해서 어플리케이션의 실행을 중지시키는 행위
- GC 튜닝을 한다면 이 시간을 줄여야 함

OOM (Out Of Memory)
- Heap 메모리 부족 시 발생되는 에러 상황 및 메시지

Mark
- Object가 현재 사용되고 있는지에 대한 검사
- Referrer가 존재하는지 확인하는 것으로 Minor GC단계에서 주로 수행됨

Sweep
- Mark 대상에 대해서 회수 작업 (메모리상에 미사용으로 처리)
- Minor GC단계에서 주로 수행됨

Compact
- 디스크 조각모음 하듯이 메모리 공간 확보 Major GC시에 수행됨 


'Development > Java' 카테고리의 다른 글

Garbage Collection 방식  (0) 2018.05.12
Garbage Collection 과정  (0) 2018.04.28
AES256 암호화 오류 해결  (4) 2017.10.06
반복문 성능 비교  (0) 2017.07.27
List 중복 제거  (0) 2017.07.13

형식 맞추기

  • 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다.
  • 팀이 합의하여 규칙을 정하고 모두가 그 규칙을 따라야 한다.

형식을 맞추는 목적

  • 코드 형식은 중요하다.
  • 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다.
  • 구현한 코드들이 변경되더라도 개발자의 스타일과 규율은 잘 사라지지 않는다.

적절한 행 길이를 유지하라

  • 자바에서 파일 크기는 클래스 크기와 밀접하다.
  • 일반적으로 작은 파일이 큰 파일보다 이해하기 쉽다.

신문 기사처럼 작성하라

  • 독자는 위에서 아래로 읽는다.
  • 메소드 전체 내용을 요약하는 이름을 작성한다.
  • 세세한 내용은 또 하나의 메소드로 분리한다.

개념은 빈 행으로 분리하라

  • 빈 행은 새로운 개념을 시작한다는 시각적 단서다.
  • 다른 개념 사이에 개행이 빠지면 가독성이 현저히 떨어진다.

세로 밀집도

  • 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다.

수직 거리

  • 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현한다.
    • 여기서 뜻하는 연관성이란 한 개념을 이해하는데 다른 개념이 중요한 정도다.
    • 연관성이 깊은 두 개념이 멀리 떨어져 있으면 코드를 읽는 사람이 함수 연관관계와 동작 방식을 이해하기 위해 여기저기 찾느라 시간과 노력을 소모한다.

[수직분리]

변수 선언
  • 처음으로 사용하기 직전에 선언하며 수직으로 가까운 곳에 위치해야 한다.
  • 비공개 함수는 처음으로 호출한 직후에 정의해야 쉽게 눈에 띄어야 한다.
인스턴스 변수
  • 클래스 맨 처음에 선언한다.
종속함수
  • 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다.
  • 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치해야 자연스럽게 읽힌다.
개념적 유사성
  • 개념적인 친화도가 높을수록 코드를 가까이 배치한다.
  • 종속적인 관계가 없더라도 기능적으로 유사하다.
public boolean isAdmin() {  
  return StringUtils.equals(RoleCodes.ADMIN, role.getName());  
}

public boolean isManager() {  
  return StringUtils.equals(RoleCodes.MANAGER, role.getName());  
}

public boolean isUser() {  
  return StringUtils.equals(RoleCodes.USER, role.getName());  
}

세로 순서

  • 호출되는 순서대로 함수를 배치하면 소스 코드 모듈이 고차원에서 저차원으로 자연스럽게 내려간다.
  • 가장 중요한 개념을 표현하고나서 세세한 사항을 표현하면 함수 몇 개만 읽어도 개념을 파악하기 쉬워져서 세세한 사항까지 파고들 필요가 없다.

가로 형식 맞추기

  • 행 길이는 어느 정도가 적당할까?
    • 여러 논쟁이 있지만 120자 정도로 제한하는 것을 권고한다고 한다.

가로 공백과 밀집도

  • 가로로는 공백을 사용해 밀접한 개념과 느슨한 개념을 표현한다.
    • ex) 할당 연산자 명확, 메소드 파라미터 구분, 연산자 우선순위 강조

가로 정렬

  • 정렬을 통해 강조하려고한 진짜 의도가 가려질 수 있다.
  • 변수 유형은 무시하고 변수 이름부터 읽게 되버린다?
    • 정렬이 필요할 정도로 목록이 길다면 문제는 목록 길이지 정렬 부족이 아니다.
    • 만약 선언부가 길어진다면 클래스를 쪼개야 한다는 의미다.

들여쓰기

  • 들여쓰기가 없다면 인간이 코드를 읽기란 거의 불가능일 것이다.
  • 들여쓰기한 파일은 구조가 한눈에 들어온다.
    • ex) 변수, 메소드, 분기문 등..
  • 들여쓰기 무시하기

    • 간혹 간단하고 짧은 메소드에서 규칙을 무시하고픈 유혹이 생긴다.
    public String render() { return ""; }
    
    public String render() {   
      return "";   
    }

팀 규칙

  • 각자 선호하는 규칙이 있지만 팀에 속한다면 자신이 선호해야할 규칙은 바로 팀 규칙이다.
    • 그래야 스타일이 일관적이고 매끄럽다.
    • 팀 규칙을 정하여 IDE 코드 형식기를 설정하여 모두가 그 규칙을 따라야 한다.
  • 좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이뤄진다.

마치며

팀에서 포괄적인 규칙을 정하여 IDE에 적용하여 사용하다가 의아스러운 부분이 있었다.
상세한 부분에 대해서도   규칙을 정하여  사람이 작성한듯한 가독성 좋은 코드를 작성해야 한다.

적용한 룰에 예외적으로 느껴진 항목

  • 테스트케이스 MockMvc 포맷
  • 포맷으로 지정한 가로 길이를 조금 초과하는 경우
  • 조건문 내 1줄 정지성 키워드(break, return, throw ..) 브레이스 여부

참고문헌 - CleanCode 애자일 소프트웨어 장인 정신

'Development > CleanCode' 카테고리의 다른 글

Meaningful Name  (0) 2017.12.31

+ Recent posts