>  기사  >  Java  >  Java Virtual Machine Learning - 아키텍처 메모리 모델

Java Virtual Machine Learning - 아키텍처 메모리 모델

黄舟
黄舟원래의
2017-02-17 10:48:291752검색


  • 1: Java 기술 시스템 모듈 다이어그램

  • 2: JVM 메모리 영역 모델





1. 🎜>

은 "영구 생성" 및 "비힙"이라고도 합니다. 가상 머신에서 로드하는 클래스 정보, 상수, 정적 변수를 저장하는 데 사용됩니다.

스레드가 공유하는 각 메모리 영역입니다. 기본 최소값은 16MB이고 최대값은 64MB입니다. -XX:PermSize 및 -XX:MaxPermSize 매개변수를 통해 메소드 영역의 크기를 제한할 수 있습니다.

런타임 상수 풀: 클래스 버전, 필드, 메서드, 인터페이스 등과 같은 설명 정보 외에도 클래스 파일에는 메서드 영역의 일부입니다. 상수 풀은 컴파일러에서 생성된 다양한 기호 참조를 저장하는 데 사용됩니다. 이 내용은 클래스가 로드된 후 메서드 영역의 런타임 상수 풀에 배치됩니다.

2. 가상 머신 스택

은 Java 메소드 실행의 메모리 모델을 설명합니다. 각 메소드가 실행되면 지역 변수 테이블(매개변수 포함), 작업 스택, 메소드 종료와 같은 정보를 저장하는 "스택 프레임"이 생성됩니다. 각 메소드가 호출되어 실행이 완료될 때까지의 과정은 가상머신 스택에서 스택 프레임이 스택에 푸시되어 스택 밖으로 튀어나오는 과정에 해당한다. 선언 주기는 스레드와 동일하며

스레드에만 적용됩니다.

지역 변수 테이블은 컴파일러에 알려진 다양한 기본 데이터 유형(boolean, byte, char, short, int, float, long, double), 객체 참조(참조 포인터, Not)를 저장합니다. 객체 자체), 64비트 long 및 double 유형 데이터는 2개의 지역 변수 공간을 차지하고 다른 데이터 유형은 1개만 차지합니다. 로컬 변수 테이블에 필요한 메모리 공간은 메소드 진입 시 스택 프레임에 할당해야 하는 로컬 변수의 크기가 완전히 결정됩니다. 런타임 공간 중 변수 테이블.

3. 로컬 메소드 스택

은 기본적으로 가상 머신 스택과 유사합니다. 가상 머신에 의해 실행되는 Java이고 로컬 메소드 스택은 기본 메소드를 제공합니다.

4. 힙

Java 힙이라고도 불리는 GC 힙은 Java 가상 머신이 관리하는 가장 큰 메모리입니다. JVM이 시작되면 다양한 스레드가 공유하는 메모리 영역이 생성됩니다. 이 메모리 영역은 객체 인스턴스와 배열(모든 새로운 객체)을 저장합니다. 크기는 -Xms(최소값) 및 -Xmx(최대값) 매개변수로 설정됩니다. -Xms는 JVM이 시작될 때 요청되는 최소 메모리입니다. > 기본값은 운영 체제의 물리적 메모리의 1/64이지만 1G 미만입니다. -Xmx는 JVM이 적용할 수 있는 최대 메모리입니다. 기본값은 물리적 메모리의 1/4이지만 그 이하입니다. 기본값은 사용 가능한 힙 메모리가 40% 미만인 경우 JVM이 -Xmx에 지정된 크기로 힙을 늘리는 것입니다. 여유 힙 메모리가 70%보다 크면 JVM은 힙 크기를 으로 줄입니다. -Xms로 지정된 크기는 실행 중인 시스템의 경우 빈번한 조정을 피하기 위해 XX:MaxHeapFreeRation=으로 지정할 수 있습니다. 런타임 시 힙 크기, 일반적으로 -Xms 및 -Xmx 값은 동일한 으로 설정됩니다.

컬렉터는 이제 세대별 수집 알고리즘을 사용하므로 힙이 신세대와 구세대로 나누어집니다. New Generation은 새로 생성된 객체와 아직 Old Generation에 진입하지 않은 객체를 주로 저장합니다. 이전 세대는 여러 번의 마이너 GC에서 살아남은 개체를 저장합니다.

신세대:

프로그램에서 생성된 새로운 객체는 모두 from 새로운 세대는 Eden Space와 동일한 크기의 두 개의 Survivor Space(일반적으로 S0 및 S1 또는 From 및 To라고도 함)로 구성됩니다. 또는 -XX: SurvivorRation을 사용하여

Eden Space 및 Survivor Space의 크기를 조정합니다.

기성세대:

은 캐시 객체와 같이 여러 신세대 GC에서 살아남은 객체를 저장하는 데 사용됩니다. 새로 생성된 객체도 이전 세대에 직접 들어갈 수 있습니다. ①. 대형 객체의 경우 시작 매개변수 -XX:PretenureSizeThreshold=1024(단위는 바이트, 기본값은 0)를 설정하여 크기를 초과하면 새 세대에 할당되지 않고 다음 세대에 직접 할당됨을 나타낼 수 있습니다. 구세대. ② 큰 배열 개체의 경우 배열에서 참조되는 외부 개체가 없습니다.

Old Generation이 차지하는 메모리 크기는 -Xmx에 해당하는 값에서 -Xmn에 해당하는 값을 뺀 값입니다.

5. 프로그램 카운터

의 기능은 현재 스레드에서 실행되는 바이트코드의 줄 번호 표시입니다. 가상 머신 모델에서 바이트코드 인터프리터는 필요한 다음 바이트코드 명령의 값을 변경하여 작동합니다. 실행, 분기, 루핑, 예외 처리, 스레드 복구 등과 같은 기본 기능은 모두 카운터에 의존해야 합니다.


  • 3: 직접 메모리

직접 메모리는 가상 머신 메모리의 일부도 아니고, 자바 가상 머신 사양에 정의된 메모리 영역도 아닙니다. jdk1.4에 새로 추가된 NIO는 채널 및 버퍼의 IO 메서드를 도입하여 기본 메서드를 호출하여 오프 힙 메모리를 직접 할당할 수 있으며 이 오프 힙 메모리는 힙 메모리의 크기에 영향을 주지 않습니다. .

위 내용은 Java 가상 머신러닝 - 아키텍처 및 메모리 모델에 대한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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