2023. 9. 22. 12:26ㆍJava
GC 공간 힙이고 new, old, permanent 영역으로 구성된다.
new는 eden과 두개의 survivor 영역으로 구성된다.
eden은 최초로 만들어진 객체가 가는 곳이다. 이후 필요가 없어지면 처리되고 살아남으면 survivor에 가게 된다.
survivor은 하나가 가득 차게 되면 정리를 하고 여기서 살아남은 것 중 오래된 것은 old에 가게 된다. 그리고 얼마 되지 않은 것은 다른 survivor에 가고 원래의 survivor은 비워진 상태로 존재하게 된다. 이게 반복된다.
GC가 진행될 때는 stop-the-world가 발생하는데 GC 쓰레드를 제외한 모든 쓰레드가 멈추는 현상이다. 이때의 시간이 성능에 큰 영향을 미치는데 이를 줄이기 위한 방법론이 GC 튜닝이다.
만약 old에서 new를 참조하고 있다면 이 old를 특별한 저장공간인 카드 테이블에 저장하고 이 부분만 참조해 old에서 new를 참조되고 있는지를 확인한다.
gc의 방법에는 serial gc, parellel gc 등이 있다. serial은 메모리가 적고 단일 cpu일 때 사용하고 parallel은 메모리가 많고 여러 코어를 사용할 수 있을때 사용한다. parellel이 훨씬 빠르다.
참고로 System.gc()를 사용하면 매우 느려지므로 사용하지 말아야 한다.
java9 부터는 g1 gc를 이용했다. 그 전에는 cms gc를 이용했다. g1 gc는 young에서 old로 가는 단계가 없어졌다고 볼 수 있다. 바둑판처럼 생겼다.
Reference
https://d2.naver.com/helloworld/1329
http://asfirstalways.tistory.com/158
http://asfirstalways.tistory.com/159
https://steady-coding.tistory.com/590
'Java' 카테고리의 다른 글
[Java] Annotation에 대한 나름의 이해 (0) | 2023.09.24 |
---|---|
[Java] Collection에 대한 나름의 이해 (0) | 2023.09.23 |
[Java] volatile 변수에 대한 나름의 이해 (0) | 2023.09.16 |
[Java] private static에 대한 나름의 이해 (0) | 2023.09.16 |
[Java] final 예약어 (0) | 2023.09.14 |