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


225

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


30
아마도 GC를 강제해야하는 이유에 대한 배경 지식을 제공하는 것이 도움이 될 것입니다. 일반적으로 가비지 수집 언어에서는 명시 적으로 수집기를 호출하는 것은 좋지 않습니다.
Justin Ethier

3
주어진 JVM은 각각 고유 한 장단점이있는 여러 가비지 수집 방법을 제공 할 수 있으며 시작시 JVM에 힌트를 주어 간단히 주어진 상황을 피할 수 있습니다. 시나리오를 자세히 설명하십시오.
Thorbjørn Ravn Andersen

3
jmap -histo : live <pid> stackoverflow.com/questions/6418089/…

5
가비지 수집을 강제하는 유스 케이스는 다음과 같습니다. 30GB 힙을 가진 서버가 있는데 ~ 12GB가 일반적으로 사용됩니다 (~ 5M 개체). 5 분마다 서버는 약 35 분의 추가 개체가 사용되는 복잡한 작업을 수행하는 데 약 1 분이 소요됩니다. 복잡한 작업 중에는 항상 GC가 한 시간에 두 번 트리거되고 10 ~ 15 초 동안 VM이 정지됩니다. 복잡한 작업이 실행되고 있지 않을 때 전체 GC를 강제로 실행하고 싶습니다. 그런 다음 40M이 아닌 5M 라이브 오브젝트를 저글링합니다.
Steve

3
@JustinEthier java.lang.ref.Reference 타입 계층 구조와 관련된 동작을 단위로 테스트하는 GC를 강제로 적용 할 수있는 확실한 사례가있다.
Elias Vasylenko

답변:


168

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


28
있어야합니다. non-deterministic == trouble
Pacerier

7
가비지 수집기는 비 결정적 일 수 있으며 즉시 수집을 강제 할 수있는 방법을 제공합니다. 예를 들어 일반적으로 .NET 수집기는 비 결정적이지만 GC.Collect ()를 호출하면 강제로 실행됩니다. Java 가이 기능을 노출시키지 않기로 결정한 것입니다.
Petr Hudeček

2
내 경험상이 메소드는 항상 가비지 콜렉터를 호출합니다. 메모리 사용 플롯과 선언 된 객체 수는 항상 엄격하게 선형이어야합니다 (패딩 등을 고려할 때).
Jim Pivarski

새로운 객체를 할당하고 더 이상 참조하지 않으면 가비지 수집기가 자동으로 실행됩니다.
Bionix1441

@ PetrHudeček 실제 응용 프로그램에서는 .NET GC.Collect()이 수집하지 않습니다. 자바 gc()에서는 그렇지 않습니다.
ajeh

53

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();
     }
   }

1
이 코드는 참조가 약하게 접근 가능 해지 자마자 메모리에서 지워지기 전에 약한 참조가 지워지기 때문에 손상되었습니다.
Marko Topolnik 2016 년

1
"메모리가 재생되었습니다"와 "GC가 실행되었습니다"의 의미를 혼동시킬 수 있습니다. 개체가 존재하고 아직 완성되지 않았지만 약한 참조를 통해 더 이상 액세스 할 수 없습니다. 다소 더 좋은 방법은을 사용하는 것입니다 PhantomReference로모그래퍼 ReferenceQueue하지만 여전히 정리하기 전에, 다음은 종결 후 통지를받을 것입니다. 마지막으로,이 개체의 메모리가 회수되었음을 성공적으로 감지하더라도 HotSpot과 같은 세대 GC에서는 여전히 거의 의미가 없습니다. 일반적으로 그것은 젊은 세대의 정리와 일치합니다.
Marko Topolnik

20
OP는 "가비지 수집 강제 실행"에 대한 솔루션을 요청했으며 귀하가 제공한다고 주장했습니다. GC 서브 시스템을 실행하는 것은 실제로 가비지를 수집하는 것입니다. 귀하가 제공 한 코드 샘플에는 가비지 수집이 확실하게 의도되어 있습니다. 어쨌든 이것은 매우 오래된 질문이므로 OP의 희망에 관한 것이 아니라 일반 대중에게 유용합니다. 가비지 수집없이 "GC 하위 시스템을 강제로 실행"하는 데 관심이있는 사람은 없습니다. 실제로 사람들은 일반적으로 모든 쓰레기 가 수거되었다는 보장을 원합니다 .
Marko Topolnik

