JVM 메모리 영역

런타임 데이터 영역

《深入理解Java虚拟机》(第二章 Java内存区域与内存溢出异常)

이 다른 데이터 부분의 수를 관리하게하는 자바 프로그램의 실행 중에, Java 가상 머신의 메모리 분할. 이 영역은 자신의 목적을 가지고, 창조와 파괴의 시간은 가상 머신 과정에 따라 일부 지역이 존재하며, 일부 지역은 만들고 스레드를 동시에 파괴 시작과 끝 사용자에 따라 달라집니다.

"자바 가상 머신 사양 (자바 SE 버전 7)"에 따르면 요구 사항은, Java 가상 머신의 메모리 관리는 다음과 같은 런타임 데이터 영역을 포함 할 것이다.

PNG

첫째, 프로그램 카운터

프로그램 카운터는 자신이 현재 실행 스레드의 지표 바이트 코드 라인 번호로 간주 될 수 있으며, 더 작은 메모리 공간이다. 가상 시스템의 개념적 모델 (인 仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现바이트 코드 해석기는 다음 명령어를 선택하기 위해 상대 바이트 코드의 값을 변경하여 작동하는 분기 루핑, 분기를 실행하는 경우), 예외 처리, 회수 및 기타 기본적인 스레드 기능이 완벽에 카운터에 의존 할 필요가있다.

멀티 스레드 Java 가상 머신이 차례로 때문에 프로세서가 (a를 결정 언제든지 스위치 스레드에 의한 프로세서 실행 시간의 할당을 달성하기 위해 对于多核处理器来说是一个内核) 단지 하나의 스레드의 명령을 실행한다. 따라서, 정확한 실행 위치로 스레드 스위치를 복원하기 위해, 각 스레드는 별개의 프로그램 카운터 필요 카운터 독립적 스레드 간의 서로를 독립적 저장소, 우리는에 대한 메모리 영역이 유형의 호출 " 스레드 - 사설 에서" 메모리.

스레드 자바 메소드를 실행하는 경우, 카운터는 실행되는 가상 머신 바이트 코드 명령어의 주소를 기록하고, 상기 방법은 기본을 수행하고있는 경우,이 카운터 값이 널 (불확정) 인. 이 메모리 영역은 지역 OutOfMemoryError가 Java 가상 머신 스펙의 어떤 상황을 제공하지 유일합니다.

두, 자바 가상 머신 스택

프로그램 카운터와 마찬가지로, 자바 가상 머신 스레드 스택은 비공개 수명주기와 같은 스레드.
자바 메모리 모델 한 방법이 실행 가상 머신 스택은 다음 정보를 저장하는 로컬 변수 테이블 오퍼랜드 스택, 동적 링킹, 방법 수출하는데 사용되는 스택 프레임을 실행하는 동안 각각의 방법은 생성된다. 실행 과정의 완료까지 각 메소드는 스택에 스택에서 가상 머신 스택에 대응하는 스택 프레임 처리라고한다.

우리는 종종 자바 힙 메모리 스택 메모리에, 작업이 조금 거친 이었다는 것을.
여기에 "스택"이제 가상 머신 스택에 대해 얘기하고있다. 또는 가상 머신 스택, 로컬 변수 테이블 섹션.

로컬 변수 테이블 저장 컴파일 알려진 다양한 기본 데이터 타입 ( boolean、byte、char、short、int、float、long、double) 객체 참조 ( refrence类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置) 및 리턴 주소 종류 ( 指向了一条字节码指令的地址).

자바 가상 머신 사양으로,이 지역은 두 가지 이상을 제공합니다 :

스택 StackOverflowError가 예외 발생 가상 머신 허용 깊이 요청한 스레드의 깊이보다 크면;

가상 머신 동적으로 스택 (확장 할 수있는 경우 当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈) 확장, OutOfMemoryError가 발생합니다, 당신은 충분한 메모리에 적용 할 수 없습니다.

셋째, 네이티브 메소드 스택

기본 방법 스택 및 스택 가상 머신의 역할은 그들 사이에 매우 유사하다 의 차이 에 불과 가상 머신 스택 방법 (수행 할 수있는 자바 가상 머신 也就是字节码) 서비스 및 로컬 스택 방법은 기본 서비스하는 방법에 가상 머신을 사용하는 .

언어의 기본 방법 스택 방법에 사용, 데이터 구조가 가상 머신 사양, 특정 가상 시스템에서 필수 및이를 구현하는 것이 무료로하지 않습니다 사용합니다. 심지어 일부 가상 머신은 ( 譬如Sun HotSpot虚拟机) 직접 하나의 네이티브 메소드 스택 및 스택 가상 머신에 넣어.

가상 머신 스택과 마찬가지로, 기본 방법은 StackOverflowError가 스택 및 OutOfMemoryError가 발생합니다.

