Garbage Collector

 가비지컬렉터란 JVM에서 실행되는 프로그램으로, Application 내부에서 사용되지 않는 객체를 제거한다. 이게무슨말일까?? 다음소스를 한번 봐보자.

for (File f : files) {
    String s = f.getName();
}

 이 소스코드는 files의 길이에 따라 달라지겠지만, files의 length가 2개 이상일경우, 계속해서 String 객체를 생성한다. 이는 계속해서 메모리를 String객체를 만들기위해 할당하고있다.

 그러나 2번째 반복에서는 첫번째 만들어진 String s 객체를 사용하지않는다. 이것을 "Garbage" 라고 간주한다. 이런 Garbage가 쌓이고 쌓이게 된다면, 새로운 객체를 만들 공간이 부족해질 것이다. 이를 위해 Garbage Collector가 있는 것이다.

any live threads or by any static references 에서 도달할수 없는 Object의 경우, Garabage Collection 의 적격의 대상이다.

 즉 개체의 모든참조가 null일경우 Garbage Collection의 대상이 될수있다.
 또한 A -> B 의 의존성이있고, B -> A의 의존성이있지만, A와 B가 다른 reference가 없을경우 A와 B 모두 수거대상이된다.

 

Heap Generations for Garbage Collection

 자바의 Object는 Heap에서 생성되며,힙은 GC를 위해 3개의 parts로 나뉘어져있다. 각각 Young(New) generationTenured(Old) Generation and Perm Area 이다.

 Young Generation은 더 나아가, Eden Space, Survivor1과 Survivor2로 나뉜다. Object가 맨처음 생성되었을때, 그것은 Eden공간 내부에서 생성되고, 그 후 Minor Garbage Collection후 살아남은 객체는 S0으로 이동하고, 또 Minor GC가 있은후 S1으로 이동된다. 만약 Major garbage collection 전에 s0,s1 영역에 계속 살아남았다면, 이것은 Old(tenured) 영역으로 이동하게된다.

 또한 Heap의 Perm 공간에는 메서드, Classes와 String Pool 및 Class level detail 에대한 Metadata를 저장하는곳이다.

 

Major GC가 Minor GC보다 느린이유.

- 예를들어가정해보자 15개의 objects 들을 s1 영역으로 이동시키고, 다음 gc에서는 s2로 이동시킨다. 또 다음 GC는 survivor를 s1 또는 s2로 이동시킬것이다. 이렇게 되면 계속해서 살아남은 생존자들은 old generation으로 이동하게 될것이다.

- Major GC는 old generation에 free space가 없어 더이상 survive한 객체를 옮길수 없을때에 발생한다. old generation에 모든 object에 대해 gc가 수행된다. old generation은 보통 young generation보다 많은 object를 담고있기때문에, GC처리가 훨씬 오래걸린다. 

 

 

what is? 

minor gc: 모든 새로운객체는 Young Generation에 할당되는데, Young Generation이 꽉차게되면 이는 minor GC를 일으킴.
major gc: Young generation에 있는 객체에 임계값을 설정하고, 그 임계값이 넘게되면 Old gerneration으로 이동되게된다. 그리고 쌓이고 쌓이게되다보면, Old Generation영역도 GC가 발동되게 되는데 이를 Major GC라고한다. 종종 live Object도 수집대상이 되기때문에, 훨씬 더 느리다.
full gc: Perm 영역에는 클래스 및 메소드가 사용되는데 설명하는 metadata들이 포함되어있다. 사용중인 클래스를 기준으로 JVM에 의해 채워진다. 또한 java SE 클래스또한 이곳에 저장될수있다. JVM이 기존것들이 더이상 필요하지않고, 다른클래스를 위한 공간이 필요하다고 여겨질때 perm 영역가지 포함되어 gc가 일어나게되는데 이를 full gc라고한다.
String Pool:
method,classes, class level metadata

 

!!!주의: JDK 8에서는 Perm Gen이 Heap에서 삭제되고, Native 영역에 MetaData Space가 생겼다.

Java 7의 JVM 구조

<----- Java Heap ----->             <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
                        <--------->
                       Permanent Heap
S0: Survivor 0
S1: Survivor 1


JAVA 8의 JVM 구조

<----- Java Heap -----> <--------- Native Memory --------->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+

(Heap 영역은 JVM에 의해 관리된 영역이며, Native 메모리는 OS 레벨에서 관리하는 영역으로 구분된다)

Perm 영역은 보통 Class의 Meta 정보나 Method의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간으로 흔히 메타데이터 저장 영역이라고도 한다. 이 영역은 Java 8 부터는 Native 영역으로 이동하여 Metaspace 영역으로 변경되었다. (다만, 기존 Perm 영역에 존재하던 Static Object는 Heap 영역으로 옮겨져서 GC의 대상이 최대한 될 수 있도록 하였다)

 

왜 Perm이 제거됐고 Metaspace 영역이 추가된 것인가?

최근 Java 8에서 JVM 메모리 구조적인 개선 사항으로 Perm 영역이 Metaspace 영역으로 전환되고 기존 Perm 영역은 사라지게 되었다. Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급하게 된다. (Heap 영역은 JVM에 의해 관리된 영역이며, Native 메모리는 OS 레벨에서 관리하는 영역으로 구분된다) Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.

 

JAVA7과 JAVA8의 변동사항.

  JAVA 7 JAVA8
Class 메타 데이터 저장 저장
Method 메타 데이터 저장 저장
Static Object 변수, 상수 저장 Heap 영역으로 이동
메모리 튜닝 Heap, Perm 영역 튜닝 Heap 튜닝, Native 영역은 OS가 동적 조정
메모리 옵션 -XX:PermSize
-XX:MaxPermSize
-XX:MetaspaceSize
-XX:MaxMetaspaceSize

 

Perm 영역에 있던 것들은 어디로?

 - Mehtods of a class -> Native 영역으로
 - Names of the clases -> Native 역역으로
 - Constant pool information (String 포함) -> Heap 영역으로
 - Static Variable -> Heap 영역으로

 

JDK8에 관한내용 출처:https://johngrib.github.io/wiki/java8-why-permgen-removed/

 

전체출처: https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

 

Java Garbage Collection Basics

Java Overview Java is a programming language and computing platform first released by Sun Microsystems in 1995. It is the underlying technology that powers Java programs including utilities, games, and business applications. Java runs on more than 850 mill

www.oracle.com

https://stackoverflow.com/questions/24592834/why-major-garbage-collection-is-slower-than-minor

 

Why Major Garbage collection is slower than Minor?

Gone thru this link but still has confusion what actually happens in minor and major GC collection. Say i have 100 objects in younger generation out of which 85 object are unreachabe objects. Now ...

stackoverflow.com

JDK 8 로 넘어오면서 레가시 시스템의 성능저하를 MaxMetaspaceSize를 바꿔서 튜닝사례

https://brunch.co.kr/@heracul/1

 

JDK8 적용 후, 심각한 성능저하가 발생한다면?

Full GC가 제대로 되지 않는다면?! | 17년 9월 드디어 JDK9이 release되었습니다. 14년 3월에 JDK8이 출시된 후로 무려 3년6개월만입니다. 작년 Java One에서 Jigsaw프로젝트 리뷰하면서 올 연초에 나온다고 했었는데...계속 연기되었었죠 ^^; 뭐 어찌됐건 JDK9이 release된 마당에 아직도 JDK7을 쓰고 있다고 자책하면서 JDK8으로 업그레이드를 했다면, 그리

brunch.co.kr

 

+ Recent posts