메모리의 객체에 참조가 없으면 물체가 더 이상 사용되지 않으며 쓰레기 수집 후보가 될 수 있음을 의미합니다. 그러나 쓰레기 수집기의 실행 시간은 불확실하기 때문에 쓰레기를 수집 할 수있는 물체의 실제 재활용 시간은 불확실합니다. 객체의 경우, 참조가있는 한 항상 메모리에 존재합니다. JVM의 총 메모리를 초과하는 이와 같은 객체가 점점 더 많으면 JVM이 외부에서 오류를 방해합니다. 쓰레기 수집의 특정 작동은 JVM에 의해 제어되지만 개발자는 여전히 쓰레기 수집기와 어느 정도 상호 작용할 수 있으며, 목적은 쓰레기 수집기가 응용 프로그램의 메모리를 더 잘 관리하는 데 도움이됩니다. 이 상호 작용 방법은 JDK 1.2에서 소개 한 java.lang.ref 패키지를 사용하는 것입니다.
1 강한 인용문
강력한 인용은 가장 일반적인 인용입니다. 물체에 강력한 참조가 있으면 쓰레기 수집기는 결코 그것을 재활용하지 않습니다. 메모리 공간이 충분하지 않으면 Java 가상 머신은 프로그램이 비정상적으로 종료 될 수 있도록 메모리 오류 오류를 던지고, 불충분 한 메모리 문제를 해결하기 위해 강력한 참조로 개체를 재활용하지 않습니다.
예를 들어, 날짜 날짜 = 새 날짜 (), 날짜는 객체에 대한 강력한 참조입니다. 객체에 대한 강력한 참조는 프로그램의 모든 곳에서 전달 될 수 있습니다. 대부분의 경우 여러 참조는 동시에 동일한 객체를 가리 킵니다. 강한 참조의 존재는 메모리에서 물체의 생존 시간을 제한합니다. 객체 A가 객체 B에 대한 강력한 참조를 포함하는 경우, 일반적으로 대상 B의 생존 시간은 물체 A보다 짧지 않습니다. 객체 A가 명시 적으로 객체 B의 기준을 NULL로 설정하지 않으면 물체 A가 수집 된 후에 만 대상 B는 더 이상 참조를 가리키지 않으며, 수집 할 수있는 기회를 얻을 수 있습니다.
예제 코드 :
package com.skywang.java; public class strongreferencetest {public static void main (String [] args) {mydate date = new MyDate (); System.gc (); }} 실행 결과 :
<출력 없음>
결과는 쓰레기 수집이 명시 적으로 호출 되더라도 날짜에 대한 강력한 참조이며 날짜는 재활용되지 않음을 보여줍니다.
Java.lang.ref 패키지는 강력한 참조 외에도 객체에 대한 다른 참조 방법을 제공합니다. JVM의 쓰레기 수집가는 다양한 유형의 참조를 처리하는 방법이 다릅니다.
2 소프트 인용문
객체에 소프트 참조 만있는 경우 메모리 공간이 충분하고 쓰레기 수집기가 재활용되지 않습니다. 메모리 공간이 충분하지 않으면 이러한 물체의 메모리가 재활용됩니다. 쓰레기 수집기가 재활용되지 않는 한, 객체는 프로그램에서 사용할 수 있습니다. 소프트 참조는 메모리에 민감한 캐시를 구현하는 데 사용될 수 있습니다.
소프트 참조는 참조 큐 (참조 큐)과 함께 사용할 수 있습니다. 소프트 레퍼런스에 의해 언급 된 물체가 쓰레기 수집기에 의해 재활용되면 Java 가상 머신은 관련 참조 큐에 소프트 참조를 추가합니다.
소프트 참조는 강한 강한 참고 문헌보다 약하며 Softreference로 표시됩니다. 그 기능은 프로그램의 객체가 덜 중요하며 메모리가 불충분 할 때 일시적으로 재활용 할 수있는 쓰레기 수집기를 알려주는 것입니다. JVM에 메모리가 불충분 한 경우, 쓰레기 수집기는 소프트 참조로만 가리키는 물체를 자유롭게합니다. 이 모든 객체가 해제되고 메모리가 불충분하면 외부의 오류가 발생합니다. 소프트 참조는 캐시를 만드는 데 이상적입니다. 시스템이 충분하지 않으면 캐시의 내용을 해제 할 수 있습니다. 예를 들어 이미지 편집기 프로그램을 고려하십시오. 이 프로그램은 쉽게 처리 할 수 있도록 이미지 파일의 모든 내용을 메모리로 읽습니다. 사용자는 동시에 여러 파일을 열 수도 있습니다. 파일이 너무 많으면 동시에 열려 있으면 메모리가 충분하지 않을 수 있습니다. 소프트 참조를 사용하여 이미지 파일의 내용을 가리키면 가비지 수집기가 필요할 때이 메모리를 되 찾을 수 있습니다.
예제 코드 :
package com.skywang.java; import java.lang.ref.softreference; public class softreferencetest {public static void main (string [] args) {softreference ref = new softreference (new MyDate ()); 참고 문헌.DrainMemory (); }} 실행 결과 :
<출력 없음>
결과 : 메모리가 불충분하면 소프트 참조가 종료됩니다. 소프트 참조가 금지되면
softreference ref = new softreference (new mydate ()); referenceTest.drainMemory ();
동등합니다
mydate date = new MyDate (); // if (jvm.Insolficifior memory ()) {date = null; System.gc ();} 3 개의 약한 인용문
약한 기준은 강도의 소프트 참조보다 약하며 약한 회의 클래스로 표현됩니다. 그것의 목적은 물체를 언급하는 것이지만 물체가 재활용되는 것을 막지는 못합니다. 참조가 존재하는 한 강력한 참조가 사용되는 경우 참조 된 객체를 재활용 할 수 없습니다. 약한 인용에는이 문제가 없습니다. 쓰레기 수집기가 실행될 때, 물체에 대한 모든 참조가 약한 참조 인 경우, 물체가 재활용됩니다. 약한 참고 문헌의 기능은 강력한 참조로 가져온 생존 시간의 물체 간의 결합 관계를 해결하는 것입니다. 약한 참조의 가장 일반적인 사용은 컬렉션 클래스, 특히 해시 테이블에 있습니다. 해시 테이블 인터페이스를 사용하면 모든 Java 객체를 키로 사용할 수 있습니다. 키 값 쌍이 해시 테이블에 넣으면 해시 테이블 객체 자체는 이러한 키 및 값 객체를 참조합니다. 이 참조가 강력한 참조 인 경우 해시 테이블 객체 자체가 여전히 살아있는 한, 그 안에 포함 된 키 및 값 객체는 재활용되지 않습니다. 생존 시간이 긴 해시 테이블에 많은 키 값 쌍이 포함 된 경우 결국 JVM의 모든 메모리를 소비 할 수 있습니다.
이 상황에 대한 해결책은 해시 테이블의 키와 가치 객체를 모두 수집 할 수 있도록 약한 참조를 사용하여 이러한 객체를 참조하는 것입니다. 이 일반적인 요구를 충족시키기 위해 Java에서 약한 하슈 맵이 제공됩니다.
샘플 코드 :
패키지 com.skywang.java; import java.lang.ref.weakreference; public class weackreferencetest {public static void main (string [] args) {약점 참조 = 새로운 약점 (new mydate ()); System.gc (); }} 실행 결과 :
OBJ [날짜 : 1372142034360]는 GC입니다
결과 : JVM 쓰레기 수집이 실행되면 약한 참조가 종료됩니다.
약점 ref = 새로운 약점 (new mydate ()); system.gc ();
동등한 :
mydate date = new MyDate (); // Garbage Collection if (jvm.Insolficifior Memory ()) {date = null; System.gc ();} 약한 참조와 소프트 참조의 차이점은 참조가 약한 물체가 수명주기가 짧다는 것입니다. 가비지 수집기 스레드가 관할권 아래에서 메모리 영역을 스캔하는 과정에서, 약한 참조 만있는 물체가 발견되면, 현재 메모리 공간이 충분한 지 아닌지에 관계없이 메모리가 재활용됩니다. 그러나 쓰레기 수집기는 우선 순위가 매우 낮은 실이기 때문에 참조가 약한 물체의 경우 반드시 매우 빠르게 발견 될 필요는 없습니다.
약한 참조는 참조 큐 (참조 큐)과 함께 사용할 수 있습니다. 약한 기준으로 참조 된 물체가 수집 된 쓰레기 인 경우 Java 가상 머신은 관련 참조 대기열에 대한 약한 참조를 추가합니다.
4 환상 인용문
Ghost Quotes라고도합니다 ~ Ghost 따옴표를 소개하기 전에 먼저 Java가 제공하는 객체 종단 메커니즘을 소개해야합니다. 객체 클래스에는 최종 메소드가 있습니다. 디자인의 원래 의도는 물체가 실제로 재활용되기 전에 일부 청소 작업을 수행하는 것입니다. Java는 C ++ 파괴자와 유사한 메커니즘을 제공하지 않기 때문에 최종 방법을 통해 구현됩니다. 그러나 문제는 쓰레기 수집기의 실행 시간이 고정되지 않았으므로 이러한 청소 작업의 실제 실행 시간을 예측할 수 없다는 것입니다. 팬텀 참조는이 문제를 해결할 수 있습니다. Ghost Reference Phantomreference를 만들 때는 참조 큐를 지정해야합니다. 객체의 최종 방법이 호출되면 객체의 유령 참조가 큐에 추가됩니다. 대기열의 내용을 확인하면 객체를 재활용 할 준비가되었는지 알 수 있습니다.
유령 참조와 그 대기열의 사용은 드물며 주로 모바일 장치에 매우 의미가있는 비교적 미세한 메모리 사용 제어를 구현하는 데 사용됩니다. 이 프로그램은 객체를 재활용 해야하는지 결정한 후 메모리를 요청할 수 있습니다. 이러한 방식으로, 프로그램에 의해 소비 된 메모리는 상대적으로 적은 양으로 유지 될 수있다.
예를 들어, 다음 코드는 버퍼 구현의 예를 제공합니다.
공개 클래스 Phantombuffer {private byte [] data = new Byte [0]; private referencequeue <byte []> queue = new ReferenceQueue <byte []> (); 개인 phantomreference <byte []> ref = new phantomreference <byte []> (data, queue); public byte [] get (int size) {if (size <= 0) {새로운 불법 불법 행위 렉스크 ( "잘못된 버퍼 크기"); } if (data.length <size) {data = null; System.gc (); // 힘을 실행하여 쓰레기 수집기를 시도하십시오 {queue.remove (); //이 메소드는 대기열이 비어 있지 않을 때까지 차단됩니다. Ref.clear (); // 고스트 참조가 자동으로 지우지 않으면 ref = null을 실행해야합니다. 데이터 = 새로운 바이트 [크기]; ref = new phantomreference <byte []> (data, queue); } catch (InterruptedException e) {e.printstacktrace (); }} 반환 데이터; }} 위의 코드에서 새로운 버퍼가 적용될 때마다 먼저 이전 버퍼의 바이트 어레이가 성공적으로 재활용되었는지 확인합니다. 큐를 참조하는 제거 메소드는 새로운 고스트 참조가 큐에 추가 될 때까지 차단됩니다. 그러나이 접근법으로 인해 쓰레기 수집기가 너무 많이 실행되므로 프로그램이 너무 낮은 처리량이 될 수 있습니다.
샘플 코드 :
package com.skywang.java; import java.lang.ref.ref.ref.ref.ref.ref.ref.phantomreference; public class phantomreferencetest {public static void main (String [] args) {referencequeue queue = new ReferenceQueue (); phantomreference ref = 새로운 phantomreference (new mydate (), 큐); System.gc (); }} 실행 결과 :
OBJ [날짜 : 1372142282558]는 GC입니다
결과는 환상 참조가 인스턴스화 후 종료됨을 보여줍니다.
ReferenceQueue queue = new ReferenceQueue (); phantomreference ref = new phantomreference (new mydate (), queue); System.gc ();
동등한 :
mydate date = new mydate (); date = null;