JVM 기본 마인드 맵 (지속적인 업데이트)
JVM
JVM 내부 구조
바이트 코드 실행 엔진
- 작업은 바이트 코드 명령어를 해당 플랫폼의 로컬 머신 명령어로 컴파일하여 실행하는 것입니다.
JVM 메모리 모델
내부 관계
-
프로그램 카운터
-
위치 : 각 스레드가 차지하는 독립 메모리 영역에는 스레드의 프로그램 카운터를 넣는 데 사용되는 영역의 일부가 있습니다.
- .class 파일 (java -c로 획득)
-
바이트 코드 파일의 각 메서드에 해당하는 구문 분석 된 콘텐츠
코드 : 0-n은 우리가 원하는 실행 위치
(줄 수)입니다 .
- 用处:用于记录当前线程正在执行的代码的位置(行号)
- 存在原因:假如CPU执行该线程到一半去干别的活,当前线程被挂起,那么就需要知道被插队前执行到哪了,以方便CPU回来干活后能从上一个记录点继续
- 数值变化:每运行完一行,程序计数器存放的值会被字节码执行引擎修改
-
방법 영역 (메타 공간, 영구 생성)
- 저장 내용 :
상수, 정적 변수, 클래스 정보
- 저장 내용 :
-
네이티브 메서드 스택
- 네이티브 메서드 전용 메모리 공간 :
네이티브 수정 메서드, 즉 C 언어로 작성된 기본 메서드가 호출되면 JVM이 스레드의 메모리 공간에 해당 영역을 그립니다.
-
스레드 스택
-
각 스레드가 실행되기 전에 JVM은 스레드가 로컬 변수를 저장할 수 있도록 독립적 인 스택 메모리 공간을 할당합니다.
- 스택 프레임 메모리 :
스레드에서 메소드가 실행될 때 JVM은 자체 스택 메모리 공간에 로컬 변수 (국내 인형)를 저장하기 위해이 메소드에 대해 독립 메모리 공간을 할당합니다.
- 스택 프레임 메모리 :
-
메서드 호출이 완료되면 메서드가 차지하는 스택 프레임 메모리가 해제됩니다.
스택 메모리 순서 (FILO) : 프로그램 메소드의 중첩 호출은 스택과 동일한 구조를 갖습니다.
- 栈帧内存内部:
-
지역 변수 테이블
-
피연산자 스택
-
동적 링크
-
방법 내보내기
- 局部变量表:
메서드 내부에 정의 된 메서드 매개 변수와 지역 변수로 구성된 변수 값의 저장 공간이며, 그 용량은 Slot1을 가장 작은 단위
피연산자 스택으로 사용합니다.
LIFO 스택, 바이트 코드 명령어에 의해 스택에서 데이터 저장 및 가져 오기-
동적 링크 :
각 스택 프레임에는 런타임 상수 풀에서 스택 프레임이 속한 메서드에 대한 참조가 포함되어 있으며이 참조는 메서드 호출 중에 동적 연결을 지원하기 위해 유지됩니다.
-방법 내보내기 :
메서드를 호출 한 PC 카운터의 값을 저장합니다. 메서드가 시작될 때이 메서드를 종료하는 방법은 두 가지뿐입니다.
1. 실행 엔진은 임의의 메서드에서 반환 된 바이트 코드 명령을 만납니다.이를 소위 정상 완료 종료라고합니다. 2. 메서드 실행 중에 예외가 발생하고 메서드에서 예외가 처리되지 않았습니다. 즉,이 메서드의 예외 테이블에 일치하는 예외 처리기가 없으면 메서드가 종료됩니다. 비정상 완료 출구가됩니다.
정상 완료 종료와 비정상 완료 종료의 차이점은 비정상 완료 종료를 통한 종료는 상위 호출자에게 반환 값을 생성하지 않는다는 것입니다.
어떤 방법으로 종료하든 메소드가 종료되면 메소드가 호출 된 위치로 돌아갑니다. 메소드가 정상적으로 종료되면 호출자의 PC 카운터 값이 반환 주소로 사용되며 예외를 통해 종료되면 , 반환 주소는 예외를 통해 처리되어야합니다. 일반적으로이 정보 부분은 스택 프레임에 저장되지 않습니다.
- 存放堆中对象的内存地址
-
더미
-
저장 :
새 개체 -
힙의 내부 구조
-
젊은 세대
-
Eden 구
-
에덴 지역이 가득 차면 Minor GC가 쓰레기를 수거하러 온다
- 가비지 수집 원칙
-
-
생존자 영역
- 구에서
- To 구
-
-
노년
-
노년이 지나면 Full GC가 쓰레기를 모 으러 온다
- Full GC가 작업을 마친 후에도 여전히 위치가없고 OOM이 발생합니다.
-
-
-
-
팁 :
-
힙 및 메소드 영역은 스레드가 공유하는 영역입니다.
-
힙 메모리 크기 할당 :
젊은 세대 :
Eden : From : To = 8 : 1 : 1 -
생존자 영역에서 노년기 영역으로 :
-
- 장기 생존 : 15 세에 도달
- 개체 동적 연령 판단 : 쓰레기가 아닌 개체의 크기는 입력 할 생존자 영역의 1/2보다 큽니다.
- 대형 객체 : (문자열, 배열 등) JVM 매개 변수는 대형 객체의 크기를 설정할 수 있습니다. 임계 값을 초과하면 직접 노후화됩니다.
JVM 튜닝
JVM 튜닝 목적
-
사용자 일시 중지 시간 감소
-
STW 시간 단축
- Full GC 수 줄이기
-
참조 :
- 2020 년, 최신 Java 가상 머신 JVM 기본 원리 분석 비디오 튜토리얼 전체 세트 프로그래머 Zhuge
검색 출처 : https://www.bilibili.com/video/BV1dJ411G7YJ?p=7 - Java JVM의 힙, 스택 및 메소드 영역에 대한 자세한 설명 — Zhang Qilu
검색 출처 : https://blog.csdn.net/zhangqiluGrubby/article/details/59110906