>  기사  >  Java  >  Java Virtual Machine 메모리 프로토타입 예제에 대한 자세한 설명

Java Virtual Machine 메모리 프로토타입 예제에 대한 자세한 설명

零下一度
零下一度원래의
2017-07-21 22:04:341257검색

Java 가상 머신 메모리 프로토타입의 6개 부분:

1. 레지스터: 프로그램에서 제어할 수 없습니다.

2. 스택: 기본 유형의 데이터와 객체에 대한 참조를 저장하지만 객체 자체는 스택에 저장되지 않습니다. , 그러나 힙에 저장됨

3. 힙: new

을 사용하여 생성된 데이터를 저장합니다. 4. 정적 도메인: 정적

을 사용하여 개체에 정의된 정적 멤버를 저장합니다. 5. 상수 풀: 상수를 저장합니다.

6. RAM이 아닌 저장소: 하드디스크 등 영구 저장공간

Java Virtual Machine 메모리 프로토타입 예제에 대한 자세한 설명

Java 메모리 할당의 스택

스택의 기본 단위는 프레임(또는 스택 프레임)입니다. Java 스레드가 실행될 때마다 Java 가상 머신은 Java 스택을 할당합니다. 실. 스레드가 특정 Java 메소드를 실행할 때 프레임을 Java 스택에 푸시합니다. 이 프레임은 매개변수, 지역 변수, 피연산자, 중간 연산 결과 등을 저장하는 데 사용됩니다. 이 메서드의 실행이 완료되면 프레임이 스택에서 팝됩니다. 변수가 코드 블록에 정의되면 Java는 변수가 범위를 벗어날 때 변수에 대한 메모리 공간을 스택에 할당합니다. Java는 변수에 할당된 메모리 공간을 자동으로 해제하고 메모리 공간을 즉시 사용할 수 있습니다. 다른 목적으로 사용됩니다. 하지만 작업할 때 다음 사항에 주의해야 합니다.

1. Java 스택의 모든 데이터는 비공개이며 다른 스레드는 이 스레드의 스택 데이터에 액세스할 수 없습니다.

2. 모든 개체가 저장되고 각 개체에는 해당 클래스에 대한 정보가 포함됩니다(클래스의 목적은 작업 지침을 얻는 것입니다). 3. JVM에는 모든 스레드에서 사용되는 하나의 힙 영역(힙)만 있습니다. , 기본 유형 및 객체 참조는 힙에 저장되지 않고 객체 자체와 배열 자체만 저장됩니다.

 栈的基本单位是帧(或栈帧):每当一个java线程运行的时候,java虚拟机会为该线程分配一个java栈。 Java 메모리 할당의 힙

 Java 가상 머신의 힙은 객체와 배열을 저장하는 데 사용됩니다. new로 생성된 배열. 힙에 할당된 메모리는 JVM(Java Virtual Machine)의 자동 가비지 수집 메커니즘에 의해 관리됩니다.

  간단히 말해서 스택에 비해 힙은 주로 Java 객체를 저장하는 데 사용되며, 스택은 주로 객체 참조를 저장하는 데 사용됩니다. 힙에 배열이나 객체가 생성된 후에는 특수 항목을 정의할 수도 있습니다. 스택의 개체 변수, 스택의 이 변수 ​​값이 힙 메모리의 배열 또는 개체의 첫 번째 주소와 같도록 하고 스택의 이 변수는 배열 또는 개체의 참조 변수가 됩니다. 참조 변수는 배열이나 개체에 이름을 지정하는 것과 같습니다. 그런 다음 스택의 참조 변수를 사용하여 프로그램의 힙에 있는 배열이나 개체에 액세스할 수 있습니다. 참조 변수는 배열이나 객체에 이름을 지정하는 것과 같습니다.

Java의 힙은 클래스 객체가 공간을 할당하는 런타임 데이터 영역입니다. 이러한 객체는 new, newaray, anewarray 및 multianewarray와 같은 명령을 통해 생성되며 힙을 명시적으로 해제할 필요가 없습니다. 힙의 장점은 메모리 크기를 동적으로 할당할 수 있다는 점이며 런타임에 메모리를 동적으로 할당하고 Java의 가비지 수집기가 자동으로 더 이상 사용되지 않는 데이터를 수집하므로 수명을 컴파일러에 미리 알릴 필요가 없다는 것입니다. 하지만 단점은 런타임에 메모리를 동적으로 할당해야 하기 때문에 액세스 속도가 느리다는 것입니다.

