Java 프로모션의 JVM 객체 라이프 사이클
전언
지난주에 반영된 내용이 초보자에게는 어려웠는데 사실 너무 많은 내용을 말해서 모든 사람에게 생동감 있게 이해할 수 없게 하고 나중에 주의할 것이라고 생각합니다.여기에는 학습 지식에 적용되는 두 가지 건의가 있다.
1. 대추를 통째로 삼키지 말고 이론적 지식을 한 글자 한 글자 보아야 한다
2. 적당하고 고정된 지식원을 선정하고 홈페이지와 고전 서적을 우선하여 학습 관성을 기르기
내가 블로그를 쓰는 목적은 모두가 이해하기 어려운 개념을 더욱 잘 이해하게 한 다음에 다시 문제를 깊이 토론할 수 있도록 하는 것이다
JVM에서 객체의 라이프 사이클을 소개하는 이번 호에서는 흔히 볼 수 있고 기초적인 문제라고 할 수 있습니다. 여기서 다시 꺼내서 다시 정리하면 독자들에게 도움이 되었으면 합니다.
카탈로그
전언
하나, 자바 대상의 본질
2.'쓰레기'를 어떻게 식별하는가
셋째, 회수 기간에 어떻게 자바 대상을 구할 것인가
넷째, 방법 구역에서 GC를 실행할 수 있습니까
하나, 자바 대상의 본질
Java 객체 소개
Java 객체는 Java 클래스에서 생성된 엔티티입니다.
개념 자체는 논의할 만한 것이 없지만 왜 우리는 자바 대상의 개념을 이렇게 중시해야 합니까?아니면 대상이 자바에 어떤 특수성이 있나요?
메모리 분배와 쓰레기 회수부터
자바와 C++ 사이에는 메모리 동적 분배와 쓰레기 수집 기술로 둘러싸인 높은 벽이 있는데, 바깥 사람은 들어가고, 안 사람은 나오고 싶다.
C++ 프로그래밍은 생성된 모든 대상의 생명 주기와 메모리를 제어하고 세밀한 관리를 해야 한다.Java는 대상의 탄생, 메모리 분배와 소멸을 JVM에 맡겼다.이로 인해 JVM을 이해하지 못하면 자바 대상이 기계에 있는 상태를 이해하지 못하고 자바를 전면적으로 이해하지 못한다.또한 실제 생산 환경에서 대량의 JVM과 관련된 문제에 부딪힐 수 있기 때문에 JVM을 이해하면 반드시 당신이 JVM을 개발하는 것이 아니라 당신의 자바 프로그램을 더욱 잘 이해할 수 있다.
그래서 당신이 Object o를 만들 때 인용을 만들었습니다.
new Object () 에서 이미 객체를 만들었습니다.
Object o = new Object () 는 JVM에 맡겨 메모리 공간을 할당하고 코드와 JVM을 통해 JVM의 자바 대상으로서의 일생을 관리하는 o로 인용된 Object 대상을 만들었다.
객체 참조
대상 인용은 위쪽만 있는 것이 아니라 JDK1에서2부터 자바 인용은 모두 네 가지가 있습니다(강도는 순서대로 감소).
강인용
강제 인용은 바로 위의 이런 형식이다.
Object o = new Object()
인용이 존재하고 JVM이 쓰레기를 회수하는 규칙에 부합되지 않으면 회수되지 않으며 우리가 대부분 사용하는 대상 인용이다.
소프트 참조
SoftReference ref = new SoftReference("Hello world")
SoftReference를 통해 시스템에서 메모리 넘침 이상이 발생하면 이 대상을 회수 범위에 열거하고 2차 회수합니다.
캐시로 사용할 수 있는 디자인
약인용
WeakReference abcWeakRef = new WeakReference(abc);
약한 인용과 관련된 대상은 메모리가 충분하든 부족하든 다음 쓰레기 수거가 발생하기 전까지만 살아남을 수 있다.
거짓 인용
PhantomReference abcWeakRef = new PhantomReference(abc,referenceQueue);
허인용은 실제 대상의 생명주기에 영향을 주지 않습니다. 쓰레기 수거기가 대상을 회수하려고 할 때 허인용이 있는 것을 발견하면 회수 대상의 메모리에 들어가기 전에 이 허인용을 관련 인용 대기열에 추가합니다.네가 허위 인용을 성명할 때queue에 전달해야 한다.인용된 대상이 finalize 함수를 실행했을 때,queue에 대상을 추가합니다.queue에 대상이 있는지 아닌지를 판단해서 대상이 회수되는지 아닌지를 판단할 수 있습니다.
2.'쓰레기'를 어떻게 식별하는가
대상의 생존 여부를 어떻게 판정하고, 쓰레기 대상의 제거 시간을 어떻게 처리합니까?일반적으로 다음과 같은 두 가지 방법이 있다.
참조 개수
인용 계수는 기초 계산 인용의 방법이다.
간단하게 말하면 대상이 한 번 인용되고, 대상의 머리에 인용 횟수를 한 번 더하며, 인용되지 않으면 이 대상은 회수할 수 있다.
//
Obj a = new Obj();
Obj b = new Obj();
// Obj member Obj,a b
a.member = b;
b.member = a;
// a b JVM
a = null;
b = null;
그러나 현재 gc는 인용계수를 사용하여 대상의 생존 여부를 판단하지 않고 일반적으로 뿌리 검색 방법을 사용하는데 가달성 분석이라고도 부른다.
가달성 분석
가달성 알고리즘의 원리는 GC Root이라는 일련의 대상을 기점으로 출발하여 그들이 가리키는 다음 노드를 끌어내고 다음 노드를 기점으로 하여 이 노드가 가리키는 다음 결점을 끌어낸다(이렇게 GC Root을 통해 연결된 선을 인용체인이라고 한다). 모든 결점을 두루 훑어보고 관련 대상이 GC Root을 기점으로 하는 인용체인에 없으면이 대상들은 쓰레기 대상으로 판단되고 GC에서 회수된다.
GC Root의 네 가지 객체로 사용할 수 있습니다.
GC Root을 이해하려면 JVM의 메모리 모델을 파악해야 한다. 스레드가 공유되지 않은 가상 머신 창고에 저장된 것은 이 스레드에 필요한 대상 인용이고, 로컬 방법 창고에native 방법(C++ 또는 다른 언어로 전환하는 방법)의 인용 대상을 저장해야 한다.정적 및 상수의 라이프 사이클은 Java 프로그램에서 프로그램 소멸과 함께 객체 참조이므로 위 참조는 GC Root으로 사용할 수 있습니다.
셋째, 회수 기간에 어떻게 자바 대상을 구할 것인가
JVM을 깊이 있게 이해하는 과정에서 회수 기간에 자바 대상을 구하는 것에 대해 논술한 적이 있다.그 원리는 회수된 대상이finalize 방법을 덮어쓰고 가달성 분석 표지인 GCRoot 인용체인을 실현한 후에 이 대상을 하나의 특수 대기열에 놓고 다른 라인을 열어 주 회수 GC가 완성된 후에 특수 대기열의 예비 회수 대상을 표시하여 회수하는 것이다. 우리는 이 시간차 제어 대상을 이용하여 GCRoot 인용체인을 다시 추가하여 구제할 수 있다.그러나 이렇게 제어하지 않으면 JVM이 붕괴될 수 있으므로 이렇게 실현하는 것을 권장하지 않는다.
넷째, 방법 구역에서 GC를 실행할 수 있습니까
영구 대역 및 방법 영역
방법 영역은class에 대한 정보를 저장하는 데 사용됩니다.영구 세대와 방법구의 관계는 자바의 클래스와 인터페이스의 관계에 해당한다.많은 쓰레기 수거기는 영구 세대 개념이 없고 영구 세대는 HotSpot 가상 기기가 가상 기기 규범에 대한 방법 구역의 일종의 실현 방식이다.JDK8 이후 방법구의 실현은 원 공간에 맡겼다. 영구적으로 하나의 JVM 자체가 고정된 크기의 온라인을 설정하여 조정할 수 없다. 원 공간은 직접 메모리를 사용하고 본 컴퓨터의 사용 가능한 메모리의 제한을 받으며 OutOfMemory Error를 영원히 받지 못한다.
영구적인 쓰레기 수거:
스팸 수거 효율이 낮은 방법론에서는 일반적으로 두 가지 유형의 데이터를 수거합니다.
폐기 상수
폐기 상수는 언제 회수합니까?
폐기 상수는 무더기의 대상 회수와 유사하며 상수지의 상수가 다른 곳에서 인용되지 않을 때 실행 방법 구역의 GC는 회수됩니다
무용류
쓸모없는 종류를 어떻게 판단합니까?
이 종류의 모든 실례는 이미 회수되었고, 더미에는 이 종류의 어떠한 실례도 존재하지 않는다
이 클래스를 불러오는classloader가 회수되었습니다
이 클래스에 대응하는java.lang.class 대상은 인용할 곳이 없습니다. 이 종류에 반사적으로 접근할 수 없는 방법입니다.
VM-Xnoclassgc 매개 변수를 설정하지 않음
Xnoclassgc 매개 변수에 대해 발사, 동적 에이전트, cglib 등 프레임워크, 예를 들어 Spring,hibernate 등을 대량으로 사용하려면 가상 기기가 클래스 마운트 해제 기능을 갖추고 방법 영역이 넘치지 않도록 해야 한다.클래스 오프로드 기능을 제한하고 PermSize 크기를 제한하면 메소드가 빠르게 오버플로우되므로 일반적으로 권장하지 않습니다.
참조:
1. JVM 심층 이해 - 주지명
2. 쓰레기 수거 설명:https://mp.weixin.qq.com/s/_AKQs-xXDHlk84HbwKUzOw
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GraalVM을 사용해보기GraalVM의 퍼포먼스, 그리고는, Graal을 JIT 컴파일러로서 이용했을 때의 퍼포먼스에 포커스 한 기사이므로, GraalVM의 특징의 하나인 native image나, multiple languages등에 관...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.