Java'da çöp toplama nasıl zorlanır?


225

Zor olsa bile, Java'da çöp toplamayı zorlamak mümkün mü? Ben biliyorum System.gc();ve Runtime.gc();sadece GC yapmayı öneriyorlar. GC'yi nasıl zorlayabilirim?


30
Belki de GC'yi neden zorlamanız gerektiğine dair bir arka plan sağlamak yararlı olacaktır. Çöp toplanan bir dilde toplayıcıyı açıkça çağırmak kötü bir uygulamadır.
Justin Ethier

3
Belirli bir JVM, her biri kendi avantajları ve dezavantajları olan çeşitli çöp toplama yöntemleri sağlayabilir ve genellikle belirli bir durum, JVM'yi başlangıçta ima ederek önlenebilir. Lütfen senaryoyu hazırlayın.
Thorbjørn Ravn Andersen

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

5
İşte çöp toplama zorlamak için bir kullanım örneği: Ben 30GB yığın ile bir sunucu var, hangi ~ 12GB genellikle kullanılır (~ 5M nesneleri). Her 5 dakikada bir, sunucu yaklaşık bir dakika harcıyor ve kabaca 35M ek nesnelerin kullanıldığı karmaşık bir görev gerçekleştiriyor. Tam bir GC, karmaşık görev sırasında her zaman saatte birkaç kez tetiklenir ve VM'yi 10 ila 15 saniye boyunca dondurur. Karmaşık görevin çalışmadığı bir zamanda tam GC'yi çalışmaya zorlamak isterim; daha sonra 40M yerine 5M canlı nesneleri hokkabazlık eder.
Steve

3
@JustinEthier java.lang.ref.Reference türü hiyerarşisini içeren herhangi bir davranışı test eden GC'yi zorlamak isteyebileceğiniz oldukça açık bir durum vardır.
Elias Vasylenko

Yanıtlar:


168

En iyi seçeneğiniz, System.gc()çöp toplayıcısına bir koleksiyon yapmasını istediğiniz ipucunu aramaktır. Çöp toplayıcı belirleyici olmadığından zorla derhal toplanmanın bir yolu yoktur .


28
Olmalı. non-deterministic == trouble
Pacerier

7
Bir çöp toplayıcı deterministik olmayabilir ve yine de derhal toplanması için bir yol sunar. Örneğin, genellikle .NET toplayıcısı deterministik değildir, ancak GC.Collect () öğesine yapılan bir çağrı onu çalıştırmaya zorlar. Sadece Java bu işlevi açığa vurmamayı seçer.
Petr Hudeček

2
Deneyimlerime göre, bu yöntem her zaman çöp toplayıcıyı çağırır. Yeterli düzenlilikle bunu yaparak, kullanılan nesne sayısına karşı bellek kullanımlarım her zaman kesinlikle doğrusaldır (dolgu, vb.).
Jim Pivarski

Çöp toplayıcının yeni nesneleri tahsis edip artık referans göstermeyerek otomatik olarak çalışacağını düşünüyordum
Bionix1441

@ PetrHudeček Gerçek dünya uygulamalarında .NET GC.Collect()toplamaz. Java da gc()yapar.
ajeh

53

Jlibs kütüphane çöp toplama için iyi bir yardımcı sınıf vardır . WeakReference nesneleriyle şık küçük bir numara kullanarak çöp toplamayı zorlayabilirsiniz .

Jlibs'ten 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
Bu kod bozulur, çünkü zayıf bir ref, başvurusu zayıf bir şekilde erişilebilir hale gelir gelmez temizlenir, bu da bellekten temizlenmeden önce olur.
Marko Topolnik

1
"GC çalıştırıldı" anlamını "bellek geri alındı" ifadesiyle karıştırıyor olabilirsiniz. Nesne devam eder ve henüz kesinleşmez, ancak zayıf referansla artık ona erişemezsiniz. B'yi kullanmak için biraz daha iyi bir yol bir PhantomReferenceile kullanmaktır ReferenceQueueve sonra kesinleşmeden sonra, ancak yine de temizlemeden önce bildirim alırsınız. Son olarak, bu nesnenin belleğinin geri kazanıldığını başarılı bir şekilde tespit etseniz bile, HotSpot'unki gibi yeni bir GC'de çok az şey ifade eder. Genellikle genç neslin temizlenmesi ile çakışır.
Marko Topolnik