4
아마의 효율성과 비교하지는 않았지만 System.gc(); System.gc();그보다 더 잘 작동하는지 아는 것이 흥미로울 것입니다. 실제로, 몇 번만 호출 System.gc()하면 충분합니다. 2에 도달 할 수있는 기회는 상당히 적습니다.
Marko Topolnik

3
@MarkoTopolnik : '아무도 쓰레기를 모으지 않고 "GC 서브 시스템을 강제로 실행"하는 데 관심이 없습니다 .... 실제로 오늘이 행동에만 관심이있었습니다. 이 답변에 감사드립니다. 내 목적은 GC 로그 처리의 회전 동작을 확인하고 GC 출력 형식을 얻는 것이 었습니다. 이 작은 요령으로 GC 로그를 빠르게 채울 수있었습니다.
erik.weathers 17

49

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

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


40
lulz의 경우 +1 유머 감각이있는 사람보다 좌절스러운 디버깅을 더 잘하는 것은 없습니다. 실제로 유용한 대답 이외의 것입니다.
jsh


25

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

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

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

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

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


10
NO ,이 두 명령조차도 가비지 콜렉션을 강제하지 않습니다. 다른 사람들이 이미 언급했듯이 gc()가비지 수집을 실행하는 힌트 일뿐입니다. runFinalizers()"버려진 것으로 확인 된"개체에서만 종료자를 실행합니다. gc가 실제로 실행되지 않았다면 그러한 객체가 없을 수도 있습니다.
Steffen Heil

또한 System.runFinalization () 은 모든 것이 실행될 것이라고 보장하지 않습니다. 아무 일도 일어나지 않을 가능성이 있습니다. Javadoc 의 제안입니다 . "" 이 메소드를 호출하면 Java Virtual Machine은 버려졌지만 종료 메소드가 아직 실행되지 않은 오브젝트의 종료 메소드를 실행하는 데 노력을
기울이게됩니다

21

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

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


18

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

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

3
오해의 소지가 있습니다. "GC 수행"버튼을 마우스로 가리 키십시오. JVM에 GC를 수행하도록 요청할 수 있지만 절대 강제하지는 않습니다.
Kumaran

@PinkeshSharma, 이것은 강제 하지 않습니다 . 그것은 전적으로 무시 될 수있는 단순한 요청입니다.
Pacerier

@Pacerier 이상적인 세상에서 그렇습니다 .. 그러나 이렇게하면 즉시 메모리가 증가한다는 것을 알 수 있습니다.
Pinkesh Sharma

11

.gc는 향후 릴리스에서 제거 할 후보입니다. Sun 엔지니어는 한 번은 전 세계에서 20 명 미만이 실제로 .gc ()를 사용하는 방법을 알고 있다고 언급했습니다. SecureRandom이 생성 한 데이터를 사용하는 데이터 구조, 약 4 만 개가 넘는 개체에서 vm은 포인터가 부족한 것처럼 속도가 느려집니다. 분명히 그것은 16 비트 포인터 테이블을 질식 시켰고 고전적인 "실패한 기계"동작을 보여 주었다.

나는 -Xms 등을 시도하여 약 57, xxx 개의 무언가가 나올 때까지 비트를 돌리고 있었다. 그런 다음 gc () 이후에 57,127에서 57,128 사이의 gc를 실행합니다-캠프이지 머니 (Easy Money)의 코드 팽창 속도에 대해.

설계에는 근본적인 재 작업, 아마도 슬라이딩 윈도우 접근 방식이 필요합니다.


1
나는 메모리에 많은 객체가 할당을 해제 할 수없는 것과 같은 것을 가지고 있습니다. OutOfMemory 예외가 발생했습니다. 무한 객체 생성 프로세스가 있는지 또는 이러한 객체가 내 시스템에서 사용 중인지 여부를 GC에서 강제로 테스트하고 싶습니다.

당신이 똑같은 문제를 겪고있는 것처럼 들립니다. pls는 "무한 객체 생성"... 좋은 연구 프로젝트, 여기에 자바 영역에 질문이나 무언가를 게시 할 수 있습니다 (나는 여기서 새로운 것이지 사이트의 작동 방식에 대한 "Finite Automa"를 알고 있습니다.) 어제 시도해 컴파일러가 40,000 개의 base36에서 "너무 많은 코드"를 고소하면서 file.dat 작업을 마쳤습니다. BigIntegers가 정적 최종 문자열로 코딩되었습니다. 여기에 전체 JVM이 16 비트 포인터로 제한되어 있다고 추측합니다. 우리가해야 할 일은 적극적으로 널 (null) 적으로 디스크에서 읽어 오는 것입니다.
Nicholas Jordan

