>  기사  >  Java  >  JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델

JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델

php是最好的语言
php是最好的语言원래의
2018-07-27 10:14:411863검색

최근에 아주 고전적인 자바 책인 "자바 가상 머신의 심층 이해, 제2판"을 읽었는데, 그 당시에는 별로 인기가 없었거든요. 혼란스럽고 혼란스러워서 읽기를 중단했습니다. 지금 돌이켜보면 정말 잘 쓰여졌고, 많은 지식을 이해할 수 있었고, 또한 매우 깊이 있고 많은 것을 얻었습니다. 추후에는 이 책의 내용을 바탕으로 Java Virtual Machine에 관련된 지식을 심도 있게 배우고 복습하는 일련의 글을 쓸 계획이다.

지난 주말 이사한 후 집에 있는 광대역이 고정되지 않았습니다. 통신 고객센터에 N번 신고하고 결국 내일 아침에 광대역을 이전하기 위해 기술자와 약속을 잡았습니다. 일주일 넘게 인터넷이 없는 고통스러운 나날들. 이 기간 동안 여러 가지 일로 바빠서 일주일 동안 블로그를 업데이트하지 않았습니다. 글쓰기를 중단하기 전의 상태와 열정이 점차 사라질 것입니다. ! 내일 주말을 활용하여 이번 주의 학습 내용 중 일부를 회사 컴퓨터에 기록해 보세요.

1. JVM 메모리 모델 개요

JVM 메모리 모델은 실제로 매우 간단합니다.

#🎜🎜 # 1. 구성: java 힙, Java 스택(예: 가상 머신 스택), 로컬 메서드 스택, 메서드 영역 및 프로그램 카운터.

2. 공유 여부: 메서드 영역과 힙 영역은 스레드로 공유되며, 가상 머신 스택, 로컬 메서드 스택 및 프로그램 카운터는 스레드 전용입니다. 스레드 격리라고도 하며 각 영역은 서로 다른 콘텐츠를 저장합니다. 이 두 가지 지식 포인트는 JVM 메모리 모델을 마스터하기 위한 기초이므로 명심해야 합니다.

JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델

2. 프로그램 카운터

JVM의 프로그램 카운터는 작은 메모리 영역인데 이 메모리 영역이 꽤 흥미롭습니다. . 3가지 주요 기능이 있습니다:

1. 저장 내용: 일반 Java 메서드(즉, 기본 키워드로 수정되지 않은 메서드)의 경우 저장되는 내용은 현재입니다. 실행 중 값입니다. 명령어의 주소이지만 기본 메서드의 경우 비어 있습니다(정의되지 않음). 로컬 메소드를 호출할 때 JVM 가상 머신의 메모리 주소를 초과했을 수 있기 때문입니다.

2. 스레드 비공개: 프로그램 카운터 스레드가 비공개인 이유는 무엇인가요? 스토리지 내용을 기반으로 이해하기 쉽습니다. 스레드가 여러 스레드를 실행하는 경우 현재 스레드가 어떤 주소를 실행하고 있는지 알 수 없으며 일부 스레드는 느립니다. 다음으로 느린 스레드가 실행에서 돌아와 자신의 주소가 변경된 것을 발견하면 엉망이 되지 않을까요?

3. JVM에서 메모리 오버플로(OutOfMemoryError)를 보고하지 않는 유일한 영역입니다.

3. 가상 머신 스택