20
OP istedi ve siz "çöp toplamaya zorlamak" için bir çözüm sağladığınızı iddia ettiniz. GC alt sistemini çalıştırmak bir şeydir, aslında çöp toplamak başka bir şeydir. Verdiğiniz kod örneği, çöplerin toplandığını garanti etme niyetine açıkça sahiptir. Her neyse, bu çok eski bir soru, açıkça OP'nin istekleri ile ilgili değil, genel kamu yararına. Hiç kimse çöp toplanmadan kendi başına "GC alt sistemini çalışmaya zorlamak" ile ilgilenmiyor. Aslında, insanlar genellikle tüm çöplerin toplandığını garanti eder .
Marko Topolnik

4
Muhtemelen onu verimliliği ile karşılaştırmadınız System.gc(); System.gc();, ancak bundan daha iyi çalışıp çalışmadığını bilmek ilginç olacaktır. Aslında, sadece kaç kez aradığını yazdırmak System.gc()yeterli olacaktır. Hiç 2'ye ulaşma şansı oldukça zayıf.
Marko Topolnik

3
@MarkoTopolnik: 'Kimse çöp toplanmadan "GC alt sistemini kendi başına çalıştırmaya zorlamakla ilgilenmiyor" .... Aslında bugün sadece bu davranışla ilgileniyordum. Bu cevabın mevcut olduğu için minnettarım. Amacım GC günlük işlemenin dönme davranışını kontrol etmek ve GC çıktısının biçimini almaktı. Bu küçük numara GC günlüklerini hızlıca doldurmama yardımcı oldu.
erik.

49

Bir GC'yi zorlamanın en iyi yolu (sadece değil) özel bir JVM yazmaktır. Çöp toplayıcıların takılabilir olduğuna inanıyorum, bu yüzden muhtemelen mevcut uygulamalardan birini seçip düzenleyebilirsiniz.

Not: Bu kolay bir cevap DEĞİLDİR.


40
Lulz için +1. hiçbir şey sinir bozucu hata ayıklamayı mizah duygusu olan birinden daha iyi yapamaz. aslında kullanışlı bir cevap dışında.
jsh


25

EVET Yöntemleri aynı sırayla çağırmak zorunda kalmanız neredeyse mümkündür ve aynı zamanda bunlar:

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

bu iki yöntemin aynı anda kullanımını temizlemek için yalnızca bir nesne olsa bile, çöp toplayıcıya, finalise()atanan belleği serbest bırakan vefinalize() yöntemin belirttiği .

ANCAK bunun kullanımının bellek daha kötü olabilir yazılıma aşırı yük tanıtmak çünkü çöp toplayıcı kullanmak için korkunç bir uygulamadır, çöp toplayıcı kontrol artı bağlı mümkün değildir kendi iş parçacığı vardır gc tarafından kullanılan algoritma daha fazla zaman alabilir ve çok verimsiz olarak kabul edilir, kesinlikle kırıldığı için gc'nin yardımıyla en kötü yazılımınızı kontrol etmelisiniz, iyi bir çözüm gc'ye bağlı olmamalıdır.

NOT: sadece akılda tutmak için bu sadece sonlandırma yönteminde nesnenin yeniden atanması değilse çalışır, eğer bu gerçekleşirse nesne canlı kalacaktır ve teknik olarak mümkün olan bir diriliş olacaktır.


10
HAYIR , bu iki komut bile çöp toplamayı zorlamaz. Başkaları tarafından zaten belirtildiği gibi gc(), sadece bir çöp toplama çalıştırmak için bir ipucu. runFinalizers()yalnızca "atıldığı tespit edilen" nesneler üzerinde sonlandırıcılar çalıştırır. Gc gerçekten çalışmadıysa, böyle bir nesne olmayabilir ...
Steffen Heil

ayrıca, System.runFinalization () herhangi bir şeyin çalışacağının garantisi değildir; hiçbir şey olmayacak. Bu bir öneridir - Javadoc'tan: " Bu yöntemin çağrılması, Java Sanal Makinesi'nin atıldığı ancak kesinleştirme yöntemleri henüz çalıştırılmayan nesnelerin sonlandırma yöntemlerini çalıştırma yönünde çaba harcadığını gösterir "
kaan

21

OutOfMemoryError belgelerinde , VM tam bir çöp toplama işleminden sonra belleği geri alamadığı sürece atılamayacağını bildirir. Bu nedenle, hatayı alana kadar bellek ayırmaya devam ederseniz, zaten tam bir çöp toplama zorlamış olursunuz.

Muhtemelen gerçekten sormak istediğin soru "Çöp toplayarak geri kazanmam gerektiğini düşündüğüm hafızayı nasıl geri alabilirim?"


18