정말로, 나는 당신을 얻지 못합니다. 그러나 "무한 객체 생성"에 대해 명확하게 말하면, 큰 시스템에는 메모리에서 처리하고 살아있는 객체를 생성하는 일부 코드가 있다는 것을 의미했습니다. 실제로이 코드를 얻을 수는 없었습니다.

5
무의미한 말! 약한 참조를 사용하는 코드 테스트를 통해 약한 참조가 지워졌을 때 동작이 올바른지 확인할 수 있습니다.
Elias Vasylenko


6

JVM 사양은 가비지 수집과 관련하여 아무 것도 말하지 않습니다. 이로 인해 공급 업체는 GC를 자유롭게 구현할 수 있습니다.

따라서이 모호함은 가비지 콜렉션 동작에 불확실성을 유발합니다. 가비지 수집 방법 / 알고리즘에 대해 알고 싶다면 JVM 세부 정보를 확인해야합니다. 또한 동작을 사용자 정의하는 옵션도 있습니다.


4

가비지 수집을 강제해야하는 경우 리소스 관리 방법을 고려해야합니다. 메모리에 지속되는 큰 객체를 생성하고 있습니까? Disposable인터페이스가 있고 dispose()완료되면 호출하지 않는 큰 객체 (예 : 그래픽 클래스)를 작성 하고 있습니까? 클래스 수준에서 단일 메서드 내에서만 필요한 것을 선언하고 있습니까?


2

가비지 수집이 필요한 이유를 설명하면 더 좋습니다. SWT를 사용하는 경우 메모리 Image와 같은 자원을 제거 하고 Font메모리 를 비울 수 있습니다 . 예를 들어 :

Image img = new Image(Display.getDefault(), 16, 16);
img.dispose();

처리되지 않은 리소스를 결정하는 도구도 있습니다.


폐기 방법이 없으면 어떻게합니까?
ArifMustafa

