자바 메모리 구분:실행 시 데이터 영역

1.프로그램 카운터(스 레 드 개인)
프로그램 계수 기 는 비교적 작은 메모리 공간 으로 현재 스 레 드 가 실행 하고 있 는 바이트 코드 의 줄 표시 기(스 레 드 를 전환 하면 정확 한 실행 위치 로 회복 할 수 있 습 니 다)라 고 볼 수 있 습 니 다.
2.자바 가상 컴퓨터 스 택(스 레 드 개인)
(1)개념
가상 스 택 은 자바 방법 으로 실 행 된 메모리 모델 을 설명 합 니 다.모든 방법 을 실행 하 는 동시에 스 택 프레임 을 만들어 국부 변수 표,조작 스 택,동적 링크,방법 출구 등 정 보 를 저장 합 니 다.모든 방법 은 호출 에서 실행 이 완 료 될 때 까지 하나의 스 택 프레임 이 가상 스 택 에 스 택 에 들 어가 고 스 택 을 나 가 는 과정 에 대응 합 니 다.성명 주 기 는 스 레 드 와 같 습 니 다.
스 택 프레임 에 대한 이해:스 레 드 를 시작 하면 가상 스 택 공간 을 만 듭 니 다(여러 노드 를 저장 하고 먼저 나 가면).두 가지 이상 이 발생 할 수 있 습 니 다.
① StackOverflow Error:방법 호출 체인 이 너무 깊 음(예 를 들 어 재 귀);
②OOM
(2)다음은 코드 를 분석 하 겠 습 니 다.

public class VMStackTest {
    public static void main(String[] args) {
        int m = 1;
        int n = 2;
        swap1(1, 2);
        System.out.printf("main:m=%s, n=%s%n", m, n);
    }
    private static void swap1(int m, int n) {
        int tmp = m;
        m = n;
        n = tmp;
        Person p1 = new Person("p1");
        Person p2 = new Person("p2");
        swap2(p1, p2);
        System.out.printf("swap1:p1=%s, p2=%s%n", p1.name, p2.name);
    }
    private static void swap2(Person p1, Person p2) {
        Person tmp = p1;
        p1 = p2;
        p2 = tmp;
        System.out.printf("swap2:p1=%s, p2=%s%n", p1.name, p2.name);
    }
    static class Person{
        String name;
        public Person(String name) {
            this.name = name;
        }
    }
}
이 코드 의 실행 결 과 는 무엇 입 니까?
자바 에 서 는 값 만 전달 되 는 것 을 알 고 있 습 니 다.기본 데이터 형식 일 때 글자 의 액면가 상수,인용 형식 일 때 주 소 를 전달 합 니 다.
swap 1 에서 방법 창고 프레임 의 국부 변 수 를 수 정 했 을 뿐 밖의 국부 변 수 는 작용 하지 않 기 때문에 swap 1 의 교환 은 무효 입 니 다.
swap 2 에서 도 마찬가지 로 방법 스 택 프레임 의 부분 변 수 를 수정 하 였 을 뿐 밖의 부분 변 수 를 교환 하 는 것 도 무효 입 니 다.
그래서 최종 인쇄 결 과 는:

p1,p2 대상 의 이름 을 바 꾸 려 면 p1.name="p2",p2.name="p1"(더미 에 작용 하 는 대상)
3.로 컬 방법 스 택(스 레 드 개인)
로 컬 방법 스 택 은 가상 컴퓨터 스 택 의 역할 과 똑 같 습 니 다.그들 두 사람의 차 이 는 로 컬 방법 스 택 이 가상 컴퓨터 에 사용 하 는 Native 방법 서비스 일 뿐만 아니 라 가상 컴퓨터 스 택 은 JVM 이 실행 하 는 자바 방법 서비스 입 니 다.
4.자바 더미(스 레 드 공유)
자바 더미(Java Heap)는 JVM 이 관리 하 는 최대 메모리 영역 입 니 다.자바 더 미 는 모든 스 레 드 가 공유 하 는 영역 으로 JVM 이 시 작 될 때 만 듭 니 다.이 메모리 영역 에 저 장 된 것 은 모두 대상 인 스 턴 스 입 니 다.JVM 규범 에 서 는"모든 대상 인 스 턴 스 와 배열 은 쌓 아 올 려 야 한다"고 말 했다.
5.방법 영역(스 레 드 공유)
방법 영역 은 자바 더미 와 마찬가지 로 각 스 레 드 가 공유 하 는 메모리 영역 입 니 다.이 는 가상 컴퓨터 에 불 러 온 클래스 정보,상수,정적 변 수 를 저장 하 는 데 사 용 됩 니 다.1.8 더미 에 있 음),인 스 턴 트 컴 파일 러 가 컴 파일 한 코드 등 데이터.
6.운행 시 상 당량 탱크(방법 구역 의 일부분)
(1)개념
실행 시 상 당량 탱크 는 방법 구역 의 일부분 으로 글자 의 양 과 기호 인용 을 저장 합 니 다.글자 크기:문자열(JDK 1.7 이후 더미 로 이동),final 상수,기본 데이터 형식의 값.기호 참조:클래스 와 구조의 완전 한정 명,필드 의 이름과 설명자,방법의 이름과 설명자.
(2)보충:기타 상수 탱크
  • ① class 파일 상수 풀:자바 파일 은 class 바이트 파일 로 컴 파일 되 고 존재 하 는 상수 풀 은 글자 의 양 과 기호 참조 가 포함 되 어 있 습 니 다.
  • ② 자바 프로 세 스 가 실 행 된 후에 특정한 줄 코드 가 실행 되 지 않 았 더 라 도 class 파일 상수 탱크 의 내용 을 실행 시 상수 탱크 에 두 었 습 니 다.다음 그림
  • ③ 문자열 상수 탱크:1.7 이전 에는 실행 시 상수 탱크 안 이 었 고 1.7 이후 에는 쌓 여 있 었 다.
  • 총결산
    이 글 은 여기까지 입 니 다.도움 을 줄 수 있 고 우리 의 더 많은 내용 에 관심 을 가 져 주 셨 으 면 좋 겠 습 니 다!

    좋은 웹페이지 즐겨찾기