클래스 실행중인 프로세스의 메모리 분석

이는 스택 주로 변수 객체 참조의 기본 유형을 저장하는데 사용되는 것을 특징으로하는 Java 가상 머신 스택, 힙, 메소드 영역 세 영역으로 분할 될 수 주기억 스택 클래스 인스턴스, 메소드 영역 정적 변수, 정적 메소드 상수 풀을 저장하기.

1 개 스택 기능

(1) 메모리 스택 모델을 실행하는 방법을 설명하는데 사용된다. 각 방법은 스택 프레임 생성 (수출, 피연산자 로컬 변수 저장)된다라고;

(2)이 JVM은 스레드 (실제 파라미터 로컬 변수 등)하는 방법을 수행하기위한 정보를 저장하기위한 각각의 스택 스레드를 생성한다;

(3)은 스레드 스택 사설 공유 할 수 속한다;

(4) 상기 저장 스택, FIFO 특성;

(5)는 자동 시스템에 의해 적층 빠른 할당되고, 스택은 연속 된 메모리 공간이고;

 

2 개 스택 기능

(1) 오브젝트 생성 및 배열을 저장하는 스택;

(2) JVM은 모든 스레드에 의해 공유 된 경우에만 힙입니다;

(3) 적층은 인접한 메모리 공간 유연한 할당 느린 아니다;

 

방법 3 영역

(1) JVM은 모든 스레드에 의해 공유되는 한 방향으로 만 영역입니다;

클래스 정보 관련 상수를 저장하는 (2) 방법 실제로 힙 영역;

(3) 프로그램 스택이 내용은 클래스 정보, 정적 변수, 정적 인 방법, 문자열 상수로서, 결코 변경 저장하는 데 사용된다;

 

프로세스에게 메모리 분석의 네 가지 유형을 실행

클래스 (1) 예를

패키지 cn.latiny.normal; 

/ ** 
 * @author Latiny 
 * @version 1.0 
 * @description : 인간 
 *의 @date 2019년 8월 2일 11:25 
 * / 
공용  클래스 HumanDemo { 

    공공  정적  무효 메인 (문자열 []에 args) 발생 예외 { 
        거리 거리 = 새로운 거리(); 
        street.setName ( "中华路" ); 
        street.setNumber ( 10000 ); 
        위치 위치 = 새로운 위치 ( "广东", "佛山" , 거리); 
        인간의 인간= 새로운 인간 (); 
        human.setName ( "Latiny" ); 
        human.setAge ( 99 ); 
        human.setLocation (위치); 
        에서 System.out.println (인간); 
    } 

} 

클래스 휴 매나 { 

    개인 문자열 이름;
    개인  INT의 시대;
    개인 위치 위치; 

    공공 문자열 getName () {
         반환 이름; 
    } 

    공공  무효 에서는 setName (문자열 이름) {
          .name을 = 이름; 
    } 

    공공  INTgetAge는 () {
         반환 시대; 
    } 

    공공  무효 setAge ( INT의 연령) {
          .age = 나이; 
    } 

    공공 장소의 getLocation () {
         반환 위치; 
    } 

    공공  공극 에서 setLocation (위치 위치) {
          .location = 위치; 
    } 

    @Override 
    공공 문자열 toString () {
         반환 "인간 {"+ 
                "이름 = '"+ 이름 +'\ ''+ 
                ", 연령 ="+ 나이 + ; 
                "위치 ="
                '}' 
    } 
} 

클래스 Locationa { 

    개인 문자열 지방;
    개인 문자열 도시;
    개인 거리 거리; 

    공공 Locationa (문자열 지방, 문자열 도시, 거리 거리) {
          .province = 지방;
         .city = 도시;
         .street = 거리; 
    } 

    공공 문자열 getProvince는 () {
         반환 지방을; 
    } 

    공공  무효 setProvince (문자열 지방) {
          .province = 지방;
    }

     공공 문자열 getCity는 () {
         반환 도시를; 
    } 

    공공  무효 setCity (문자열 도시) {
          .city = 도시; 
    } 

    공공 스트리트 getStreet () {
         반환 거리; 
    } 

    공공  무효 setStreet (거리 거리) {
          .street = 거리; 
    } 

    @Override 
    공공 문자열 toString () {
         반환 "위치 {"+ 
                "지방 = '"+ 지방 +'\ ''+ 
                ', 도시 =' "+ 도시 + '\' '+
                "거리 ="+ 거리 + 
                '}' ;
    } 
} 

