티스토리 뷰

1. GC ...?


가비지 컬렉션이란, 기존에 할당된 메모리를 재사용하는 메커니즘으로서, 모든 작동 중인 코드에서 더이상 참조하지 않는 Unreachalbe 객체를 찾은 후,

반환하는 목적을 가진다. 가비지 컬렉션은 두가지 가설을 바탕으로 설계되었다.

 - 대부분의 객체는 금방 참조하지 않는(Unreachable) 상태가 된다.

 - 오래된 객체에서 최근에 생성된 객체로의 참조는 아주 드물게 존재한다. (이와 같은 경우 Old area Card Table을 이용해 제어)


2. Minor GC ...?


Minor GC는 Young 영역에서의 GC를 의미한다. Young 영역은 처음 객체가 생성되었을 때 저장되어지는 Eden 영역과 2개의 Survivor 영역으로 구성되있다.

Old 영역에서 New 영역의 객체를 참조할 때, Card table에 New 영역의 객체의 정보가 표시된다. New 영역에서 GC가 발생할 때, Old 영역을 모두 탐색하지

않고 테이블만 조회함으로써 효율 증대

 → 새로 생성한 객체는 Eden 영역에 위치 

 → Eden 영역에서 GC 발생 후, 사용되는 객체는 Survivor1 영역으로 이동

 → Eden 영역에서 사용중인 객체는 GC 이후에 Survivor1 영역에 계속해서 이동하고, Survivor1 영역이 가득차게되면 사용중인 객체는 Survivor2 영역으로 이동

 → Survivor1 영역은 어떤 객체도 남지 않고 비어있는 상태. 이 과정을 반복하다가 계속해서 사용중인 객체는 Old 영역으로 이동


3. Major GC ...?


Major GC는 Old 영역에서의 GC를 의미한다. 전통적인 Major GC는 mark-sweep-compact 알고리즘을 사용한다. 이 알고리즘은 Old 영역에서 참조되고 있는 

객체를 식별하여 live 라벨을 붙이고(Mark), 힙의 앞 부분부터 참조되고 있는 객체만 남긴다.(Sweep) 마지막으로 가능한 많은 여유 공간을 확보하기 위해 각 객체들이 연속적으로 쌓이게 하여 압축한다. 이와 같은 방식을 Serial GC라고 한다. 


GC가 동작할 때, Stop- the-world 상태가 된다. GC를 실행하고 있는 스레드를 제외한 다른 모든 스레드가 정지하게 된다. GC 튜닝이란 이 Stop the world 시간을

줄이는 것을 의미한다. 계속해서 GC에 대한 알고리즘이 향상되고 있으며, Stop the world 의 시간을 줄이고 있다.


4. JVM에서 메모리의 누수가 발생할까?


JVM에서도 메모리 누수가 발생할 수 있다. GC는 참조하지 않는 Unreachable한 객체를 제거 대상으로 간주하기 때문에 사용은 하지 않지만 계속해서 참조를 

하는 경우가 있다면 메모리 누수가 발생할 수 있다. 예를들어 대용량의 파일을 저장하는 List가 존재할 때, 파일 객체를 삭제하는 것이 아닌, 인덱스를 통해

객체를 삭제하는 것처럼 사용한다면, 여전히 리스트에서 참조되고 있기 때문에 사용하지 않는다 할지라도 GC에 대상이 되지 않는다.


5. GC를 직접 수행할 수 있을까?


GC는 System.gc() 메소드를 통해 개발자가 의도적으로 실행이 가능하다. 하지만 실행은 가능하지만, 실제로 GC가 동작한다는 보장은 없다.

System.gc() 메소드가 동작하면, 참조되지 않는 객체드을 반환하여 메모리의 공간을 재배치하는데 최선을 다할뿐 실제로 동작하지 않을 수 있다.

그리고 동작을 위해서 Stop-the-world 가 발생할 수 있어 시스템의 성능을 오히려 저하시킬 수 있다.


[출처 : https://d2.naver.com/helloworld/1329]


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
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
글 보관함