5월, 2018의 게시물 표시

Java Garbage Collection

이미지
Garbage Collection으로 인하여 프로그래머가 직접 Memory를 건들일은 없게 되었습니다. 그러나 명시적 Memory 해제보다 느리며 GC가 발생하는 순건 Suspend Time으로 인하여 다양한 문제가 발생하게 됩니다. Root Set과 Garbage Garbage 대상을 결정하는데에는 아래와 같은 구조를 기준으로 합니다. Local variable, Operand Stact등에서 해당 객체를 참조하고 있으면, Reachable으로 판단. 아직 메모리에 남아있으며, Native Method 영역으로 넘겨진 Object의 참조가 JNI 형태로 남아있으면 Reachable 메서드 영역에 로딩된 클래스 중 Constant pool에 있는 Reference 정보를 토대로 쓰레드 에서 직접 참조하진 않지만 constance pool을 통해 간접 link를 하고있는 객체는 Reachable 이라고 한다. Garbage Collection의 과정을 거치면 위의 Unreachable 객체를 제거하게 된다. 메모리 상에서 해당 객체를 지우면 당연히 단편화(Fragmentation)이 발생하게 되고 이를 위해 Compaction 알고리즘을 사용해야 한다. Hotspot JVM의 Garbage Collection GC 메커니즘은 두가지를 경험적 가설로 두고 있다. 대부분의 객체는 생성후 바로 Garbage가 된다. 오래된 객체가 새로운 객체를 참조할 일은 드물다. 첫번째 가설로 인하여 신생 객체들은 단편화를 자주 만들기에 eden 영역에 모아놓은 것이다. 두번째 가설의 경우 오래된 객체가 새로운 객체를 참조하는 경우가 발생할 경우 문제가 되는데, 그를 해결하기 위한 장치로 Card Table을 도입 하였다. Card Table Card Table Old Object가 Young Object를 참조하게 되면 dirty로 표기하여 해당 내용을

JVM의 구조

이미지
현업에서 자바를 하지는 않고 있지만, 언젠가는  jvm이나 gc에 대한 지식이 필요할듯 하여 공부중 입니다. java에서 프로그램을 실행하면, 컴파일 과정에서 생긴 class 파일을 JVM으로 로딩하고 ByteCode를 해석을 하여 메모리 등의 리소스를 할당하는 등의 과정을 진행하게 됩니다. 이때 JVM은 Thread 관리, Garbage Collection과 같은 메모리 정리 과정도 진행 합니다. JVM 자바의 프로그램 실행은 아래의 과정을 거치게 됩니다. Java 프로그램 수행 과정 java source : 사용자의 코드 Execution Engine : 로딩된 클래스의 ByteCode를 해석 합니다. Runtime Data Area : JVM이 프로그램을 수행하기 위해 OS에서 할당받은 공간. 그중 Runtime Data Areas를 세부적으로 표현하면 다음과 같습니다. JVM Architecture Method : 클래스, 변수, 메서드, static, 상수 등이 들어감.(모든 쓰레드가 공유) Heap : new 명령어로 생성됨.(GC의 영역, 모든 쓰레드가 공유) Stack : 메서드 내에서 생성되는 값. LIFO로 진행. Native Method : 다른 언어등의 메서드를 호출하기 위한 공간. 이런 과정 중 Thread Synchronization과 Garbage Collection 등이 진행 됩니다. Java Heap 위의 구조 중 Heap 영역에서 instance와 array 객체를 저장하는 구조 이며, 그를 해제하는 과정은 JVM이 아닌 Garbage Collector를 통해서 진행이 됩니다. 위는 주로 사용되는 Hotspot JVM의 Heap 구조 입니다. Young Generation 은 eden과 survivor 영역으로 구성이 되며, eden은 Object