자바의 메모리 구조?
- JVM의 메모리 구조
- 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행
- 메소드와 클래스변수들을 해당 메모리 영역애 배치
- 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
-
다음 라인을 진행하면서 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)
- Class Loader: JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임시 동적으로 클래스를 로드한다.
- Execution Engine: Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, Execution - Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
- Garbage Collector: JVM은 Garbage Collector를 통해 메모리 관리 기능을 자동으로 수행한다. 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.
- Runtime Data Areas: JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. Class Loader에서 준비한 데이터들을 보관하는 저장소이다.
가비지 컬렉터란?
Heap 영역의 오브젝트 중 stack 에서 도달 불가능한 (Unreachable) 오브젝트들은 가비지 컬렉션의 대상이 된다.
https://yaboong.github.io/java/2018/06/09/java-garbage-collection/
https://jins-dev.tistory.com/entry/%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0Garbage-Collector-%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://itjava.tistory.com/37
힙덤프란?
- 힙은 ? Heap이란 Java에서 사용하는 object들을 저장하는 공간입니다. 물론 Heap이란 용어가 꼭 Java에서만 사용되는 용어는 아닙니다. Unix에서 Native 즉 C에서 malloc()으로 할당되는 메모리 영역을 Heap(예전에 공부할때 자유저장소 라고도 했었죠 ^^)이라고 말합니다
JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다. New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다. 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다. 힙 영역의 사용기간 및 스레드 공유 범위 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시 GC(Garbage Collection) 대상 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다. 모든 스레드에서 공유한다.
- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- Garbage Collector를 통해 메모리 반환
i) Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간
ii) New Area(young generation)
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간,
eden,sa1,sa2 으로 계속 이동하게 되는데 왔다갔다 하는 애들은 count를 센다
iii) Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
객체들이 계속 이동될때 count를 세는데 이 객체들은 메모리에 오랫동안 살아남는 애들을 여기다 저장한다.
old가 점점 커지면 cpu가 멈춰버린다. 이걸 stop the world라고 한다.
Young 영역(Yong Generation 영역): 새롭게 생성한 객체의 대부분이 여기에 위치한다.
대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
Old 영역(Old Generation 영역): 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
힙덤프란?
Java 프로그램은 처음 시작할 때 사용할 Heap 영역을 가지고 있습니다. 이 영역이 부족하게 되면 Out Of Memory Error가 에레를 발생시킵니다. 그로인해 heap dump가 만들어 지게 된다.
MemoryError : out of memory가 발생시에 힙덤프를 현재 실행 디렉토리에 생성한다.
-XX:HeapDumpPath=힘덤프를 생성할 경로/힙덤프이름.hprof : 지정한 경로에 생성한다.
http://blog.naver.com/PostView.nhn?blogId=bumsukoh&logNo=110123438564&redirect=Dlog&widgetTypeCall=true
JVM 을 힙덤프가 남게 죽이는 법은?
Heap dump를 생성하기 위해서는 Java 프로세스에 Ctrl+Break 또는 SIGQUIT Signal을 발생시켜 생성할 수 있다. 즉 Thread dump 생성과 동일한 방법입니다.
리눅스 : kill -3 [PID] 윈도우 : Ctrl + Break
java단에서 (jps -v 로 java 프로세스 확인) jstack [PID] (jstack으로 반응이 없는 경우 –F 옵션) jcmd [PID] Thread.print (jdk7 이후 등장) jcmd [PID] help 로 명령어 확인 가능, 직관적임
출처: https://sjh836.tistory.com/151 [빨간색코딩]