네, 자바 힙

대부분의 애플리케이션의 경우, Java 힙 메모리는 자바 가상 머신 관리의 가장 큰 조각이다. 메모리 영역에있는 모든 스레드에 의해 공유되는 힙 자바는 때 가상 머신이 시작 만들어집니다. 이 메모리 영역의 유일한 목적은 , 개체 인스턴스를 저장 거의 모든 개체 인스턴스가 메모리를 할당하기 위해 여기에 있습니다. 这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也就渐渐变得不是那么“绝对”了。

자바 힙 가비지 수집기에 의해 관리되는 메인 구역이고, 따라서 종종이라고도 " GC 힙 ."

집 때문에보기의 메모리 복구 지점의 관점에서 기본적으로 사용하는 세대 수집 알고리즘을 자바 있도록 힙은 또한으로 분류 될 수있다 : 새로운 세대와 이전 년, 그리고 작은이 자세히 설명되어 에덴 공간, 생존자 공간에 Surviror에서 공간 등등. 자바 힙의 스레드에 의해 공유 된 뷰의 메모리 할당 포인트의 관점에서 다수의 스레드에 전용으로 할당 된 버퍼로 분할 될 수있다. 그러나 나누어 어떤 경우에 더 목적이 더 나은 메모리 복구, 또는 더 빠른 메모리 할당하는 것입니다 구분에 관계없이 지역, 여전히 저장되는 객체 인스턴스의 컨텐츠의 저장과는 아무 상관이 없습니다.

Java 가상 머신 사양에 따라, 자바 힙은 우리의 디스크 공간과 같은에 한 논리적 연속, 비 연속 물리적 메모리 공간에있을 수있다. 어느 고정 된 크기로 구현 될 수있다 구현할 때, 또한 확장 될 수 있으나, 현재 주류가 가상 머신 확장에 따라 구현된다 ( 通过-Xmx和-Xms控制). 이 힙 메모리 할당에 더 완벽한 예입니다, 스택이 더 이상 확장 할 경우 발생합니다 OutOfMemoryError가의 예외.

다섯째, 메소드 영역

메소드 영역 및 힙 각 인 스레드 공유 메모리 영역에, 그 점포에 사용될 클래스 정보는 상기 가상 머신에로드되고, 상수, 정적 변수, 타임 컴파일러 코드 및 다른 컴파일 데이터. Java 가상 머신 사양 메소드 영역은 힙의 논리적 부분으로 설명하지만, 그가라는 별칭을 가지고 있었다 있지만 비 힙 (heap 이외) , 목적은 Java 힙과 구별되어야한다.

핫스팟 가상 머신 개발자의 습관를 들어, 배포 프로그램 개발자, 많은 사람들이 본질적으로, 두 사람은 동등하지 않은, 단순히 때문에 핫스팟 가상 머신의 디자인 팀 "영구 세대"라는 메소드 영역에 더 기꺼이 GC의 세대 집적 영역이 방법을 확장 또는 핫스팟 가비지 컬렉터는 메모리 관리의 일부로서 이와 같은 Java 힙을 관리 할 수 있도록 방법 만 영구 세대 영역을 달성하기 위해 선택 메모리 관리 방법 영역 특별히 작성된 코드를 생략 할 수있다 일. 다른 가상 머신 (위해 如BEA JRockit、IBM J9等) 존재하지 않는 영구적 인 세대의 개념이다.

원칙적으로,이 지역은 있기 때문에, 안 좋은 아이디어 같다, 어떻게 영구적 인 방법 영역을 달성하기 위해 제약 조건 만 세대없이 가상 머신, 가상 머신 사양의 세부 사항을 구현하는 방법에 속한다 경험 메모리 오버 플로우 문제에 더 많은 가능성이 ( 永久代有-XX:MaxPermSize的上限,J9和JrockIT只要没有触碰到进程可用内存的上限,例如32位系统中的4GB,就不会出现问题) 아주 소수의 방법 (거기에 如String.intern()이 이유 다른 가상 머신에서 다른 표현이 있기 때문에이). 따라서, 핫스팟 가상 머신에 대한 공식 로드맵 발표 한 정보, 그러나에 따라 지금은 영원한 세대를 포기해야 점차적으로의 사용에 의해 대체 기본 메모리 지구 계획 방법을 구현하고, JDK1.7 핫스팟에서, 원래이었다 출시되었습니다 영구 대신 문자열 상수 풀 제거.

방법에 자바 가상 머신 사양 제한은 매우뿐만 아니라, 지역을 완화하고, 자바 힙 메모리와 같은 지속적인 선택과 크기를 고정 또는 확장 될 수뿐만 아니라, 가비지 컬렉션을 구현하지 않도록 선택할 수 있습니다 할 수있다 필요로하지 않는다.

