도해 JVM 메모리 모델

4553 단어 JVM메모리 모델
머리말
지난 글 에서 우 리 는 jvm 가상 컴퓨터 류 의 로드 체 제 를 알 게 되 었 고 순수한 백화 로 진행 되 는 잡담 이 었 다.젊은이 들 이 기억 에 남 을 것 이 라 고 믿 고 관심 이 있 는 동료 들 은 지난 글 의 백화 담 을 다시 한 번 복습 할 수 있다JVM 의 클래스 로드 메커니즘
jvm 에서 클래스 를 불 러 오 면 사용 할 대상 을 메모리 에 넣 습 니 다.jvm 의 메모리 모델 은 어떤 것 입 니까?
오늘 우 리 는 jvm 의 메모리 모델 을 탐색 해 보 자.어린 친구 들 이 그림 을 더 이해 하기 쉽다 는 반응 을 보 였 기 때문에 왕 자 는 다음 글 을 더 많은 그림 으로 설명 할 계획 입 니 다.
방법 영역
많은 동료 들 이 jvm 의 메모리 모델 을 알 고 있 었 습 니 다.방법 구역 이라는 것 을 알 고 있 었 지만 자세히 알 지 못 했 을 수도 있 습 니 다.
사실 방법 구역 은 JDK 1.8 이전 버 전에 존재 하 는 메모리 구역 으로 주로 class 파일 에서 불 러 온 클래스 를 저장 하고 상수 탱크 도 이 구역 에 있 습 니 다.
그러나 JDK 1.8 이후 이 구역 은'메타 데이터 공간'이라는 뜻 으로 이름 이 바 뀌 었 다.물론 이름 만 바 꿨 을 뿐 실현 하 는 기능 은 변 하지 않 았 다.

프로그램 카운터
우리 의 코드 가 이렇다 고 가정 하면:

public class Main {
 public static void main(String[] args) {
  SysUser sysUser = new SysUser();
  sysUser.setAvatar("1");
 }
}
이것 은 우리 의 자바 코드 입 니 다.우리 개발 자 를 대상 으로 한 것 입 니 다.그리고 class 바이트 파일 로 컴 파일 됩 니 다.class 바이트 파일 에 저 장 된 것 은 하나의 바이트 명령 입 니 다.그 는 하나의 기계 명령 에 대응 합 니 다.컴퓨터 는 기계 명령 을 읽 어야 만 무엇 을 해 야 하 는 지 알 수 있 습 니 다.
따라서 JVM 이 클래스 정 보 를 불 러 온 후에 실제 적 으로 바이트 코드 실행 엔진 을 사용 하여 우리 의 코드 가 컴 파일 된 바이트 코드 명령 을 실행 하 는 것 입 니 다.다음 과 같 습 니 다.

그렇다면 바이트 코드 명령 을 실행 할 때 jvm 은 어떤 명령 을 실행 해 야 하 는 지 어떻게 알 았 을 까?이때 프로그램 카운터 가 나 타 났 다.
그것 은 현재 실행 중인 바이트 코드 명령 의 위 치 를 기록 하 는 데 쓰 인 다.

또한,젊은이 들 은 JVM 이 다 중 스 레 드 를 지원 한 다 는 것 을 알 고 있 습 니 다.그래서 우리 가 다 중 스 레 드 를 열 면 여러 스 레 드 가 서로 다른 바이트 코드 명령 을 실행 하고 있 습 니 다.그들 사이 의 바이트 코드 명령 이 섞 이지 않 기 때문에 모든 스 레 드 는 자신의 프로그램 카운터 가 있 습 니 다.모든 스 레 드 자신의 명령 이 현재 어디 까지 실행 되 었 는 지 기록 하 는 데 사 용 됩 니 다.다음 과 같은 그림 입 니 다.
 
JAVA 가상 머 신 스 택
jvm 이 class 에서 명령 을 실행 할 때 프로그램 카운터 로 실 행 된 명령 위 치 를 잠 그 는 것 을 알 고 있 습 니 다.그러나 우리 가 실행 하 는 방법 에는 국부 변수 등 데이터 가 많 습 니 다.가상 컴퓨터 스 택 은 방법 을 저장 하 는 부분 변 수 를 사용 하 는 것 입 니 다.그리고 모든 라인 은 자신의 가상 컴퓨터 스 택 이 있 습 니 다.예 를 들 어 우리 의 이전 코드 와 같 습 니 다.