GC'yi manuel olarak istemek için (System.gc () öğesinden değil):

  1. Git: JDK'daki bin klasörü örn.-C: \ Program Files \ Java \ jdk1.6.0_31 \ bin
  2. Jconsole.exe dosyasını açın
  3. İstenen yerel Prosese bağlanın.
  4. Bellek sekmesine gidin ve GC gerçekleştir'i tıklayın.

3
Yanıltıcı Oppsss. Lütfen fareyle "GC Yap" düğmesini fareyle üzerine getirin. JVM'den GC yapmasını isteyebilirsiniz ancak asla zorlamayın.
Kumaran

@PinkeshSharma Bu vermez zorlamak . Muhtemelen tamamen göz ardı edilebilecek bir istek.
Pacerier

@Pacerier İdeal bir dünyada evet .. ama bunu yaparsanız anında hafızada bir artış olduğunu göreceksiniz ...
Pinkesh Sharma

11

.gc gelecekteki sürümlerde eleme adayıdır - Bir Güneş Mühendisi bir keresinde dünyada yirmiden az kişinin aslında nasıl kullanılacağını bildiğini yorumladı .gc () - Dün gece birkaç saat boyunca merkezi / kritik bir iş yaptım SecureRandom tarafından üretilen veri yapısı, vm sadece işaretçiler tükenmiş gibi yavaş yavaş 40.000 nesnelerin bir yerde üretti. Açıkçası, 16-bit işaretçi tablolarını boğuyordu ve klasik "başarısız makineler" davranışını sergiledi.

-Xms ve benzeri denedim, yaklaşık 57, xxx bir şey çalışana kadar biraz twiddling tuttu. Daha sonra, bir gc'den () sonra 57,127'den 57,128'e kadar gc'yi çalıştıracaktı - Easy Money kampında kod blokajı hızında.

Tasarımınızın temel olarak yeniden çalışmaya ihtiyacı vardır, muhtemelen kayan bir pencere yaklaşımı.


1
Böyle bir şeyim var, bellekteki çok fazla nesne onları yerleştiremiyorum. OutOfMemory istisnası atılır, GC bazı Sonsuz Nesne oluşturma işlemi olup olmadığını test etmek için zorlamak istiyorum veya bu nesneler benim sistem tarafından kullanılan.

Ben aynı sorun üzerinde çalışıyorum gibi geliyor, pls açıklamak: "Sonsuz Nesne oluşturma" ... iyi araştırma projesi, belki burada bir java alanında bir soru ya da bir şey gönderebilirsiniz (Ben burada yeni sıralıyorum ve değil sitenin nasıl çalıştığını "Sonlu Otoma" biliyorum) Dün denedim ve derleyici 40.000 base36 üzerinde "çok fazla kod" şikayet gibi file.dat yapmak sona erdi36 BigIntegers statik bir son olarak kodlanmış String [] Ben boynumu sopa olacak burada ve tüm JVM'nin 16 bitlik işaretçilerle sınırlı olduğunu tahmin ediyorum, yapmamız gereken agresif bir şekilde boş ve diskten okunuyor ...
Nicholas Jordan

Gerçekten, seni anlamıyorum. Ama "Sonsuz Nesne Oluşturma" hakkında net olmak gerekirse, benim büyük sistemde bir parça kod var demek istediğini ve bellekte yaşayan nesneler oluşturma, aslında bu kod parçası alamadım, sadece jest !!

5
Saçmalık! Kullanılması gereken belirgin bir durum vardır: zayıf referanslar silindiğinde davranışın doğru olduğundan emin olabilmemiz için zayıf referanslar kullanan test kodu.
Elias Vasylenko


6

JVM spesifikasyonu çöp toplama hakkında özel bir şey söylemez. Bu nedenle, satıcılar GC'yi kendi yollarına uygulamakta özgürdürler.

Dolayısıyla bu belirsizlik, çöp toplama davranışında belirsizliğe neden olmaktadır. Çöp toplama yaklaşımları / algoritmaları hakkında bilgi edinmek için JVM ayrıntılarınızı kontrol etmelisiniz. Ayrıca davranışı özelleştirme seçenekleri de vardır.


4

Çöp toplamaya zorlamanız gerekiyorsa, belki de kaynakları nasıl yönettiğinizi düşünmelisiniz. Bellekte kalan büyük nesneler mi oluşturuyorsunuz? DisposableArabirimi olan ve dispose()işiniz bittiğinde çağırmayan büyük nesneler mi (örneğin, grafik sınıfları) mı oluşturuyorsunuz? Sınıf düzeyinde yalnızca tek bir yöntemle ihtiyacınız olan bir şey mi söylüyorsunuz?


2

