자바 대상 메모리 점용 현황 분석

3937 단어 자바
하나의 대상 인 스 턴 스 가 몇 바이트 를 차지 하고 메모리 가 얼마나 소모 되 었 습 니까?이러한 문 제 는 c 또는 c + + 에서 sizeof () 방법 을 사용 하면 명확 한 답 을 얻 을 수 있 습 니 다. 자바 에 서 는 이러한 방법 (자바 처럼 실현 가능) 이 없 는 것 같 지만 jmap 도 구 를 통 해 한 대상 의 메모리 점용 크기 를 알 수 있 습 니 다. 자바 코드 를 통 해 메모리 사용 상황 을 계산 하 는 방법 을 소개 합 니 다.
주의 하 세 요. 토론 의 상황 은 모두 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
 

좋은 웹페이지 즐겨찾기