자바 학습 (4) - 메모리 배분 에 대한 분석

머리말
  • 자바 에는 많은 유형의 변수, 정적 변수, 전역 변수 와 대상 등 이 있 는데 이런 변 수 는 자바 가 실 행 될 때 도대체 어떻게 메모 리 를 분배 합 니까?다음은 이에 대한 탐구 가 필요 하 다.
  • 기본 지식 개념:
    (1)   :      ,             ,          
    (2) :                 ,           ,      (new      )      (              。)
        【1】      ,     ,               ;
        【2】     ,       ,      ,       ;
        【3】    ,                   ,     .
    (3) :    new     。
        【1】 java            (   ,    )。
        【2】       , java              。
        【3】                ,             ,              ;
        【4】   ,           ,      。
    (4)   :      (static   )
    (5)   :              (public static final)。
    (6) RAM  :         
  • 먼저 알 아야 할 것 은 자바 프로그램 이 JVM (Java Virtual Machine, Java 가상 머 신) 에서 실행 되 고 JVM 을 자바 프로그램 과 운영 체제 간 의 다리 로 이해 할 수 있 으 며 JVM 은 자바 의 플랫폼 무관 성 을 실현 하여 JVM 의 중요성 을 알 수 있다.
  • 그러므로 자바 메모리 분배 원 리 를 배 울 때 이 모든 것 이 JVM 에서 진행 되 고 JVM 은 메모리 분배 원리 의 기초 와 전제 임 을 명심 해 야 한다.

  • 자바 프로그램 실행 과정 과 관련 된 메모리 영역:
  • 레지스터: JVM 내부 가상 레지스터 는 액세스 속도 가 매우 빠 르 고 프로그램 이 제어 할 수 없습니다.
  • 스 택: 부분 변 수 를 저장 하 는 값 은 다음 과 같 습 니 다.
    (1)            ;
    (2)      ,        (  )。              。
  • 더미: 동적 으로 발생 하 는 데 이 터 를 저장 하 는 데 사용 합 니 다. 예 를 들 어 new 에서 나 온 대상 입 니 다.주의:
    (1)                   ,        。
    (2)                  ,        ,           ,                    。
  • 상수 탱크: 상수 탱크 는 더미 에 존재 합 니 다.
    (1)JVM                ;
    (2)                     。
    (3)      (    ,String)      、  、       。
    (4)                。
    (5)                    、  、       ,      Java            。
  • 코드 세그먼트: 하 드 디스크 에서 읽 은 소스 코드 를 저장 합 니 다.
  • 데이터 세그먼트: static 정의 정적 구성원 을 저장 합 니 다.
  • 메모리 그림:
  • 실례 상세 더미 와 창고 의 메모리 분배
  • 비고:
    (1)  Java  ,   main    ,         Java  ,        。
    (2)                   (    ),         ,          。
    (3)                       ,                     ,      ,                 。
    (4)  ,                ,                    。
  • 참조 코드 예시:
  • 메모리 할당 분석 1:
    (1)JVM    main  ,       ,    Test    ,         ,             110925
    (2)    int     date,       ,       date    9
    (3)    BirthDate    d1、d2,             ,       。                  ,            
  • 메모리 분배 분석 2:
    (1)  test   change1  ,   date   。JVM       ,   i     ,         ,    date    i
  • 메모리 분배 분석 3:
    (1) 1234  i。      。
  • 메모리 분배 분석 4:
    (1) change1      ,        i       。
  • 메모리 분배 분석 5:
    (1)  test   change2  ,   d1   。
    (2)JVM   change2    b       ,       
    (3)          ,  b     d1    ,  b d1          。
    (4) b d1        。
  • 메모리 분배 분석 6:
    (1)change2          BirthDate  ,    b。
    (2)        :   new     ,               b    ,    b      d1      ,    d1          ,     d1      。
  • 메모리 분배 분석 7:
    (1)change2      ,          b      ;
    (2)          ,          。
  • 메모리 분배 분석 8:
    (1)  test   change3  ,   d2   。
    (2)  ,JVM           b    ,   d2       b ,  d2 b       。     b setDay  ,      d2      setDay  。
    (3)    b setDay     d2,             。
  • 메모리 분배 분석 9:
    (1)change3      ,          b。
  • 더미 와 창고 의 작은 매듭
  • 이상 은 자바 프로그램 이 실 행 될 때 메모리 분배 의 대략적인 상황 이다.
  • 사실 아무것도 아니 야. 사상 을 파악 하면 간단 해.두 가지 유형의 변수: 기본 유형 과 인용 유형.
  • 두 사람 은 부분 변수 로 서 모두 스 택 에 두 고 기본 유형 은 스 택 에 값 을 저장 합 니 다. 인용 유형 은 하나의 가리 키 는 포인터 만 저장 하고 진정한 대상 은 쌓 여 있 습 니 다.매개 변수 로 서 기본 형식 은 직접 값 을 전달 하고 형식 전송 지침 을 참조 합 니 다.
  • 실례 가 무엇 인지, 대상 이 무엇 인지 분간 한다.Class a= new Class();이때 a 는 실례 라 고 하지만 a 는 대상 이 라 고 할 수 없다.인 스 턴 스 는 스 택 에 있 고 대상 은 쌓 여 있 으 며 인 스 턴 스 는 실제 적 으로 인 스 턴 스 지침 을 통 해 간접 적 으로 작업 대상 입 니 다.여러 개의 실례 가 같은 대상 을 가리 킬 수 있다.
  • 스 택 의 데이터 와 쌓 인 데이터 의 소각 은 동기 화 되 지 않 습 니 다.방법 이 일단 끝나 면 창고 의 국부 변 수 는 즉시 소각 되 지만, 쌓 인 대상 이 반드시 소각 되 는 것 은 아니다.다른 변수 도 이 대상 을 가리 킬 수 있 기 때문에 스 택 에 변수 가 쌓 여 있 는 대상 을 가리 키 지 않 을 때 까지 소각 할 수 있 습 니 다. 그리고 바로 소각 하 는 것 이 아니 라 쓰레기 회수 스 캔 을 할 때 까지 기 다 려 야 소각 할 수 있 습 니 다.
  • 이상 의 스 택, 쌓 기, 코드 세그먼트, 데이터 세그먼트 등 은 모두 응용 프로그램 에 비해.
  • 모든 응용 프로그램 은 유일한 JVM 인 스 턴 스 에 대응 하고 모든 JVM 인 스 턴 스 는 자신의 메모리 영역 이 있 으 며 서로 영향 을 주지 않 습 니 다.그리고 이 메모리 영역 은 모든 스 레 드 가 공유 합 니 다.여기 서 언급 한 스 택 과 더 미 는 모두 전체적인 개념 으로 이 스 택 들 은 세분 화 할 수 있다.
  • 류 의 구성원 변 수 는 서로 다른 대상 에서 각각 다 르 고 자신의 저장 공간 (구성원 변 수 는 쌓 인 대상 에 있다) 이 있다.
  • 클래스 의 방법 은 이 클래스 의 모든 대상 이 공유 하 는 것 입 니 다. 한 세트 만 있 습 니 다. 대상 이 사용 하 는 방법 은 스 택 에 눌 려 있 고 방법 을 사용 하지 않 으 면 메모 리 를 사용 하지 않 습 니 다.

  • 인 스 턴 스 상수 탱크 의 메모리 할당
  • 예비 지식:
    (1)             。
    (2)     :byte、short、int、char、long、boolean
    (3)        :Byte、Short、Integer、Character、Long、Boolean。       。
    (4)     :               ,          ,           。(5)               :         ,              。
    (6)                   ,                 。
    (7)  ,String           。
  • 참조 코드 예시:
    public class test{
       public static void main(String[] args){
           objPoolTest();
       }
       
       public static void objPoolTest(){
           int i = 40;
           int i0 = 40;
           Integer i1 = 40;
           Integer i2 = 40;
           Integer i3 = 0;
           Integer i4 = new Integer(40);
           Integer i5 = new Integer(40);
           Integer i6 = new Integer(0);
           Double d1 = 1.0;
           Double d2 = 1.0;
           
           System.out.println("i=i0\t" + (i == i0));
           System.out.println("i1=i2\t" + (i1 == i2));  
           System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));  
           System.out.println("i4=i5\t" + (i4 == i5));  
           System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));      
           System.out.println("d1=d2\t" + (d1==d2));   
             
           System.out.println();
       }
    }
  • 결과:
    i=i0    true  
    i1=i2   true  
    i1=i2+i3        true  
    i4=i5   false  
    i4=i5+i6        true  
    d1=d2   false 
  • 결과 분석:
    (1)i i0      (int)   ,           ,           :         。      int i = 40;,   int i0 = 40;             40    ,   ,i0     i 40,         40。
    (2)i1 i2      ,       ,  Integer    。  Integer            ,  i1、i2 40          ,        ,  i1=12。
    (3)           ,Java             ,Java    i1、i2           ,  i1      i2+i3。
    (4)i4 i5       ,       ,  Integer    。          new   ,            ,       new    ,             ,  i4 i5   ,          ,       。
    (5)         , 3  。
    (6)d1 d2      ,       ,  Double    。 Double            ,  Double d1=1.0;   Double d1=new Double(1.0);,   new    ,d2  。  d1 d2       ,       ,     。
  • 상수 탱크 소결
  • 상기 에서 언급 한 기본 유형 포장 류 는 모두 상수 탱크 기술 을 실 현 했 지만 이들 이 유지 하 는 상수 는 [- 128 ~ 127] 이 범위 안의 상수 에 불과 하 다.
  • 상수 치가 이 범 위 를 초과 하면 더미 에서 대상 을 만 들 고 상수 탱크 에서 가 져 오지 않 습 니 다.
  • String 유형 도 상수 탱크 기술 을 실 현 했 지만 조금 다르다.
  • String 형식 은 상수 탱크 에 해당 하 는 문자열 이 있 는 지 먼저 검사 하고 있 으 면 꺼 냅 니 다.없 으 면 현재 것 을 추가 합 니 다.

  • 참고 문장
    https://blog.csdn.net/scliu12...

    좋은 웹페이지 즐겨찾기