Java JVM 세부 사항 :
JVM에 대한 관련 지식
1. 힙 및 스택 메모리
1. JVM의 스택 메모리는 주로 기본 유형의 변수 및 객체에 대한 참조를 저장합니다.
2. JVM의 힙 메모리는 주로 새로운 객체와 배열을 새롭게 저장하고 가변 길이 줄 (StringBuilder 및 StringBuffered)이 힙 메모리에 저장됩니다.
힙 사용의 장점은 동적으로 할당 된 저장 공간이라는 것이 더 유연하지만 단점은 메모리를 동적으로 할당하는 것이 느리다는 것입니다. 스택을 사용하는 동안 더 빠르고 데이터 공유를 달성 할 수 있지만 단점은 스택의 데이터 크기와 수명을 결정하고 유연성이 부족하다는 것입니다.
3. 정적 저장소 할당은 정적 변수와 정적 코드 블록을 저장하는 데 사용됩니다.
2. JVM 이해
JVM은 Java 가상 머신입니다. 특정 운영 체제 플랫폼과 관련된 정보를 차단하므로 Java 프로그램이 Java 가상 머신에서 실행되는 객체 코드 (바이트 코드) 만 생성하여 크로스 플랫폼 작동을 달성 할 수 있습니다.
원칙은 Java 소스 파일은 Java 컴파일러를 통해 바이트 코드 프로그램으로 컴파일되며 각 명령어는 JVM을 통해 다른 플랫폼의 기계 코드로 변환되며 특정 플랫폼을 통해 실행됩니다.
JVM의 메모리 영역은 주로 다음과 같이 나뉩니다 : 메소드 영역, JVM 스택, 힙, 로컬 메소드 스택, 프로그램 카운터
프로그램 카운터 : 현재 실행 된 명령을 기록하는 데 사용되는데, 이는 OOM이없는 유일한 영역입니다.
JVM 스택 : 스레드는 비공개입니다. 각 스레드는 동시에 JVM 스택을 만듭니다. 로컬 기본 변수는 현재 스레드, 부분 반환 결과, 스택 프레임 및 객체 참조 주소에 저장합니다.
힙 : 스레드 공유, 일부 객체와 어레이를 저장하는 데 사용됩니다. 공유되므로 자물쇠가 필요하므로 오버 헤드가 높아집니다.
방법 영역 :이 방법 영역은 지속적인 생성에 해당하며, 클래스의 정보 (이름, 수정 자 등), 클래스의 정적 변수, 클래스에 최종 등급 등이 정의 된 상수 등을 저장하는 지속적인 생성에 해당합니다.
로컬 메소드 스택 : 기본 메소드의 실행을 지원하고 각 기본 방법의 호출 상태를 저장하는 데 사용됩니다.
Java Garbage Collection은 주로 힙 및 방법 영역에 중점을 둡니다. 힙은 새로운 세대와 구식으로 나뉘어 있으며 일반적으로 방금 새로운 물체는 새로운 세대에 배치됩니다. 그리고 새로운 세대는 에덴 지역과 2 개의 생존자 지역으로 나뉩니다.
쓰레기 수집의 메커니즘은 다음과 같습니다. 먼저 어떤 객체가 쓰레기, 즉 더 이상 사용되지 않는지를 결정한 다음 해당 알고리즘 (마크-클리어링 알고리즘, 알고리즘 복사, 마크 조정 알고리즘, 세대 수집 알고리즘)을 사용하여 쓰레기를 수집합니다.
1. 마크 클리어링 알고리즘 :
그것은 두 단계의 스테이지, 마킹 단계 및 청소 단계로 나뉩니다. 먼저 재활용 해야하는 물체를 표시 한 다음 마킹 물체가 차지하는 공간을 재활용하십시오.
구현은 비교적 간단하지만, 그 단점은 메모리 조각을 쉽게 생성 할 수 있다는 점에서 향후 큰 물체에 공간을 할당 할 때 충분한 메모리를 찾을 수 없으며 새로운 쓰레기 수집 조치를 미리 트리거 할 수 없다는 것입니다.
2. 알고리즘 복사 :
마크 청소 알고리즘의 단점을 해결하기 위해 사본 알고리즘은 용량에 따라 메모리를 동일한 크기의 두 영역으로 나누고 한 번에만 사용됩니다. 한 조각을 소비 한 후에는 아직 서명적인 물체가 다른 영역으로 복사 된 다음 사용 된 영역이 정리되어 조각화가 쉽게 발생하지 않습니다.
메모리 파편화 문제는 해결되지만 단점은 사용 된 메모리가 원본의 절반으로 줄어들고 복사 효율은 생존 객체의 수와 관련이 있다는 것입니다. 숫자가 크면 효율이 크게 줄어 듭니다.
3. 마킹 조직 알고리즘
사본 알고리즘의 결함을 해결하기 위해, 마크-시기 알고리즘이 탄생했으며, 마킹 단계는 마크 청소 알고리즘과도 같았습니다. 먼저, 재활용 해야하는 물체는 표시되지만, 직접 재활용되지는 않지만 살아남은 모든 물체를 다른쪽으로 이동 한 다음 경계 외부의 메모리를 정리합니다.
4. 세대 수집 알고리즘
이것은 현재 가장 일반적으로 사용되는 알고리즘입니다. 핵심 아이디어는 물체의 생존주기에 따라 메모리를 여러 다른 영역으로 나누는 것입니다. 일반적으로 힙 영역은 새로운 세대와 구식으로 나뉩니다. 구식의 특징은 쓰레기를 수집 할 때마다 재활용해야 할 물체가 적고, 새로운 세대가 더 많으므로 다른 알고리즘이 채택된다는 것입니다.
현재 대부분의 새로운 세대는 사본 알고리즘을 사용하지만 실제로 새로운 세대는 1 : 1 비율로 나뉘 지 않습니다. 일반적으로, 새로운 세대는 더 큰 에덴 공간과 2 개의 작은 생존자 공간으로 나뉩니다. 에덴 공간과 생존자 공간 중 하나가 사용될 때마다 재활용 할 때 에덴과 생존자의 아직 서식을하는 물체는 다른 생존자 공간에 복사되고 방금 사용 된 생존자 공간이 청소됩니다.
노년은 적은 수의 객체 만 매번 재활용되기 때문에 Mark-Compact 알고리즘이 일반적으로 사용됩니다.
클래스 클래스, 상수, 메소드 설명 등을 저장하는 데 사용되는 Permanet Generation 인 Heap Area 외부에 다른 세대가 있습니다. 영구 생성의 재활용은 주로 상수와 쓸모없는 클래스의 두 부분을 재활용합니다.
그렇다면 어떤 물체가 "쓰레기"인지 어떻게 결정합니까?
방법 1. 참조 계산 방법 :
Java에서는 참조를 통해 객체와 관련이 있습니다. 즉, 객체를 작동하려면 참조를 통해 수행해야합니다. 그런 다음 쉬운 방법은 참조 계수로 물체를 재활용 할 수 있는지 판단하는 것이 분명합니다. 일반성을 잃지 않고 객체에 관련된 참조가없는 경우, 객체가 기본적으로 다른 곳에서 사용되지 않을 가능성이없고 객체가 재활용 가능한 객체가된다는 것을 의미합니다. 이 방법은 참조 계산 방법이됩니다.
장점 : 간단한 구현 및 고효율
단점 : 원형 참조 문제를 해결할 수 없습니다
방법 2. 접근성 분석 방법 :
이 방법의 기본 아이디어는 일련의 "GC 루트"객체를 시작점으로 검색하는 것입니다. "GC 루트"와 물체 사이에 접근 가능한 경로가 없으면 물체는 도달 할 수 없다고합니다. 그러나 도달 할 수없는 것으로 판단 된 물체가 반드시 재활용 가능한 물체가 될 필요는 없다는 점에 유의해야합니다. 도달 할 수없는 것으로 판단되는 물체는 재활용 가능한 물체가되기 위해 적어도 두 개의 마킹 프로세스를 거쳐야합니다. 이 두 가지 마킹 프로세스에서 재활용 가능한 물체가 될 가능성이 여전히 없다면 기본적으로 재활용 가능한 물체가됩니다.
GC 루츠 일 수있는 객체는 무엇입니까?
1. JVM 스택 (스택 프레임의 로컬 변수 테이블)에서 참조 된 객체.
2. 메소드 영역에서 클래스 정적 속성에 의해 참조 된 객체.
3. 방법 영역에서 상수에 의해 참조 된 물체
4. 로컬 메소드 스택에서 JNI (즉, 일반적인 기본 방법)에 의해 참조 된 객체.
프로그래머의 경우 일부 방법을 통해 GC 오버 헤드를 줄일 수도 있습니다.
1. System.gc () 메소드를 표시하지 마십시오
2. 임시 물체의 사용을 최소화하십시오
3. 객체가 사용되지 않으면 디스플레이 설정이 널로 설정됩니다.
4. String 축적 된 문자열 대신 StringBuilder를 사용해보십시오.
5. 기본 유형의 변수 (int long)를 사용할 수있는 경우 객체를 사용하지 마십시오 (Integer, Long).
6. 정적 객체 변수를 최대한 적게 사용하십시오
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!