public class Main {
 public static void main(String[] args) {
  SysUser sysUser = new SysUser();
  sysUser.setAvatar("1");
 }
}
이 코드 는 main 스 레 드 를 시작 하고 부분 변수 sysUser 를 스 택 에 저장 합 니 다.
만약 에 스 레 드 가 하나의 방법 을 실행 하면 이 방법 에 대해 스 택 프레임 을 만 들 고 그 다음 에 이른바 스 택 작업(선진 후 출)입 니 다.다음 과 같 습 니 다.

그 다음 에 저희 코드 가 계속 실행 되 고 setAvatar 방법 을 호출 하면 스 택 프레임 을 계속 만 들 것 입 니 다.다음 과 같 습 니 다.

setAcatar 방법 이 실행 되면 방법의 스 택 프레임 에 대해 스 택 작업 을 수행 합 니 다.
이상 은 JAVA 가상 머 신 스 택 의 역할 입 니 다.간단하게 요약 하면 호출 방법 은 스 택 프레임 을 만 들 고 스 택 을 누 르 며 방법 이 실행 되면 스 택 작업 을 수행 하 는 것 입 니 다.
JAVA 메모리
자바 가상 컴퓨터 스 택 을 말 했 습 니 다.그러면 중요 한 메모리 영역 자바 더 미 를 다시 말 하 겠 습 니 다.이것 은 우리 코드 에서 만 든 여러 대상 을 저장 하 는 데 사 용 됩 니 다.
아니면 아까 코드 를 예 로 들 면 우리 가 new SysUser()를 실행 할 때 SysUser 인 스 턴 스 대상 을 만 들 었 고 이 대상 자체 에 많은 속성 과 방법 이 있 을 것 입 니 다.이러한 실례 화 대상 의 데 이 터 는 메모리 에 저 장 된 것 입 니 다.
이때 우리 가 스 택 에 저장 한 부분 변 수 는 실제 적 으로 이 대상 의 메모리 주소 이 고 인용 주소 로 이해 할 수 있 습 니 다.다음 그림:

여기까지 JVM 의 메모리 영역 은 어린이 들 과 소 개 했 습 니 다.이해 할 수 있 도록 전체 메모리 영역 도 를 보 여 드 리 겠 습 니 다.

기타 메모리 영역
앞에서 소개 한 메모리 영역 을 제외 하고 jdk 의 api(io,nio,socket)와 관련 이 있 습 니 다.사실은 그들의 내 부 는 자바 코드 가 아니 라 native 방법 으로 로 컬 운영 체제 의 일부 방법 을 호출 했 습 니 다.c 언어 로 작 성 된 것 이나 일부 바 텀 라 이브 러 리 일 수 있 습 니 다.
네 이 티 브 방법 을 호출 할 때 스 레 드 는 로 컬 방법 스 택 에 대응 합 니 다.이것 은 자바 가상 스 택 과 유사 한 동쪽 입 니 다.네 이 티 브 방법의 각종 부분 변수 표 입 니 다.
그 밖 에 JVM 에 속 하지 않 는 영역 이 하나 더 있 습 니 다.NIO 의 allocateDirect api 를 통 해 더미 밖 에 메모리 공간 을 분배 하여 더미 밖의 메모리 공간 데 이 터 를 직접 조작 할 수 있 습 니 다.
어떤 장면 에서 쌓 인 메모리 공간 은 성능 을 향상 시 킬 것 이다.이 문 제 는 우리 가 나중에 점차적으로 탐색 한 후에 오늘 은 이 문 제 를 말 하지 않 겠 다.
총결산
이 글 은 여기까지 입 니 다.왕 자 는 동료 들 의 의견 을 받 아들 여 많은 그림 을 그 려 서 동료 들 이 더 잘 이해 하 는 데 도움 이 되 었 습 니 다.여러분 에 게 도움 이 되 었 으 면 좋 겠 습 니 다.
그럼 다음 글 에서 봅 시다.
이상 은 JVM 메모리 모델 을 도해 하 는 상세 한 내용 입 니 다.JVM 메모리 모델 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기