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