1
질문과 전혀 관련이 없습니다! 아니요, SWT를 사용하지 않습니다. Delphi 네이티브 레이어를 통해 .NET 창을 여는 JNI 메소드를 호출하고 있습니다. 또한 네이티브 C ++ 레이어를 통해 데이터를 수신하는 FORTRAN 계산 코어가 있습니다. 그것은 무엇과 관련이 있습니까? GC를 강제 할 수 있습니까? 아니? :-(
Mostafa Zeinali

0

메모리가 부족하고 점점 더 많은 것을 얻는 OutOfMemoryException다면 java -Xms128m -Xmx512m그냥 대신 프로그램을 시작하여 java가 사용할 수있는 힙 공간을 늘려보십시오 java. 그러면 초기 힙 크기는 128Mb이고 최대 512Mb이며 표준 32Mb / 128Mb보다 훨씬 큽니다.


기본 메모리 설정은 다음과 같습니다java -Xms512M -Xmx1024M
ThePyroEagle

0

다른 옵션은 새 객체를 만들지 않는 것입니다.

객체 풀링Java에서 GC의 필요성을 줄이기 위해 이 사라졌습니다.

오브젝트 풀링은 일반적으로 오브젝트 작성 (가벼운 오브젝트의 경우)보다 빠르지 않지만 가비지 콜렉션보다 빠릅니다. 10,000 개의 객체를 만들고 각 객체가 16 바이트 인 경우 GC가 회수해야하는 160,000 바이트입니다. 반면에 동시에 10,000 개가 모두 필요하지 않은 경우 새 개체를 만들 필요가없고 오래된 개체를 GC 할 필요가없는 개체를 재활용 / 재사용 할 풀을 만들 수 있습니다.

이와 같은 것 (평가되지 않음). 스레드 안전을 원할 경우 ConcurrentLinkedQueue에 대한 LinkedList를 교체 할 수 있습니다.

public abstract class Pool<T> {
    private int mApproximateSize;
    private LinkedList<T> mPool = new LinkedList<>();

    public Pool(int approximateSize) {
        mApproximateSize = approximateSize;
    }

    public T attain() {
        T item = mPool.poll();
        if (item == null) {
            item = newInstance();
        }
        return item;
    }

    public void release(T item) {
        int approxSize = mPool.size(); // not guaranteed accurate
        if (approxSize < mApproximateSize) {
            recycle(item);
            mPool.add(item);
        } else if (approxSize > mApproximateSize) {
            decommission(mPool.poll());
        }
    }

    public abstract T newInstance();

    public abstract void recycle(T item);

    public void decommission(T item) { }

}

0

G1 GC가 포함 된 OracleJDK 10에서 단일 호출로 System.gc()GC가 이전 콜렉션을 정리합니다. GC가 즉시 실행되는지 확실하지 않습니다. 그러나 GC는 System.gc()루프에서 여러 번 호출 되더라도 Young Collection을 정리하지 않습니다 . GC가 Young Collection을 정리하게하려면 new byte[1024]을 호출하지 않고 루프 (예 :)로 할당해야합니다 System.gc(). System.gc()어떤 이유로 전화 하면 GC가 Young Collection을 정리하지 못합니다.


0

정말로, 나는 당신을 얻지 못합니다. 그러나 "무한 객체 생성"에 대해 명확하게 말하면 큰 시스템에는 메모리에서 처리하고 살아있는 객체를 생성하는 일부 코드가 있다는 것을 의미했습니다. 실제로이 코드를 얻을 수는 없었습니다.

이것은 올바른 제스처입니다. 여러 포스터에서 이미 제공 한 표준 답변이 거의 있습니다. 이것을 하나씩 보자.

  1. 이 코드를 실제로 얻을 수 없었습니다

맞습니다. 실제 jvm은 없습니다. 그냥 사양입니다. 원하는 동작을 설명하는 많은 컴퓨터 과학입니다 ... 나는 최근에 네이티브 코드에서 Java 객체를 초기화하는 것을 파헤 쳤습니다. 원하는 것을 얻으려면 유일한 방법은 적극적인 nulling을하는 것입니다. 잘못하면 실수가 너무 나빠서 질문의 원래 범위로 제한해야합니다.

  1. 내 큰 시스템의 일부 코드는 객체를 생성합니다.

여기에있는 대부분의 포스터는 인터페이스 작업을하고 있다고 가정 할 것입니다. 그러한 경우에는 한 번에 전체 객체 또는 한 항목을 건네 주는지 확인해야합니다.

더 이상 객체가 필요하지 않은 경우 객체에 null을 할당 할 수 있지만 잘못된 경우 null 포인터 예외가 생성됩니다. NIO를 사용하면 더 나은 작업을 수행 할 수 있습니다.

당신이나 나 또는 다른 사람이 얻을 때마다 : " 그 끔찍하게 필요합니다. "그것은 당신이 작업하려는 것을 거의 완전히 파괴하는 거의 보편적 인 선구자입니다 .... 작은 샘플 코드를 작성하십시오. 실제 코드를 사용하여 질문을 보여주십시오.

좌절하지 마십시오. 종종 이것이 해결되는 것은 dba가 어딘가에서 구입 한 패키지를 사용하고 있으며 원래의 디자인이 대규모 데이터 구조에 맞게 조정되지 않았기 때문입니다.

매우 흔합니다.


-1

참고로

System.runFinalizersOnExit (true) 메소드 호출은 Java가 종료되기 전에 종료 자 메소드가 호출되도록합니다. 그러나이 방법은 본질적으로 안전하지 않으며 더 이상 사용되지 않습니다. 대안은 Runtime.addShutdownHook 메소드를 사용하여“종료 훅”을 추가하는 것입니다.

마사 라트 시드 디키


셧다운 후크의 단점은 실제로 작동하지 않는다는 것입니다. 강제 종료가 작동하지 않고 0이 아닌 종료 코드가 작동하지 않으며 때로는 (공식) JVM이 실행 해야하는 한 단순히 실행되지 않습니다.
ThePyroEagle

-1

가비지 수집기를 강제하는 간접적 인 방법이 있습니다. 가비지 콜렉터가 실행될 때까지 임시 오브젝트로 힙을 채우면됩니다. 가비지 컬렉터를 이런 식으로 강제하는 클래스를 만들었습니다.

class GarbageCollectorManager {

    private static boolean collectionWasForced;
    private static int refCounter = 0;

    public GarbageCollectorManager() {
        refCounter++;
    }

    @Override
    protected void finalize() {
        try {
            collectionWasForced = true;
            refCounter--;
            super.finalize();   
        } catch (Throwable ex) {
            Logger.getLogger(GarbageCollectorManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int forceGarbageCollection() {
        final int TEMPORARY_ARRAY_SIZE_FOR_GC = 200_000;
        int iterationsUntilCollected = 0;
        collectionWasForced = false;

        if (refCounter < 2) 
            new GarbageCollectorManager();

        while (!collectionWasForced) {
            iterationsUntilCollected++;
            int[] arr = new int[TEMPORARY_ARRAY_SIZE_FOR_GC];
            arr = null;
        }

        return iterationsUntilCollected;
    }

}

용법:

GarbageCollectorManager manager = new GarbageCollectorManager();
int iterationsUntilGcExecuted = manager.forceGarbageCollection();

나는 그것이 지속적으로 힙을 채우는 때문에이 방법이 유용 얼마나 모르겠지만, 당신은 미션 크리티컬 한 응용 프로그램이있는 경우 반드시 GC를 강제을 -이 GC를 강제로 자바 이식 방법이 될 수 있습니다 때.


"final int TEMPORARY_ARRAY_SIZE_FOR_GC = 200_000;"는 무엇입니까?
Koray Tugay

배열 크기-GC가 작동을 시작하기 위해 생성되는 임시 객체 (int) 수
Agnius Vasiliauskas

정수에 "_"가 유효합니까?
Koray Tugay

1
예, 숫자 리터럴의 밑줄 은 Java SE 7부터 유효합니다. 예를 들어이 경우와 같이 정수에서 천 단위 구분 기호가 유용합니다.
Agnius Vasiliauskas

3
프로덕션 시스템에서 이러한 코드를 실행 해서는 안됩니다 . 이 코드가 하나의 스레드에서 실행되는 동안 다른 스레드도 OutOfMemoryException을 얻을 수 있지만 처음에는 이것을 호출하려는 의도를 완전히
되돌립니다

-1

여기에 몇 가지를 추가하고 싶습니다. Java가 실제 머신이 아닌 가상 머신에서 실행되지 않도록하십시오. 가상 머신에는 머신과의 고유 한 통신 방법이 있습니다. 시스템마다 다를 수 있습니다. 이제 GC를 호출 할 때 Java 가상 머신이 가비지 콜렉터를 호출하도록 요청합니다.

가비지 콜렉터는 가상 머신과 함께 있으므로 강제로 정리를 수행 할 수 없습니다. 대신 가비지 콜렉터로 요청을 큐에 넣습니다. 특정 시간이 지나면 가상 머신에 따라 다릅니다 (일반적으로 JVM에 할당 된 임계 값 메모리가 가득 찬 경우 시스템에서 시스템으로 변경 될 수 있음) 실제 머신은 공간을 비 웁니다. :디


두 번째 단락의 첫 번째 문장은 비평 행 입니다.
Lorne의 후작

-1

다음 코드는 assertGC (...) 메소드에서 가져온 것입니다. 비 결정적 가비지 수집기가 강제로 수집하려고합니다.

   List<byte[]> alloc = new ArrayList<byte[]>();
   int size = 100000;
   for (int i = 0; i < 50; i++) {
        if (ref.get() == null) {
             // Test succeeded! Week referenced object has been cleared by gc.
             return;
        }
        try {
             System.gc();
        } catch (OutOfMemoryError error) {
             // OK
        }
        try {
             System.runFinalization();
        } catch (OutOfMemoryError error) {
             // OK
        }

        // Approach the jvm maximal allocatable memory threshold
        try {
             // Allocates memory.
             alloc.add(new byte[size]);

             // The amount of allocated memory is increased for the next iteration.
             size = (int)(((double)size) * 1.3);
        } catch (OutOfMemoryError error) {
             // The amount of allocated memory is decreased for the next iteration.
             size = size / 2;
        }

        try {
             if (i % 3 == 0) Thread.sleep(321);
        } catch (InterruptedException t) {
             // ignore
        }
   }

   // Test failed! 

   // Free resources required for testing
   alloc = null;

   // Try to find out who holds the reference.
   String str = null;
   try {
        str = findRefsFromRoot(ref.get(), rootsHint);
   } catch (Exception e) {
        throw new AssertionFailedErrorException(e);
   } catch (OutOfMemoryError err) {
        // OK
   }
   fail(text + ":\n" + str);

출처 (명확성을 위해 의견을 추가했습니다) : NbTestCase 예제


-1

Runtime.getRuntime().gc()유틸리티 메소드를 사용 하거나 사용할 수 있습니다. System.gc()참고 :이 메소드는 GC를 보장하지 않습니다. 또한 응용 프로그램에서 프로그래밍 방식으로 처리하는 대신 범위를 JVM으로 제한해야합니다.


2
다른 답변에서 설명했듯이 이러한 메소드는 (완전한) 가비지 콜렉션 실행을 강제 하지 않습니다 .
흐름

-2

JUnit과 Spring을 사용하는 경우 모든 테스트 클래스에서 이것을 추가하십시오.

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.