Java 메모리 프로토타입 분석

3588 단어 java 메모리
java 가상 컴퓨터 메모리 원형
레지스터: 프로그램에서 제어할 수 없습니다
창고: 기본 형식의 데이터와 대상의 인용을 저장하지만 대상 자체는 창고에 저장하지 않고 더미에 저장합니다
더미: new로 생성된 데이터 저장
정적 영역: 대상에 static로 정의된 정적 구성원을 저장합니다
상수 풀:상수 저장
비 RAM 스토리지: 하드 드라이브와 같은 영구 저장 공간
Java 메모리 할당의 스택
창고의 기본 단위는 프레임(또는 창고 프레임)입니다. 자바 라인이 실행될 때마다 자바 가상 기회는 이 라인에 자바 창고를 분배합니다.이 라인은 어떤 자바 방법을 실행할 때 자바 창고에 하나의 프레임을 압축한다. 이 프레임은 매개 변수, 국부 변수, 조작수, 중간 연산 결과 등을 저장하는 데 사용된다.이 방법이 실행되었을 때, 프레임은 창고에서 팝업됩니다.자바 창고의 모든 데이터는 개인입니다. 다른 라인에서는 이 라인의 창고 데이터를 사용할 수 없습니다.
함수에 정의된 일부 기본 형식의 변수 데이터와 대상의 인용 변수는 함수의 창고 메모리에 분배됩니다.
코드 블록에서 변수를 정의할 때 자바는 창고에서 이 변수에 메모리 공간을 분배합니다. 이 변수가 이 역할 영역을 종료하면 자바는 자동으로 이 변수에 분배된 메모리 공간을 방출합니다. 이 메모리 공간은 즉시 다른 용도로 사용할 수 있습니다.
Java 메모리 할당 중의 더미
java 가상 머신의 더미는 new에서 만든 대상과 그룹을 저장하는 데 사용됩니다.더미에 분배된 메모리는 자바 가상기의 자동 쓰레기 회수 메커니즘으로 더미의 메모리를 관리한다.
간단하게 말하면 창고와 상대적으로 더미는 주로 자바 대상을 저장하는 데 사용되고 창고는 주로 저장 대상이 인용하는 데 사용된다.더미에 하나의 수조나 대상이 생긴 후에 창고에 특수한 변수를 정의할 수 있다. 창고에 있는 이 변수의 수치는 수조나 대상이 더미 메모리에 있는 첫 번째 주소와 같고 창고에 있는 이 변수는 수조나 대상의 인용 변수가 된다.인용 변수는 수조나 대상에 대한 이름과 같으며, 나중에 프로그램에서 창고의 인용 변수를 사용하여 더미의 수조나 대상에 접근할 수 있다.인용 변수는 수조나 대상을 위한 명칭에 해당한다.
인용 변수는 일반적인 변수로 정의할 때 창고에 분배되며 인용 변수는 프로그램이 역할 영역 밖으로 실행된 후에 방출됩니다.한편, 수조와 대상 자체는 무더기에서 분배된다. 프로그램이 new를 사용하여 수조나 대상을 만드는 문장이 있는 코드 블록을 실행하더라도 수조와 대상 자체가 차지하는 메모리는 방출되지 않는다. 수조와 대상은 인용 변수가 그것을 가리키지 않을 때 쓰레기가 되어 사용할 수 없지만 메모리 공간을 차지하고 놓지 않는다.뒤이어 불확실한 시간에 쓰레기 수거기에서 수거되었다.Java가 메모리를 차지하는 이유이기도 합니다.
실제로 창고의 변수는 메모리의 변수를 가리킨다. 이것이 바로 자바의 바늘이다.
Java 더미는 런타임 데이터 영역입니다.종류의(대상은 그 중에서 공간을 분배한다. 이 대상들은 new, newarray, anewarray, multianewarray 등 명령을 통해 만들어진다. 프로그램 코드가 필요하지 않게 표시된다. 더미는 쓰레기 수거로 책임을 진다. 더미의 장점은 메모리 크기를 동적으로 분배할 수 있고, 생존 기간도 컴파일러에게 미리 알려줄 필요가 없다. 실행할 때 메모리를 동적으로 분배하기 때문에 자바의 쓰레기 수집기는 더 이상 사용하지 않는 데이터를 자동으로 수거한다..그러나 실행할 때 메모리를 동적 분배해야 하기 때문에 접근 속도가 느리다는 단점이 있다.
창고의 장점은 저장 속도가 더미보다 빠르고 레지스터에 버금가며 창고 데이터를 공유할 수 있다는 것이다.그러나 단점은 창고에 존재하는 데이터의 크기와 생존 기간이 확실해야 하며 유연성이 부족하다는 것이다.창고에는 기본 형식의 변수 데이터 (int,short,long,byte,float,double,boolean,char) 와 대상 핸들 (인용) 이 저장되어 있습니다.
창고는 창고에 존재하는 데이터를 공유할 수 있는 매우 중요한 특수성을 가지고 있다.만약 우리가 동시에 정의한다면:

 
  1. int a=3;
  2. int b=3

컴파일러가 int a = 3을 먼저 처리합니다.우선 창고에 변수가 a인 인용을 만들고 창고에 3이라는 값이 있는지 확인합니다. 찾지 못하면 3을 저장하고 a를 3을 가리킵니다.이어서 int b = 3 처리하기;b의 인용 변수를 만든 후 창고에 3이라는 값이 있기 때문에 b를 3으로 직접 가리킵니다.이렇게 하면 a와 b가 동시에 3을 가리키는 상황이 나타난다.
이때 만약에 a=4를 더 부르면그러면 컴파일러는 창고에 4값이 있는지 다시 검색하고 없으면 4를 저장하고 a가 4를 가리키도록 한다.만약 이미 있다면, 직접 a를 이 주소로 가리킨다.따라서 a값의 변화는 b값에 영향을 주지 않는다.
이런 데이터의 공유와 두 대상의 인용이 동시에 한 대상을 가리키는 이런 공유는 다르다는 것을 주의해야 한다. 왜냐하면 이런 경우 a의 수정은 b에 영향을 주지 않기 때문에 컴파일러가 완성한 것이기 때문에 공간을 절약하는 데 유리하다.한 대상 인용 변수가 이 대상의 내부 상태를 수정하면 다른 대상 인용 변수에 영향을 줄 수 있다.
상수 풀
상수지는 컴파일링 기간이 정해져 컴파일된 것에 저장되는 것을 말한다.class 파일의 일부 데이터입니다.코드에 정의된 다양한 기본 유형(예를 들어 int, long 등)과 대상형(예를 들어 String 및 그룹)의 상수값(final)을 포함하는 것 외에 텍스트 형식으로 나타나는 기호 인용도 포함한다. 예를 들어 다음과 같다.
1. 클래스와 인터페이스의 전한정명;
2. 필드의 이름과 설명자;
3. 방법 및 이름 및 설명자입니다.
가상 시스템은 마운트된 유형마다 상수 풀을 유지해야 합니다.상량 탱크는 이 유형이 사용하는 상량의 질서정연한 집합이다. 직접 상량 (string, integer,floating point 상량) 과 다른 유형, 필드, 방법에 대한 기호 인용을 포함한다.
String 상수에 대한 값은 상수 풀에 있습니다.JVM의 상수 풀은 메모리에 표 형식으로 존재하고 String 유형에 대해 고정된 길이의 CONSTANTString_info표는 문자열 값을 저장하는 데 사용됩니다. 주의: 이 표는 문자열 값만 저장하고 기호 인용은 저장하지 않습니다.여기까지 말하자면 상량 탱크의 문자열 값의 저장 위치에 대해 비교적 명확하게 이해해야 한다.
프로그램이 실행될 때 상수 풀은 무더기가 아닌 Method Area에 저장됩니다.

좋은 웹페이지 즐겨찾기