자바 가상 컴퓨터 의 더미 와 스 택
5942 단어 JVM
자바 의 더 미 는 실행 중인 데이터 영역 으로 클래스 의 대상 이 공간 을 분배 합 니 다.이 대상 들 은 new,new array,anewarray,multianewarray 등 명령 을 통 해 만 들 어 졌 으 며 프로그램 코드 로 표시 할 필요 가 없습니다.더 미 는 쓰레기 회수 로 책임 집 니 다.더 미 는 메모리 크기 를 동적 으로 분배 할 수 있 고 생존 기간 도 컴 파일 러 에 게 미리 알려 주지 않 아 도 됩 니 다.실행 할 때 동적 으로 메모 리 를 분배 하기 때문에 자바 의 쓰레기 수집 기 는 더 이상 사용 하지 않 는 데 이 터 를 자동 으로 받 습 니 다.그러나 실행 할 때 동적 으로 메모 리 를 분배 해 야 하기 때문에 액세스 속도 가 느 린 것 이 단점 이다.스 택 의 장점 은 액세스 속도 가 쌓 이 는 것 보다 빠 르 고 레지스터 에 버 금 가 며 스 택 데 이 터 를 공유 할 수 있다 는 것 이다.그러나 스 택 에 존재 하 는 데이터 크기 와 생존 기간 은 반드시 확정 되 고 유연성 이 부족 하 다 는 것 이 단점 이다.스 택 에는 기본 형식의 변수(int,short,long,byte,float,double,boolean,char)와 대상 참조 가 저장 되 어 있 습 니 다.
스 택 은 매우 중요 한 특수성 이 있 는데 바로 스 택 에 존재 하 는 데 이 터 를 공유 할 수 있다 는 것 이다.만약 우리 가 동시에 정의 한다 면:int a=3;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 에 영향 을 주지 않 고 컴 파일 러 에 의 해 이 루어 지 며 공간 을 절약 하 는 데 유리 하기 때문이다.한 대상 의 인용 변 수 는 이 대상 의 내부 상 태 를 수정 하여 다른 대상 의 인용 변수 에 영향 을 줄 수 있 습 니 다.
String 은 특수 한 포장 류 데이터 입 니 다.사용 가능:String str=new String("abc");String str = "abc";두 가지 형식 으로 만 듭 니 다.첫 번 째 는 new()로 새 대상 을 만 듭 니 다.쌓 여 있 습 니 다.호출 할 때마다 새로운 대상 을 만 듭 니 다.두 번 째 는 스 택 에 String 류 의 대상 참조 변수 str 를 만 든 다음 스 택 에'abc'가 저장 되 어 있 는 지 찾 는 것 입 니 다.없 으 면'abc'를 스 택 에 저장 하고 str 를'abc'로 가리 키 며'abc'가 있 으 면 str 를'abc'로 가리 키 는 것 입 니 다.클래스 안의 수치 가 같 는 지 비교 할 때 equals()방법 을 사용 합 니 다.두 포장 류 의 인용 이 같은 대상 을 가리 키 는 지 테스트 할 때=,아래 는 예 를 들 어 위의 이론 을 설명 한다.String str1 = "abc";String str2 = "abc";System.out.println(str1==str2); //true 는 str 1 과 str 2 가 같은 대상 을 가리 키 는 것 을 알 수 있다.String str1 =new String ("abc");String str2 =new String ("abc");System.out.println(str1==str2); // false 는 new 방식 으로 다른 대상 을 만 드 는 것 입 니 다.매번 하나씩 생 성 된다.따라서 두 번 째 방식 으로 여러 개의'abc'문자열 을 만 듭 니 다.메모리 에 한 개의 대상 만 존재 합 니 다.이러한 쓰기 방법 은 메모리 공간 을 절약 하 는 데 유리 하고 프로그램의 운행 속 도 를 어느 정도 향상 시 킬 수 있 습 니 다.JVM 은 스 택 에 있 는 데이터 의 실제 상황 에 따라 새로운 대상 을 만 들 필요 가 있 는 지 여 부 를 자동 으로 결정 하기 때 문 입 니 다.String str=new String("abc");의 코드 는 문자열 값 이 같 든 그렇지 않 든 모두 더미 에 새 대상 을 만 들 고 프로그램의 부담 을 가중 시 킵 니 다.다른 한편,주의해 야 할 것 은 String str="abc"와 같은 것 을 사용 하고 있 습 니 다.의 형식 정의 클래스 는 항상 당연히 String 클래스 의 대상 str 를 만 들 었 다 고 생각 합 니 다.함정 이 걱정 이 야!대상 이 생 성 되 지 않 았 을 수도 있 습 니 다!이전에 만 든 대상 을 가리 키 는 것 일 수도 있 습 니 다.new()방법 을 통 해서 만 매번 새로운 대상 을 만 들 수 있 습 니 다.==========================================================================================================================================================================================================자바 가상 머 신 은 프로그램 이 실 행 될 때 환경 을 제공 합 니 다.실 행 될 때 환경 에서 가장 중요 한 자원 은 실 행 될 때 데이터 구역 입 니 다.실행 할 때 데이터 구역 은 운영 체제 가 자바 가상 컴퓨터 프로 세 스 에 분 배 된 메모리 구역 이 고 가상 컴퓨터 가 관할 하 는 동시에 이 구역 은 여러 개의 키 구역 으로 나 뉘 는데 주로 쌓 기 구역,방법 구역 과 자바 스 택 구역 을 포함한다.쌓 기 구역 에 대상 을 저장 하고 방법 구역 에 유형의 정 보 를 저장 하 며 유형 정 보 는 정적 변수 와 방법 정 보 를 포함한다.방법 정보 에 클래스 의 모든 방법 을 포함 하 는 바이트 코드 입 니 다.창고,특징 이 있 습 니 다.먼저 들 어간 후에 나 오 면 안에 진행 중인 방법 이 놓 여 있 습 니 다.예 를 들 어 방법 입 니 다.
public void A(){
B();
}
public void B(){
C();
}
public void C(){
}
프로그램 이 A()방법 만 호출 한다 고 가정 합 니 다.(시작 할 때 스 택 이 비어 있 습 니 다)
프로그램 이 실 행 될 때 A()방법 을 먼저 실행 합 니 다.A 방법 이 B()방법 을 호출 했 기 때 문 입 니 다.이때 A()가 실행 되 지 않 았 기 때문에 A()방법 을 중단 하고 스 택 에 임시 저장 합 니 다.이때 B 방법의 실행 을 중단 하고 B()방법 push 를 스 택 에 넣 습 니 다.스 택 에 A 방법 이 있 기 때문에 B 가 push 에 들 어간 후에 A 위 에 있 습 니 다.C()방법 이 실 행 된 후에 스 택 에 가서 스 택 꼭대기 에 있 는 방법 을 찾 습 니 다.방법 B 가 계속 실 행 된 것 을 알 아 냈 습 니 다.실 행 된 후에 스 택 에 가서 스 택 꼭대기 에 있 는 방법 을 찾 습 니 다.이때 스 택 안에 또 다른 방법 만 있 습 니 다.그것 이 바로 방법 A 입 니 다.방법 A 는 계속 실 행 했 습 니 다.A 가 실 행 된 후에 스 택 에 방법 이 없어 서 프로그램 이 끝 났 습 니 다.
아래 에 있 는 이 기둥 모양 의 물건 이 창고 라 고 가정 하 세 요.
-----------------------------------
| |
|B()|---스 택 입구 에 있 는 가장 가 까 운 방법 은 먼저 pop 에 의 해 실 행 됩 니 다.
|A()|---창고 밑 의 방법 은 마지막 에 실 행 됩 니 다.
==================================================================================================================
기본 데이터 형식 은'스 택'에 저장 되 어 있 으 며,대상 참조 형식 은 실제'더미'에 저장 되 어 있 으 며,스 택 에 서 는 참조 메모리 의 주소 값 만 유지 되 어 있 습 니 다.
=================================================================================================================
스 택 의 데이터 가 메모리 에서 차지 하 는 크기 는 컴 파일 할 때 확 정 됩 니 다.예 를 들 어 int 형식 이 4B 를 차지 하기 때문에 변수 주 소 는 계산 하기 쉬 우 므 로 분배 와 소각 과 방문 속도 가 비교적 빠 릅 니 다.
쌓 여 있 는 데이터 가 메모리 에서 차지 하 는 크기 는 일반적으로 컴 파일 할 때 확실 하지 않 고 실행 할 때 만 크기 를 알 수 있 기 때문에 주 소 는 실행 할 때 만 계산 되 고 실행 할 때 메모리 크기 에 변동 이 있 을 수 있 기 때문에 이러한 데이터 에 대한 분 배 는 소각 과 접근 이 매우 불편 하고 속도 도 느리다.
===================================================================================================================
창고 에 놓 인 것 은 주소 입 니 다.더미 에 데 이 터 를 넣 을 수도 있 고 주소 도 넣 을 수 있 습 니 다.
모든 주 소 는 주어진 데 이 터 를 가리 키 고 있 습 니 다.그렇지 않 으 면 존재 할 필요 가 없습니다.같은 이치 입 니 다.쌓 인 데이터 가 지침 에 의 해 가리 키 지 않 으 면 존재 할 필요 도 없습니다.그래서 obj=null 일 때 메모 리 를 방출 합 니 다.
자바 의 장점 중 하 나 는 지침 이 없다 는 것 이다.자바 에서 전달 하 는 것 은 모두 인용 이다.c++처럼 주 소 를 전달 할 수 있 는 것 이 아니다.예 를 들 어 지침 p++와 p+1 두 개의 결 과 는 완전히 다르다.
===================================================================================================================
스 택 은 컴 파일 할 때 공간 을 분배 하고 더 미 는 동적 분배(실행 할 때 공간 을 분배)이기 때문에 스 택 의 속도 가 빠르다.
cpu 는 스 택 을 조작 하 는 전문 레지스터(esp,ebp)가 있 습 니 다.더 미 는 모두 간접 주소 지정 을 사용 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IntelliJ IDEA 2019.2의 새로운 기능 프로파일 러를 사용해 보았습니다.이번의 새로운 기능은 초호화! 저는 퍼포먼스 개선을 자주 합니다만, IntelliJ IDEA에도 프로파일링 툴이 붙게 되었으므로, 사용해 보았습니다. 편리한 것 같았기 때문에, 앞으로의 메인 웨폰은 이것이 될 것 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.