참고: 동일한 클래스의 개체에는 자체 멤버 메서드가 있으므로 생성된 개체에는 자체 멤버 변수만 포함됩니다. 멤버 변수는 자체 힙에 저장되지만 클래스의 메소드를 공유합니다. 멤버 메소드는 객체가 생성될 때마다 복사되지 않습니다.

보충: Java가 더 많은 메모리를 차지하는 이유

참조 변수는 일반 변수입니다. . , 정의 시 스택에 할당됨, 참조 변수는 프로그램이 해당 범위 외부에서 실행된 후 해제되고, 프로그램이 새 문이 사용되는 코드 블록으로 실행되더라도 배열과 개체 자체는 힙에 할당됩니다. 또한 배열이나 객체 자체가 차지하는 메모리는 해제되지 않습니다. 배열과 객체는 더 이상 사용할 수 없지만 여전히 가비지가 됩니다. 메모리 공간은 가비지 컬렉터에 의해 수집(해제)됩니다. 이것이 Java가 더 많은 메모리를 차지하는 이유입니다. 실제로 Java의 포인터는 힙 메모리의 변수를 가리키는 변수를 참조합니다. 힙보다 속도가 빠르고 레지스터 다음으로 스택 데이터를 공유할 수 있지만, 스택에 저장되는 데이터의 크기와 수명을 결정해야 하고 유연성이 부족하다는 단점이 있습니다. 스택은 주로 몇 가지 기본 유형의 변수(int, short, long, byte, float, double, boolean, char)와 객체 핸들(참조)을 저장합니다.

스택의 매우 중요한 특수 기능은 데이터가 저장된다는 것입니다. 스택은 동시에 공유될 수 있습니다.

 inta=3;

 intb=3;

 컴파일러는 먼저 inta=3을 처리합니다. 먼저 스택에 변수 a에 대한 참조를 생성한 다음 스택에 값 3이 있는지 확인하고 값이 없으면 3을 저장한 다음 a를 가리킵니다. 3. 그런 다음 b의 참조 변수를 생성한 후 intb=3을 처리합니다. 스택에 이미 값 3이 있으므로 b는 직접 3을 가리킵니다. 이런 식으로 a와 b가 동시에 3을 가리키는 상황이 발생합니다.

 이 때 a=4가 다시 설정되면 컴파일러는 스택에 4 값이 있는지 다시 검색합니다. 그렇지 않으면 4를 저장하고 이미 존재하는 경우 4를 가리킵니다. 이 주소를 직접 가리킵니다. 따라서 a 값의 변화는 b 값에 ​​영향을 미치지 않습니다.

이러한 종류의 데이터 공유는 두 개체의 참조가 동시에 하나의 개체를 가리키는 공유와 다르다는 점에 유의해야 합니다. 이 경우 a의 수정은 b에 영향을 미치지 않기 때문입니다. 컴파일러는 공간을 절약하는 데 도움이 됩니다. 개체 참조 변수가 개체의 내부 상태를 수정하면 다른 개체 참조 변수에 영향을 미칩니다.

 상수 풀(constantpool)

Java Virtual Machine 메모리 프로토타입 예제에 대한 자세한 설명

  상수 풀은 컴파일 과정에서 결정되어 컴파일된 .class 파일에 저장되는 일부 데이터를 말합니다. 코드에 정의된 다양한 기본 유형(예: int, long 등)과 객체 유형(예: 문자열 및 배열)이 포함된 상수 값(최종) 외에도 텍스트 형식의 일부 기호 참조도 포함되어 있습니다. , 예:

 1, 클래스 및 인터페이스의 정규화된 이름

 2. 필드 이름 및 설명자

 3. 메서드, 이름 및 설명자.

 가상 머신은 로드된 각 유형에 대해 상수 풀을 유지해야 합니다. 문자열 상수의 경우 해당 값은 상수 풀에 있습니다. 상수 풀은 직접 상수(문자열, 정수 및 부동 소수점 상수)와 다른 유형, 필드 및 메소드에 대한 기호 참조를 포함하여 이 유형에서 사용되는 순서화된 상수 세트입니다. JVM의 상수 풀은 메모리에 테이블 형식으로 존재합니다. 문자열 유형의 경우 리터럴 문자열 값을 저장하는 데 사용되는 고정 길이 CONSTANT_String_info 테이블이 있습니다. 참고: 이 테이블은 기호가 아닌 리터럴 문자열 값만 저장합니다. .

위 내용은 Java Virtual Machine 메모리 프로토타입 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.