성능 최적화 | JVM 메모리 할당 메커니즘을 빠르게 파악

JVM 전체 구조

  • 힙 쓰레드가 공유하는 영역은 가비지 컬렉터가 수집하는 영역으로 주로 사용자가 생성 한 오브젝트를 저장합니다. 예를 들어, new User (),이 객체는 힙에 저장됩니다.
  • 스택은 로컬 변수, 메서드 반환 값 및 메서드 작업에 의해 생성 된 동적 링크를 저장하는 데 사용됩니다.
  • 이 메서드 스택 쌍은 네이티브 메서드 (네이티브) 실행의 스택 구조를 저장하는 데 사용됩니다.
  • 메소드 영역은 jdk1.8에서 메타 스페이스로 이름이 변경되었으며 다음 내용이 주로 여기에 저장됩니다.
    • 유형 정보
      • 유형의 완전한 이름
      • 수퍼 클래스의 완전한 이름
      • 직접 수퍼 인터페이스의 정규화 된 이름
      • 유형 플래그 (클래스가 클래스 유형인지 인터페이스 유형인지 여부)
      • 클래스 액세스 설명자 (공개, 개인, 기본값, 추상, 최종, 정적)
    • 상수 풀
    • 필드 정보
      • 필드 수정 자 (공개, 보호, 개인, 기본값)
      • 필드 유형
      • 분야 명
    • 방법 정보
    • 클래스 변수
    • 다양한 참조
      • 클래스 인스턴스에 대한 참조
      • 로더 참조
    • 메서드 테이블 메서드 테이블은 비추 상 클래스의 위도를 사용하여 생성 된 배열로, 배열의 요소는 액세스 효율성을 높이기 위해 클래스의 각 메서드에 대한 직접 참조입니다.
  • 프로그램 카운터 프로그램 카운터는 스레드가 전환하기 전에 명령을 실행하는 줄 번호를 저장하는 데 사용됩니다. 이것은 주로 멀티 스레딩의 경우 스레드 전환 문제를 해결하기위한 것입니다. 단일 스레드 만있는 경우 실제로 프로그램 카운터는 필요하지 않습니다.

힙 영역은 어떻게 분할됩니까?

jvm을 연결 한 학생들은 힙이 실제로 가비지 콜렉션을 위해 설계된 구조 인 구시대와 신시대로 나뉘어져 있음을 알아야합니다 여기에 사진 설명 삽입

신규 및 이전 연령과 관련된 JVM 매개 변수

  • -XX : NewRatio는 신세대와 구세대의 비율을 설정합니다. 예를 들어 -XX : NewRatio = 5는 신세대와 구세대의 비율이 1 : 5, 신세대가 힙 메모리의 1/6을 차지함을 의미합니다. 이전 세대는 5/6을 차지합니다 .jvm은 새 세대와 이전 세대를 1 : 2로 기본 설정합니다. 프로그램이 -XX : MaxNewSize 값을 지정하기 시작하면 매개 변수 설정 비율이 유효하지 않으며 값이 이전 세대는 힙 메모리 크기에서 MaxNewSize를 뺀 것입니다.
  • -XX : SurvivorRatio 새로운 세대에서 eden과 두 Survivo 영역의 비율을 설정합니다. 예를 들어 -XX : SurvivorRatio = 8, eden : s1 : s2 = 8 : 1 : 1, 기본 비율은 8 : 1입니다. 1.

Young GC는 젊은 세대에서 발생하고 FUll GC는 전체 힙 공간에서 발생하며 일반적으로 구세대의 공간이 충분하지 않은 경우 FULL GC가 시작됩니다.

탈출 분석

이스케이프 분석은 일반적인 개체는 힙에 할당되고 힙에 할당 된 개체는 가비지 수집기가 수집 할 때까지 기다려야하기 때문에 스택에 할당 할 수있는 메서드 내부의 개체를 분석하는 데 주로 사용됩니다. 힙 공간을 차지하지만 메서드 내부의 경우 다음 조건을 충족하면 객체를 스택에 할당 할 수 있습니다.

  • 지역 변수
  • 멤버 변수에 할당되지 않음
  • 반환 값으로 튀어 나오지 않았습니다.

jdk1.7 이전에는 -XX : + DoEscapeAnalysis 매개 변수를 사용하여 설정해야하고, jdk1.7은 기본적으로 이스케이프 분석을 설정하고, 해제해야하는 경우 -XX : + DoEscapeAnalysis 매개 변수를 사용하여 설정해야합니다. 떨어져서

Just-In-Time 컴파일 기술이란?

JVM의 작동 모드는 무엇입니까?

  • 해석 모드는 한 줄의 바이트 코드를 실행하고 실행을 위해 한 줄의 기계 코드로 컴파일합니다.
    • 특징 : 해석 모드를 사용하면 JVM 시작 속도는 빠르지 만 명령 실행이 느리고 한 줄씩 컴파일해야합니다.
  • 컴파일 모드는 먼저 모든 바이트 코드를 기계 코드로 컴파일 한 다음 모든 기계 코드를로드하여 한 번에 실행할 수 있습니다.
    • 특징 : 컴파일 모드를 사용하면 컴파일이 필요하기 때문에 JVM 시작 속도가 약간 느려지지만 실행할 때 거의 소비가 없습니다.
  • 혼합 모드는 해석 모드를 사용하여 코드를 실행하지만 일부 핫스팟이나 공유 코드 조각이 발견되면 컴파일 된 모드에서 실행되고 컴파일 된 콘텐츠가 캐시되어 반복 컴파일을 줄여 코드 실행 효율성을 향상시킵니다. . 이것은 JVM에서 사용되는 기본값이기도합니다. 컴파일 모드, JIT (Just-in-time 컴파일 기술)입니다.

추천

출처blog.csdn.net/weixin_34311210/article/details/109407023