Dev/Java

[java] JVM, JRE, JDK, 자바 메모리 구조

창문닦이 2019. 9. 28. 10:30

[ JVM, JRE, JDK]

  • JVM : 자바 가상머신(Java Virtual Machine)
    • 바이너리 코드를 읽고, 검증, 실행한다. 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class) 실행가능
  • JRE : 자바 실행환경(Java Runtime Environment)
    • 자바 프로그램을 동작할 필요한 라이브러리 파일과 기타 파일 포함.
  • JDK : 자바 개발도구(Java Development Kit)
    • JRE + 개발을 위해 필요한 javac, java 포함

[자바 메모리 구조]

이미지 추가 예정

eden - s0 - s1 - tenured - direct memory

  1. 에덴에서 생성(Object 생성 )
  2. 에덴영역이 가득차면 minor gc 발생
  3. 계속 사용되는 object(=reachable object)들은 s0으로 이동.
  4. s0 있는 reachable object들은 s1으로 이동
  5. s1 가득차면 s1 reachable objectsms old generation으로 복사

JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부영역으로 구분해서 사용한다.

  1. 메소드 영역
    • 코드에서 사용되는 클래스 파일들을 클래스 로더로 읽어 클래스 별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드로 분류해서 저장한다.
    • JVM이 시작할때 생성되고 모든 스레드가 공유하는 영역이다.
  2. 힙 영역
    • 객체와 배열이 생성되는 영역이다.  힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체들의 필드에서 참조한다.
    • 참조하는 변수나 필드가 없을 경우 GC의 대상이 된다.
  3. JVM 스택 영역
    • 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
    • 자바 프로그램에서 추가적으로 스레드를 생성하지 않으면 MAIN 스레드만 존재하므로 JVM 스택도 하나이다.
    • 메소드를 호출할 때  프레임을 PUSH
    • 메소드가 종료되면 프레임을 POP
    • 예외 발생 시 printStackTrace 메소드로 보여주는 내역들이 Stack Trace의 각 라인은 하나의 프레임을 표현한다. 프레임 내부에는 로컬 변수 스택이 존재하는데 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다.

[Garbage Collection]

  • MinorGC : young generation에서 발생하는 GC
  • MajorGC : old generation에서 발생하는 GC
  • FullGC : Heap영역 전체를 clear하는 GC

[visualVM]

VisualVM은 JVM을 실시간으로 모니터링 할 수 있는 GUI툴이다. jdk 하위의 bin에 실행 파일이 존재한다. 다양한 플러그인을 추가해서 원하는 모니터링 기능을 사용할 수 있다.

jdk에 bin폴더에 실행파일이 있다.
memory space를 그래픽으로 볼 수 있다!

Reference

https://post.naver.com/viewer/postView.nhn?volumeNo=23726161&memberNo=36733075

https://bcho.tistory.com/157?category=75946

https://dzone.com/articles/java-memory-management

'Dev > Java' 카테고리의 다른 글

[java] CSV 파싱하기  (0) 2019.12.13
[java] Logback 과 Maven  (0) 2019.10.04
[java] HttpClient  (1) 2019.09.26
[java] on-heap 과 off-heap  (0) 2019.09.20
[java] 자바 프레임워크  (0) 2019.03.18