티스토리 뷰

JAVA

[JAVA] Garbage Collection

jckim 2020. 6. 23. 23:50

JVM

jvm은 OS로부터 java application이 필요로 하는 메모리 영역을 할당 받음.

해당 메모리 영역을 효율적으로 사용하기 위해서 관리하는 역할 수행.

메모리 관리 시 Garbage Collection을 수행.

(OS로부터 할당받은 메모리 영역 = Runtime Data Area)


Garbage Collection (GC)

Runtime Data Area 중 Heap 메모리 영역에 사용하지 않는 자원을 메모리에서 삭제 하는 작업. (자원=객체)

Runtime Data Area 구조

 


Heap 영역 구조

Heap 메모리 영역 구조

  • Yong Generation 영역 : 생명주기가 짧은 객체 존재 세부적으로 아래 두 영역으로 구분

    • Eden : 객체가 최초 생성되면 보관되는 영역

    • Supervisor(from, to) : MinorGC 시 Eden 영역과 함께 비교되어 사용되는 영역

  • Old Generation : 생명주기가 긴 객체 존재 (GC 되지 않고 오랫동안 살아남은 객체)

  • Permanent Generation : java application을 실행할때 클래스와 메타데이터를 저장하는 영역 (java 8부터는 MetaSpcae 영역으로 대체)


GC 종류

  • minor GC 

    • heap 영역 중 young 영역에서 수행하는 GC.

  1. 최초 객체 생성 시 Eden 영역에 적재

  2. Eden 영역을 어느정도 사용하여 GC 발생 시 비어있는 Supervisor 영역(from)으로 이동

  3. Supervisor 영역(from)에 계속 적재가 되어 더 이상 적재가 불가능할 때 GC 발생 이때는 Eden 영역과 Supervisor 영역(from)에 객체를 다른 Supervisor 영역(to)에 적재

  4. 이러한 과정(1~3)을 반복해서 계속 살아 남은 객체는 old 영역으로 이동

  • major GC

    • heap 영역 중 old 영역에서 수행하는 GC

    • minor GC 실패시 수행

    • GC 알고리즘에 따라서 방법 다르지만 객체의 생사 여부를 체크(객체 참조 여부)하여 죽은 객체들은 삭제 처리. (Mark and Sweep)

  • Full GC

    • minor GC와 major GC 모두 더 이상 수행이 불가한 경우 발생하는 GC

    • young 영역과 old 영역 모두 GC 처리.

    • Full GC가 수행되는 경우  application Thread는 멈추게 됨.(Stop and World)


GC 대상

  • 객체 참조가 null 인 경우

  • 객체가 블럭 내에서 생성되고 해당 블럭이 종료되었을 경우

  • 부모 객체가 null이 된 경우, 자식 및 포함된 객체

  • 약한 참조(Weak Reference)만 가지고 있는 경우


JAVA 메모리 누수 방지 코딩

  • 객체 사용 후 null 할당

1
2
3
4
5
6
7
8
9
//객체 생성
List<Object> list = new ArrayList<Object>();
 
//list 객체 사용
...
 
//객체 사용 완료 후 null 부여
list = null;
 
cs

 

    • String 객체 대신 StringBuffer 대체 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
    String 객체 += 연산자 사용시
    100개의 String 객체가 생성됨
*/
 
String str = "test";
 
for(int i =0; i<100; i++){
    str += ".";
}
 
//=======================================
 
/*
    StringBuffer 사용 시
    하나의 StringBuffer 객체에 작업 수행
*/
 
StringBuffer strBf = new StringBuffer();
 
strBf.append("test");
 
for(int i =0; i<100; i++){
    strBf.append(".");
}
cs

 

    • 자원 반납

1
2
3
4
5
6
7
8
9
10
11
12
13
    FileInputStream fis = null;
    try{
         fis = new FileInputStream("");
    }catch(IOException e){
 
    }finally {
        try {
            fis.close(); // 자원 사용 후 반납 ★★★★★
        }catch (IOException ie){
            
        }
    }
 
cs
  • static 변수 사용 최소

    • static 변수는 메모리 영역 중 static 영역에 생성되어 GC관리 영역을 벗어남.

    • static 변수는 프로그램이 종료될 때 해제됨.


마치며

Full GC 발생 시 application Thread 작업이 중단이 되어 application 성능 저하의 원인이 되기 때문에 GC 발생 빈도를 줄이는 코딩 습관과 적절한 GC 방식 선택이 필요.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함