자바 대상 메모리 점용 현황 분석
3937 단어 자바
주의 하 세 요. 토론 의 상황 은 모두 32 비트 컴퓨터 를 바탕 으로 64 비트 컴퓨터 를 사용 하지 않 습 니 다. JVM 은 sun 의 HotSpot 이 므 로 서로 다른 가상 컴퓨터 의 실현 이 다 를 수 있 습 니 다.
규칙 1: 대상 마다 8bytes 입도 에 따라 정렬 (배열 제외)
jvm 에서 모든 대상 (배열 제외) 은 머리 가 하나 있 습 니 다. 이 머리 는 두 글자 가 있 습 니 다. 첫 번 째 글자 가 저 장 될 때 대상 의 표지 위치 정보, 예 를 들 어 잠 금 표지 위치, 몇 번 의 gc 등 정 보 를 겪 었 습 니 다. 두 번 째 글 자 는 하나의 인용 으로 이런 유형의 정 보 를 가 리 킵 니 다.여기 jvm 은 이 두 글자 에 8 개의 바이트 공간 을 남 겼 다.
규칙 1: new Object ();이 Object 인 스 턴 스 는 8 개의 바이트 만 차지 합 니 다.
규칙 2: 클래스 속성 에 저장 공간 을 분배 할 때 클래스 에서 정 의 된 속성 순서 가 아니 라 다음 과 같은 순서 로 합 니 다.
1、double\long;----8bytes
2、int\float;----4bytes
3、char\short;----2bytes
4、boolean\byte;----1bytes
5、reference;----4bytes
예 를 들 면:
public class A {
byte a;
char b;
int c;
long d;
Object e;
}
속성
필요 바이트 수
누적 바이트 수
header
8bytes
8
long:d
8bytes
16
int:c
4bytes
20
char:b
2bytes
22
byte:a
1bytes
23
Object:e
4bytes
27
padding 5bytes
32
마지막 줄 padding 5bytes 의 목적 은 규칙 1 에서 각 대상 이 8 바이트 의 입도 에 따라 정렬 하 는 것 을 묘사 하 는 것 이다. 그러면 다음 분배 대상 의 시작 위 치 는 8 의 배수 에 있어 야 하고 27 에서 가장 가 까 운 8 의 배 수 는 32 이기 때문에 5bytes 를 추가 하 는 것 이다.A 점용 32bytes
이 계산 이 정확 한 지 jmap 로 확인 할 수 있 습 니 다.
규칙 3: 계승 시 규칙 2 에 따라 부류 의 클래스 속성 점용 상황 을 계산 한 다음 에 규칙 2 에 따라 부류 의 클래스 속성 점용 상황 을 계산 하고 부류 와 부류 의 속성 을 혼합 하여 규칙 2 에 따라 분배 할 수 없다.
예 를 들 면:
class B{
long a;
int b;
int c;
}
class BB extends B{
long d;
}
속성
점용 바이트 수
누적 바이트 수
header
8
8
a
8
16
b
4
20
c
4
24
d
8
32
여기 서 누적 바이트 가 8 의 배수 로 규칙 1 을 만족 시 키 기 때문에 padding 바이트 가 필요 하지 않 습 니 다.BB 개체 메모리 가 32bytes 를 차지 합 니 다.
규칙 4: 부모 클래스 의 마지막 속성 과 하위 클래스 의 첫 번 째 속성 은 4 바이트 의 배수 에 따라 정렬 해 야 합 니 다.
예 를 들 면:
class B{
long a;
int b;
char c;
}
class BB extends B{
long d;
}
속성
점용 바이트
누적 바이트
head
8
8
a
8
16
c
2
18
padding 2
20
d
8
28
padding 4
32
첫 번 째 padding 2 는 속성 c 가 메모 리 를 분배 한 후 부모 클래스 의 마지막 속성 과 하위 클래스 의 첫 번 째 속성 이 4 바이트 입도 로 정렬 되 지 않 기 때문에 4 바이트 입도 로 정렬 할 수 있 도록 두 개의 바이트 를 추가 해 야 합 니 다.
두 번 째 paadding 4 는 규칙 1 에 따른다.
규칙 5: 하위 클래스 의 첫 번 째 속성 은 double 또는 long 이지 만 부모 클래스 가 8 바이트 입도 로 정렬 할 수 없 을 때 하위 메모리 가 분 배 될 때의 순 서 는 규칙 2 에 따라 진행 되 지 않 고 먼저 int \ float, char \ short, boolean \ byte, reference, log \ double 로 진 행 됩 니 다.
예 를 들 면:
class A{
byte a;
}
class B extends A{
long b;
short c;
byte d;
}
속성
점용 바이트 수
누적 점용 바이트 수
head
8
8
a
1
9
padding 3
12
c
2
14
d
1
15
padding 1
16
b
8
24
첫 번 째 패 딩 3 은 룰 에 따라 4.
두 번 째 padding 1 은 b 속성 이 8 개의 바이트 이기 때문에 8 개의 바이트 입도 에 따라 정렬 해 야 합 니 다.B 점 용 24bytes
배열 에 대해 서 는 일반 대상 과 달리 머리 에 4 개의 바이트 가 더 있어 길이 정 보 를 저장 하 는 데 사용 된다.그래서 배열 의 head 는 8bytes 가 아니 라 12bytes 이다.
구체 적 인 내용 은 원문 을 볼 수 있다.http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.