JVM 런타임 데이터 영역(JVM Runtime Area)은 실제로 JVM이 실행되는 동안 JVM 메모리 공간을 분할하고 할당하는 것을 의미합니다. 인터넷에서 찾은 두 그림은 다음과 같습니다. (개인적으로 두 번째 그림인 Native Method Stack은 Java Thead 모듈에 그려야 한다고 생각합니다.)
Stack영역
스택은 Java 가상 머신 스택과 로컬 메소드 스택등을 저장하는 데 사용되는 스택 프레임을 생성합니다. 각 메소드는 실행될 때까지 호출됩니다. 가상 머신에서 스택 프레임이 스택에 푸시된 후 스택 밖으로 튀어나오기까지의 프로세스에 해당합니다.
스택은 일반적으로 컴파일 중에 알려진 8가지 기본 데이터 유형과 객체 참조 및 명령어 주소를 저장하는 로컬 변수 테이블 부분을 나타냅니다. 지역 변수 테이블은StackOverFlowError와 OutOfMemoneyError라는 두 가지 예외가 있습니다. 스레드 요청 스택 깊이가 가상 머신에서 허용하는 깊이보다 크면 StackOverFlowError 오류가 발생합니다. 가상 머신 스택은 동적으로 확장되고, 충분한 메모리 공간에 확장을 적용할 수 없으면 OutOfMemoneyError가 발생합니다.
로컬 메서드 스택은 가상 머신에서 사용하는 로컬 메서드(네이티브)를 제공하며 스레드 전용입니다.
2. 힙 영역
힙은 모든 스레드가 공유하는 영역으로 가상 머신이 시작될 때 생성되며 개체 인스턴스를 저장하는 유일한 목적을 가지고 있습니다
.OutOfMemoneyError
은 모든
threads쓰레기 수거는 이 지역을 거의 방문하지 않지만 주로 지속적인 수영장 재활용 및 유형 하역을 위해 재활용이 필요합니다. 상수 풀은
컴파일 시간상수에 생성된 상수를 저장할 수 있습니다. 문자열의 intern() 메소드와 같이 상수 풀에 추가할 수도 있습니다.
4. 프로그램 카운터
현재 스레드에 의해 실행되는유일한 Java 가상 머신 은 OutofMemoryError 블록을
지정하지 않습니다.3. 데이터 영역 요약
이름
기능 |
구성 매개변수 |
Exception |
||
프로그램 카운터 |
작은 메모리를 차지하고 스레드 전용이며 수명 주기는 스레드와 동일합니다 |
대략 바이트 코드 줄 번호 표시기 |
None |
None |
가상 머신 스택 |
스레드 프라이빗, 수명 주기는 스레드와 동일, 지속적인 메모리 공간 사용 |
Java 메소드 실행을 위한 메모리 모델, 로컬 변수 테이블 저장, 작업 스택, 동적 링크, 메소드 종료 등 . 정보 |
- |
객체 인스턴스를 저장하면 모든 객체 인스턴스(배열 포함)가 힙에 할당됩니다 |
-Xsx-Xmn | OutOfMe moryError | 메서드 영역 |
스레드 공유, 라이프 사이클은 가상 머신과 동일하며 클래스 정보, 상수, 정적 변수, 코드를 저장하기 위해 연속적인 메모리 주소를 사용할 수 없습니다 |
Just-In-Time 컴파일러에 의해 컴파일된 데이터와 가상 머신에 의해 로드된 기타 데이터 |
-XX:MaxPermSize:64M | OutOfMemoryError
|
Part 런타임 상수 풀 | 메서드 영역, 동적 저장소 리터럴 및 기호 참조 | |
4. 확장: 직접 메모리 | 직접 메모리(직접 메모리) 가상 머신 런타임 데이터 영역도 아니고 자바 가상 머신 사양에 정의된 메모리 영역도 아니지만, 이 메모리 부분도 자주 사용되며 OutOfMemoryError 예외가 발생할 수도 있으므로 여기서는 설명하겠습니다. JDK 1.4에는 NIO(NewInput/Output) 클래스가 추가되었으며, Native 함수 라이브러리를 사용하여 오프 힙 메모리를 직접 할당한 다음 DirectByteBuffer를 통해 작동할 수 있습니다. 이 메모리에 대한 참조로 Java 힙에 저장된 객체입니다. 이렇게 하면 Java 힙과 기본 힙 간에 데이터가 앞뒤로 복사되는 것을 방지하므로 일부 시나리오에서 성능이 크게 향상될 수 있습니다. | 5. 확장: 힙과 스택의 비교어떤 사람들은 Java 메모리를 힙 메모리(Heap)와 스택 메모리(Stack)로 나누는 경우가 많습니다. 이 구분은 비교적 대략적이며 실제로 Java 메모리 영역 구분은 훨씬 더 복잡합니다. 이것보다. 이 분할 방법의 인기는 대부분의 프로그래머가 가장 주의를 기울이고 객체 메모리 할당과 가장 밀접하게 관련된 메모리 영역이 이 두 영역이라는 것을 보여줍니다. | 힙은 유연하지만 안전하지는 않습니다. 객체의 경우 동적으로 생성하고 소멸해야 하는데, 나중에 생성된 객체는 소멸되지 않는다고 할 수 없고, 이 경우 프로그램을 실행하기 어려워지므로 힙을 사용하게 됩니다. Java에 객체를 저장합니다. 힙의 개체가 삭제된 후 이 개체를 계속 참조하면 유명한 NullPointerException이 발생합니다. 이는 힙의 단점입니다. 잘못된 참조 논리는 런타임에만 발견됩니다. 스택은 유연하지 않지만 엄격하고 안전하며 관리가 쉽습니다. 상위 참조가 파괴되지 않는 한 하위 참조는 계속 존재해야 하기 때문입니다. 대부분의 프로그램에서는 먼저 정의된 변수와 참조가 스택에 푸시되고, 동시에 변수가 스택에 푸시됩니다. 블록 내부의 참조는 엔트리 영역에 저장됩니다. 블록이 스택에 푸시되고 블록이 끝나면 스택에서 팝됩니다. 이 메커니즘을 이해하면 다양한 프로그래밍에서의 범위 개념을 쉽게 이해할 수 있습니다. 동시에 이는 스택의 장점이기도 합니다. 컴파일 중에 잘못된 참조 논리가 언제든지 발견될 수 있습니다. |
위 내용은 JVM 메모리 모델 그래픽 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!