클래스 Streeta { 

    문자열 이름; 
    INT 번호; 

    공공 문자열 getName () {
         반환 이름; 
    } 

    공공  무효 에서는 setName (문자열 이름) {
          .name을 = 이름; 
    } 

    공공  INT getNumber () {
         반환 번호; 
    } 

    공공  공극 setNumber ( INT의 번호) {
          .number = 번호; 
    } 

    @Override 
    공공 문자열 toString을 () {
         반환"거리 {"+ 
                "이름 = '"+ 이름 +'\ ''+ 
                '숫자 = "+ 수 + 
                '} ' ; 
    } 
}
코드보기

 

프로세스 클래스 런타임 (2) 분석

1) 메인 메소드 HumanDemo 클래스 시스템은 우리로부터 명령을 수신하고 실행하는 Java 가상 머신 프로세스를 시작;

다음 클래스 경로로부터 이진 데이터의 파일을 판독) 컴파일한다 후 발견되지 않은 경우 2) 프로세스 제 (HumanDemo.class 파일을 찾을; HumanDemo을 메소드 영역 클래스 런타임 데이터 영역에 저장되는 정보의 종류를 정적 메소드 정적 변수, 상수 ( "중국 도로", "광"은, "불이", "Latiny")는 메소드 영역, 클래스 로딩 프로세스로 알려진 프로세스에로드되는 동안;

명령의 실행을 시작 바이트 코드 3) Java 가상 머신 Main 메서드 대상 지역 HumanDemo 클래스 () 메소드;

4)) (메인 메소드 스택 프레임 스택을 열어, 코드의 구현 :

거리 거리 = 새로운 거리 ();

자바 가상 머신 인스턴스 거리 만들기, 거리 참조 변수는이 예를 들어, 겉으로는 간단한 코드를 인용하지만, 기본 JVM 추적 우리는 이것을 수행하는 방법에 있는지 여부를 확인하기 위해, 자바 가상 머신을 살펴 보자, 많은 일을했다 작업 :

, 방법의 결과가 지구 아직 거리 클래스 정보, 어떻게 할되지 않은 순간 볼은 정보 스트리트 클래스의 유형을 찾아야 ① 자바 가상 머신의 지시 거리에 따라 인스턴스를 작성해야합니다, 그래서 그는 바로 존 방법을 갔다? Java 가상 머신은 거리 클래스 스트리트 클래스 메소드 지구에 저장된 정보의 유형을로드합니다.

② 거리 클래스가 발견, 그것을 작동하기 시작했다 다음. Java 가상 머신이 먼저 힙 거리의 새로운 인스턴스를 생성 스트리트 참조의 거리 클래스 메소드 영역 점을 들고 이러한 유형의 정보. 참고 실제로, 여기에 언급 된 C 언어 포인터 다소 유사 메모리 주소의 거리 클래스 메소드 영역에서 정보의 유형을 의미하며,이 주소는, 거리의 예에서 데이터 영역을 저장합니다.

③ Java 가상 머신 과정에서 각 스레드가 메소드 호출의 일련의 실행 스레드를 추적하는 메소드 호출 스택이있을 것이다, 각 요소의 스택은 스레드가 메소드를 호출 할 때마다 스택 프레임을 호출 시간 프레임은 새로운 방법 스택으로 푸시한다. 여기서, 프레임 메모리 동작 중에 파라미터, 로컬 변수 및 임시 데이터를 처리한다. 의 "="거리가 main () 메소드에 정의 된 변수 전에, 우리는 로컬 변수를 참조 할 수 있으므로이 자바 메소드 호출 스택의 메인 쓰레드의 main () 메소드의 구현에 추가된다. 는 "="예를 가리 킵니다 Street 지역 거리 힙이 변수, 즉,이 경우 거리에 대한 참조 점을 보유하고 있습니다.

 다음과 같이 구현 프로세스 전반에 걸쳐 있습니다 :

 

5)이 과정은 두 개의 코드 실행을 다음과

street.setName ( "중국 길" ); 
street.setNumber ( 10000);

"중국어 길"정수 풀 영역의 방법에 관한 이름

지정 번호 10000

 

 다음과 같이 6)이 코드 JVM은 많은 일을 할 수 :

Location location = new Location("广东", "佛山", street);

 

① 加载Location类到方法区;

② 在堆内存中为Location 创建一个新对象,这个对象有指向方法区Location类的引用;

③ main方法栈帧中添加location 局部变量,并指向步骤二创建的对象(保存堆中的实例地址);

④ 给location 对象成员变量赋值,province指向常量池的"广东",city 指向 "深圳",street 指向前面创建的Street对象;

 

 7)这段代码JVM执行过程与之前类似不再详细描述,具体如下图:

Human human = new Human();
human.setName("Latiny");
human.setAge(99);
human.setLocation(location);

 

 

추천

출처www.cnblogs.com/Latiny/p/11307550.html