대조적으로,이 영역의 가비지 콜렉션 동작은 비교적 작은 모양이지만, 단지 동일한 이름의 발생 영구 방법과 영역에없는 데이터 "고정"이 존재한다. 쓰레기 수집 대상이 지역은 재활용 및 정수 풀 형식의 하역을 위해 주로 일반적으로, 지역의 상대적으로 불만족, "성과", 하역 특히 클래스의 회복, 조건이 매우 열악한 될 수 있지만,이 지역의이 부분 회복은 참으로 필요하다. BUG 일 기업의 목록에서 심각한 버그의 숫자가 완전히 메모리 누수로 인한이 지역에 복구되지 핫스팟 가상 머신의 낮은 버전으로 인해이 있었다.

Java 가상 머신 사양에서 메모리 할당 영역의 방법은 수요를 충족 할 수없는 경우, 슬로우합니다 OutOfMemoryError가 예외를.

런타임 상수 풀

런타임 상수 풀 인 영역에있어서의 일부 . 클래스 필드, 방법 및 인터페이스 기술 정보뿐만 아니라 일정 풀 정보 이외에 클래스 파일 버전 다양한 문자 컴파일 생성 된 부호를 기억은 ,이 부분은, 클래스를로드 할 종종 풀 볼륨 기억 방법 영역으로 실행합니다.

런타임 상수 풀의 영역에있어서의 일부이기 때문에, 상수 풀 더이상 때 메모리 슬로우 적용 할 수없는 경우에는, 천연 방법은 메모리 영역으로 제한된다 OutOfMemoryError가 된 예외.

직접 메모리

직접 메모리 (직접 메모리)을 실행하고있는 가상 머신의 데이터 영역의 일부가 아니며, 그것은 사양에 정의 된 Java 가상 머신의 메모리 영역입니다. 그러나이 메모리는 자주 사용되며, 우리는 여기에 설명을 함께 넣어, 그래서 또한, OutOfMemoryError가 예외가 발생할 수 있습니다.

JDK 1.4의 도입에 따라 새로 추가 된 NIO (새로운 입력 / 출력) 타입에서 채널 (채널) 및 버퍼 (버퍼) 의 I / O 모드에서, 그 다음, 직접 외부 힙 메모리 할당 네이티브 라이브러리를 사용할 수 있습니다 작동 기준으로서 자바 DirectByteBuffer이 메모리 오브젝트의 스택을 저장함으로써. Java 힙 힙과 기본에 기재된 복제 된 데이터 뒷면을 피하기 위해 이것은 크게 몇 가지 시나리오에서 성능을 향상시킬 수 있습니다.

이 메모리는 계속 될 것입니다 확실히이기 때문에 분명히, 기계가 직접 할당 된 메모리는, Java 힙의 크기에 의해 제한되는 것이 아니라, 기본 총 메모리 ( 包括RAM以及SWAP区或者分页文件)의 크기와 처리 주소 공간 제한. 서버 관리자는 가상 시스템 구성과 같은 실제 메모리 -Xmx 설정 파라미터 정보에 기초하여 파라미터 있지만 접근 각 영역이 물리적 메모리 제한 (의 합보다 크다되도록 직접 메모리를 무시하면 包括物理的和操作系统级的限制OutOfMemoryError가 동적 확장의 결과).

개요

데이터 영역 데이터 유형 특징
첫째, 프로그램 카운터 스레드 개인
두, 자바 가상 머신 스택 로컬 변수 테이블 스택 동작 기, 동적 링크있어서 수출 개수 스레드 개인 자바 가상 머신 (바이트 코드) 서비스의 구현을 위해
지역 변수 테이블 기본 데이터 타입의 오브젝트 레퍼런스 리턴 주소 유형을 컴파일 (어드레스 바이트 코드 명령)
셋째, 네이티브 메소드 스택 스레드 개인 가상 머신 방법 기본 서비스에 사용하는
넷째, 힙 객체 인스턴스 스레드 주 메모리에 만들 때 가장 큰 조각, 가상 머신 시작
다섯째, 메소드 영역 클래스 정보, 상수 등 정적 변수, 컴파일 된 코드를로드 스레드 주 메인 메모리를 회수 힙, 및 클래스의 상수 풀을 하역하기위한 논리 부
런타임 상수 풀 문자 및 기호 참조의 다양한 생성 컴파일 메소드 영역의 일부
직접 메모리 JDK 1.4 새롭게 NIO 합류 기본 함수는 직접 채널에 기반하여 사용될 수 있으며, 버퍼가 기준으로서이 메모리의 힙 DirectByteBuffer 자바 오브젝트에 의해 조작 힙 메모리 밖에 할당 일부 시나리오는 크게 성능을 향상 시키 복사 Java 힙 및 스택 데이터 원주민 사이에 앞뒤로 피하기 위해

추천

출처www.cnblogs.com/ffeiyang/p/12171426.html