Çöp toplamaya neden ihtiyacınız olduğunu açıklarsanız daha iyi olur. SWT kullanıyorsanız, Imageve Fontboş bellek gibi kaynakları atabilirsiniz . Örneğin:

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

Maruz bırakılmamış kaynakları belirlemek için araçlar da vardır.


herhangi bir atma yöntemi yoksa ne olur?
ArifMustafa

1
Soru ile tamamen ilgisiz! Hayır, SWT kullanmıyorum. Delphi yerel katman üzerinden bir .NET penceresi açan bir JNI yöntemi arıyorum. Ayrıca yerel bir C ++ katmanı üzerinden veri alan bir FORTRAN hesaplama çekirdeği var. Bunun herhangi bir şeyle ne ilgisi var? Bir GC'yi zorlayabilir miyim? Hayır? :-(
Mostafa Zeinali

0

Bellek OutOfMemoryExceptionyetersiz ve almak bir java için kullanılabilir yığın alanı miktarını artırmak yerine deneyebilirsiniz java -Xms128m -Xmx512msadece yerine program java. Bu size ilk yığın boyutunu 128Mb ve maksimum 512Mb verir, bu da standart 32Mb / 128Mb'den çok daha fazladır.


Varsayılan bellek ayarlarıjava -Xms512M -Xmx1024M
ThePyroEagle

0

Başka bir seçenek yeni nesneler oluşturmamaktır.

Java'da GC ihtiyacını azaltmak için nesne havuzlaması uzaktadır.

Nesne havuzu oluşturma genellikle Nesne oluşturma işleminden daha hızlı olmayacaktır (hafif nesneler için esp), ancak Çöp Toplama işleminden daha hızlıdır. 10.000 nesne oluşturduysanız ve her nesne 16 baytsa. GC'nin geri alması gereken 160.000 bayt. Öte yandan, aynı anda 10.000 adete ihtiyacınız yoksa, yeni nesneler oluşturma ihtiyacını ortadan kaldıran ve eski nesnelerin GC ihtiyacını ortadan kaldıran nesneleri geri dönüştürmek / yeniden kullanmak için bir havuz oluşturabilirsiniz.

Böyle bir şey (denenmemiş). Eğer iş parçacığı güvenli olmasını istiyorsanız, bir ConcurrentLinkedQueue için LinkedList takas edebilirsiniz.

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'li OracleJDK 10'da, tek bir çağrı System.gc()GC'nin Eski Koleksiyonu temizlemesine neden olur. GC'nin hemen çalışıp çalışmadığından emin değilim. Bununla birlikte, GC, System.gc()bir döngüde birçok kez çağrılsa bile, Genç Koleksiyonu temizlemeyecektir . GC'nin Genç Koleksiyonu temizlemesini sağlamak için new byte[1024]aramadan bir döngüye (örn. ) Tahsis etmeniz gerekir System.gc(). System.gc()Bir sebepten ötürü aramak GC'nin Genç Koleksiyonu temizlemesini önler.


0

Gerçekten, seni anlamıyorum. Ama "Sonsuz Nesne Oluşturma" hakkında net olmak gerekirse, benim büyük sistemde bir parça kod var demek istediğini ve bellekte yaşayan nesneler oluşturma, aslında bu kod parçası alamadım, sadece jest !!

Bu doğru, sadece jest. Zaten birkaç afiş tarafından verilen standart cevaplara sahipsiniz. Bunu birer birer alalım:

  1. Aslında bu kod parçasını alamadım

Doğru, gerçek jvm yoktur - bu sadece bir şartname, istenen bir davranışı tanımlayan bilgisayar bilimi bir grup ... Son zamanlarda Java kodlarını yerel koddan başlatma içine kazdık. İstediğinizi elde etmek için tek yol agresif sıfırlama olarak adlandırılan şeyi yapmaktır. Yanlış yapıldığında yapılan hatalar o kadar kötü ki kendimizi sorunun orijinal kapsamıyla sınırlamalıyız:

  1. benim büyük sistemimde bir parça kod nesne yaratma

Buradaki posterlerin çoğu, bir arayüzde çalıştığınızı söylediğinizi varsayacaktır, eğer böyle olursa, tüm nesneyi mi yoksa bir kerede bir öğeyi mi teslim aldığınızı görmek zorunda kalacağız.

Artık bir nesneye ihtiyacınız yoksa, nesneye null atayabilirsiniz, ancak yanlış alırsanız bir boş işaretçi istisnası oluşturulur. Eminim NIO kullanırsanız daha iyi işler başarabilirsiniz

