[java] Java에서 가비지 수집을 강제하는 방법은 무엇입니까?

까다로운 경우에도 Java에서 가비지 수집을 강제 할 수 있습니까? 내가 알고 System.gc();하고 Runtime.gc();있지만, 그들은 단지 GC를 수행하는 것이 좋습니다. GC를 어떻게 강제 할 수 있습니까?



답변

가장 좋은 방법은 System.gc()가비지 수집기에서 수집하려는 힌트를 간단히 호출 하는 것입니다. 가비지 수집기는 비 결정적이므로 강제 로 즉시 수집 할 수있는 방법이 없습니다 .


답변

jlibs 라이브러리는 가비지 컬렉션에 대한 좋은 유틸리티 클래스가 있습니다 . WeakReference 객체 로 멋진 작은 트릭을 사용하여 가비지 수집을 강제 할 수 있습니다 .

jlibs의 RuntimeUtil.gc () :

   /**
    * This method guarantees that garbage collection is
    * done unlike <code>{@link System#gc()}</code>
    */
   public static void gc() {
     Object obj = new Object();
     WeakReference ref = new WeakReference<Object>(obj);
     obj = null;
     while(ref.get() != null) {
       System.gc();
     }
   }


답변

GC를 강제하는 가장 좋은 방법은 사용자 지정 JVM을 작성하는 것입니다. 가비지 콜렉터는 플러그 가능하므로 사용 가능한 구현 중 하나를 선택하여 조정할 수 있다고 생각합니다.

참고 : 이것은 쉬운 대답이 아닙니다.


답변

은 Using 자바 (Java ™) 가상 공작 기계 인터페이스 (JVM TI)를 함수

jvmtiError ForceGarbageCollection(jvmtiEnv* env)

“VM이 가비지 수집을 수행하도록합니다.” JVM TI는 Java 플랫폼 디버거 아키텍처 (JPDA)의 일부 입니다.


답변

, 거의 같은 순서로 메소드를 호출해야하며 동시에이 메소드는 다음과 같습니다.

System.gc ();
System.runFinalization ();

이 두 메소드의 사용을 동시에 청소하는 하나의 오브젝트 일지라도 가비지 콜렉터 finalise()는 도달 할 수없는 오브젝트 의 메소드 를 사용하여 지정된 메모리를 해제하고 finalize()메소드 상태를 수행합니다.

그러나 가비지 수집기를 사용하면 메모리보다 최악의 소프트웨어에 과부하가 발생할 수 있기 때문에 가비지 수집기를 사용하는 것이 끔찍한 관행이지만 가비지 수집기는 자체 스레드를 가지고 있기 때문에 제어 할 수 없습니다. gc가 사용하는 알고리즘은 더 많은 시간이 걸리고 매우 비효율적 인 것으로 간주됩니다. gc의 도움으로 소프트웨어가 최악인지 확인해야합니다. 확실히 파산되었으므로 좋은 해결책은 gc에 의존해서는 안됩니다.

참고 : 이것은 finalize 메소드에서 객체를 재할 당하지 않는 경우에만 작동합니다.이 경우 객체가 살아 있으면 기술적으로 가능한 부활을 갖게됩니다.


답변

OutOfMemoryError에 대한 문서에 따르면 VM이 전체 가비지 수집 후 메모리를 회수하지 않으면 발생하지 않는다고 선언합니다. 따라서 오류가 발생할 때까지 메모리 할당을 계속하면 이미 전체 가비지 수집을 수행했을 것입니다.

아마 당신이 정말로 묻고 싶은 질문은 “가비지 수집으로 회수해야한다고 생각하는 기억을 어떻게 되 찾을 수 있을까?”였습니다.


답변

System.gc ()가 아닌 GC를 수동으로 요청하려면 다음을 수행하십시오.

  1. 이동 : JDK의 bin 폴더 (예 : C : \ Program Files \ Java \ jdk1.6.0_31 \ bin)
  2. jconsole.exe를 엽니 다
  3. 원하는 로컬 프로세스에 연결하십시오.
  4. 메모리 탭으로 이동하여 GC 수행을 클릭하십시오.