가상 머신 스택은 주로 스택 프레임을 저장하며, 각 스택 프레임에는 로컬 변수 테이블과 연산이 저장됩니다. 데이터 스택, 동적 링크 및 메소드 수출 정보 등 지역 변수 테이블에는 메소드에 정의된 일부 지역 변수, 객체 참조, 매개변수, 메소드 반환 주소 등이 저장됩니다. 지역 변수 테이블이 차지하는 공간의 크기는 컴파일 타임에 결정될 수 있으며, 메소드 실행 중에는 지역 변수 테이블의 공간 크기가 변경되지 않습니다. 이는 로컬에 저장된 내용과 결합하면 이해하기 쉽습니다. 변수 테이블. 피연산자 스택은 현재 연산의 데이터를 로드하고 언로드하는 것으로 이해될 수 있습니다. 64비트 long 및 double 유형의 경우 각 피연산자는 2워드 너비(슬롯)를 차지하고 다른 유형의 피연산자는 1워드 너비(슬롯)를 차지합니다. 각 메소드가 호출될 때마다 스택 프레임이 생성되며, 실행 과정은 스택 프레임이 가상머신 스택에 푸시되었다가 스택에서 튀어나오는 과정에 해당합니다. 스택 프레임의 내용에 관해서는 네티즌이 작성한 블로그(https://blog.csdn.net/xtayfjp...)를 참조할 수 있습니다. 매우 훌륭하고 상세합니다. 한눈에 알아보기 쉽게 스택 프레임 사진을 보여드리겠습니다.

JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델

가상 머신 스택 메모리 오버플로와 관련하여 두 가지 상황이 있습니다.

1 스레드에서 요청한 스택 깊이가 다음을 초과합니다. 가상 머신 허용된 깊이에서는 StackOverflowError가 발생하므로 코드에서 이 예외가 표시되면 가상 머신 스택에 문제가 있을 수 있다고 생각해야 합니다.

2. 가상 머신 스택을 동적으로 확장할 수 있는 경우(현재 대부분의 JVM은 동적으로 확장할 수 있지만 JVM은 고정 길이 가상 머신 스택도 허용함) 확장 중에 충분한 메모리를 적용할 수 없는 경우 OutOfMemoryError 예외가 발생합니다.

4. 로컬 메소드 스택

이 지식 포인트는 비교적 간단합니다. 로컬 메소드 스택과 가상 머신 스택의 기능은 비슷하지만 JVM이 실행될 때만 제공됩니다. 네이티브 메소드를 호출하며, JVM에는 네이티브 메소드에서 사용하는 언어(예: Java가 C 언어로 구현된 함수를 호출하는 경우 이를 구현하려면 네이티브 메소드를 정의해야 함), 사용 방법에 대한 필수 규정이 없습니다. 데이터 구조이므로 다양한 가상 머신에서 자유롭게 구현할 수 있습니다. 또한 HotSpot 가상 머신은 로컬 메서드 스택과 가상 머신 스택을 하나로 직접 결합합니다. 가상 머신 스택과 마찬가지로 로컬 메서드 스택도 StackOverflowError 및 OutOfMemoryError를 발생시킵니다.

5. 메소드 영역

메소드 영역은 Java Virtual Machine 사양에서 힙의 논리적 부분으로 설명합니다. Non-Heap(비힙 영역)이라고 합니다. 주로 정적 변수, 상수(런타임 상수 포함), 클래스 로딩 정보 및 Java 컴파일 코드가 저장됩니다. 이 부분은 연속적일 필요는 없습니다. 고정 크기 또는 확장 가능을 선택할 수 있습니다. 일반적으로 GC는 정적 변수, 상수 및 클래스 로딩 정보만 재활용하므로 이러한 객체의 재활용 효과는 일반적으로 만족스럽지 않습니다. 따라서 가비지 수집을 구현하지 않도록 선택할 수 있습니다. 이 영역은 영구 생성이라고도 합니다. 이 메모리 영역이 부족하면 OutOfMemoryError 예외도 보고됩니다.

6. 힙 영역

Java 힙 영역은 JVM 메모리에서 가장 큰 영역입니다. 모든 객체 인스턴스와 배열 객체가 여기에 저장되기 때문입니다. 이 영역은 스레드에 의해 공유되며 JVM이 시작될 때 생성됩니다. 이렇게 큰 공간이 스레드 전용이라면 메모리가 폭발해야 하지 않을까요? Java Virtual Machine 사양에 따르면 힙 영역의 내용은 논리적으로 연속적인 한 물리적으로 불연속적일 수 있으며 구현 시 크기가 고정되거나 확장 가능하며 일반적으로 메모리 매개 변수를 사용합니다. -Xms 및 -Xmx는 힙 크기를 조정하는 데 사용됩니다. Java 힙 영역은 서로 다른 라이프사이클에 따라 신세대와 구세대로 구분됩니다. New Generation은 Eden과 Survivor 영역으로 세분화될 수 있으며, Survivor는 Survivor1과 Survivor2로 세분화될 수 있습니다. 이 둘은 보통 둘 중 하나만 사용하고, 다른 하나는 GC 중에 살아남은 개체를 유지하는 데 사용됩니다. 대부분의 새로운 객체는 Eden 영역에 저장됩니다. 대규모 배열이나 List 객체와 같은 대형 객체인 경우 JVM 매개변수 -XX:PretenureSizeThreshold를 사용하여 지정된 크기를 초과하는 객체를 이전 세대에 직접 저장할 수 있습니다. 프로그램을 작성할 때, Old Generation의 GC 비용이 Young Generation의 비용보다 크기 때문에 살고 죽는 대형 개체가 Old Generation에 들어가는 것을 피하려고 노력해야 합니다. Eden과 Survivor의 기본 크기 비율은 8:1:1이며, 새로운 세대의 기본 GC 알고리즘은 복제 알고리즘입니다. 이전 세대의 기본 GC 알고리즘은 마크 콜레이션입니다. 이 두 가지 GC 알고리즘에 대해서는 다음 블로그에서 설명하겠습니다.

힙에 메모리가 충분하지 않으면 OutOfMemoryError 예외가 발생합니다. 힙 영역의 메모리 모델에 대해서는 다음 그림을 참조할 수 있습니다.

JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델

관련 기사:

자바 가상 머신의 자세한 개요

자바 가상 머신의 작동 원리에 대한 자세한 설명 (사진 및 글)

관련 영상:

Black Horse Cloud 교실 8일간 Python에 대한 심층적인 이해 영상 튜토리얼

위 내용은 JAVA 가상 머신 관련 지식의 상세한 그래픽 설명 - JVM 메모리 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.