Siz veya ben ya da herhangi bir kişi: " Lütfen buna çok ihtiyacım var. " Üzerinde çalışmaya çalıştığınız şeyin neredeyse tamamen yok edilmesinin neredeyse evrensel öncüsüdür .... bize herhangi bir dezenfekte ederek küçük bir örnek kod yazın gerçek kod kullanılır ve bize sorunuzu gösterir.

Sinirli olmayın. Çoğu zaman bunun çözdüğü şey, dba'nızın bir yere satın alınmış bir paket kullanması ve orijinal tasarımın büyük veri yapıları için ayarlanmamış olmasıdır.

Bu çok yaygın.


-1

Bilginize

System.runFinalizersOnExit (true) yöntemi, Java kapatılmadan önce sonlandırıcı yöntemlerinin çağrılmasını garanti eder. Ancak, bu yöntem doğal olarak güvensizdir ve kullanımdan kaldırılmıştır. Alternatif olarak Runtime.addShutdownHook yöntemiyle “kapatma kancaları” eklemektir.

Masarrat Siddiqui


Kapatma kancalarına sahip kusur, nadiren gerçekten çalışmasıdır. Zorla sonlandırma çalışmaz, sıfır olmayan çıkış kodu çalışmaz ve bazen (resmi) JVM bunları çalıştırmanız gerektiğinde çalıştırmaz.
ThePyroEagle

-1

Çöp toplayıcıyı zorlamanın dolaylı bir yolu var. Çöp toplayıcının çalışacağı noktaya kadar yığını geçici nesnelerle doldurmanız yeterlidir. Çöp toplayıcıyı bu şekilde zorlayan bir sınıf yaptım:

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

}

Kullanımı:

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

Ben sürekli yığın doldurur çünkü bu yöntem yararlıdır ne kadar bilmiyorum ama kritik uygulamanız varsa GEREKİR GC zorlamak - Bu GC zorlamak için Java taşınabilir bir yol olabilir zaman.


"Nihai int TEMPORARY_ARRAY_SIZE_FOR_GC = 200_000;" nedir?
Koray Tugay

Dizi boyutu - GC'nin çalışmaya başlaması için kaç tane geçici nesne (int) oluşturulur.
Agnius Vasiliauskas

Bu geçerli mi: "_" tamsayıda mı?
Koray Tugay

1
Evet, sayısal değişmezlerdeki alt çizgiler Java SE 7'den başlayarak geçerlidir. Bu, örneğin bu durumda olduğu gibi tamsayıda binlik ayırıcı olarak kullanışlıdır.
Agnius Vasiliauskas

3
Sen gerektiğini asla bir üretim sisteminde böyle kod çalıştırmasına. Bir iş parçacığı bu kod çalışır başka iş parçacığı aynı zamanda bir OutOfMemoryException almak olsa da, tamamen .... ilk etapta bu çağrı niyeti dönme özelliği
Steffen Heil

-1

Buraya bir şeyler eklemek istiyorum. Java'nın gerçek Makine üzerinde değil Sanal Makine üzerinde çalıştığını lütfen unutmayın. Sanal makine, makine ile kendi iletişim yoluna sahiptir. Sistemden sisteme değişebilir. Şimdi GC'yi aradığımızda, Java'nın Sanal Makinesinden Çöp Toplayıcısını çağırmasını istiyoruz.

Çöp Toplayıcı Sanal Makine ile olduğundan, orada bir temizleme yapmaya zorlayamayız. Bunun yerine, isteğimizi Çöp Toplayıcı ile sıraya koyuyoruz. Sanal Makineye bağlıdır, belirli bir süre sonra (bu genellikle sistemden sisteme değişebilir, genellikle JVM'ye ayrılan eşik belleği dolduğunda) gerçek makine alanı boşaltacaktır. : D


İkinci paragrafın ilk cümlesi sıralı değildir .
Lorne Marquis

-1

Aşağıdaki kod assertGC (...) yönteminden alınır. Belirsiz çöp toplayıcısını toplamaya zorlar.

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

Kaynak (Netlik için bazı yorumlar ekledim): NbTestCase Örneği


-1

Runtime.getRuntime().gc()Yardımcı program yöntemini kullanmayı veya kullanmayı deneyebilirsiniz System.gc()Not: Bu yöntemler GC'yi sağlamaz. Ve kapsamları, uygulamanızda programlı olarak kullanmak yerine JVM ile sınırlı olmalıdır.


2
Diğer yanıtlar açıklandığı gibi, bu yöntemler yok zorlamak (tam) çöp toplama koşmak.
Akış

-2

JUnit ve Spring kullanıyorsanız, bunu her test sınıfına eklemeyi deneyin:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.