2017-07-02 42 views
0

我必須解析一個3千兆xml文件,並用SAX生成一個修改後的文件。Java垃圾收集器 - 我如何確定它已被執行

要做到這一點,我使用序列化的對象,一個線程。

第一次測試對於小文件來說非常棒。但是對於一個3 giga文件,它會產生大量未使用的實例。

我想確保垃圾收集器已被執行。

我的想法:

if(...) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
      System.gc(); 
    } 
} 

或另一種思路:

if(...) 
    { 
    Thread.sleep(1 800 000);//30mn 
    for (int i = 0; i < 50; i++) { 
       System.gc(); 
      } 
    Thread.sleep(1 800 000);//30mn 
    for (int i = 0; i < 50; i++) { 
       System.gc(); 
      } 
    } 

我不知道Java垃圾收集很多東西......你對此怎麼看?

+0

GC將在JVM認爲必要時執行,您無法做任何事情,即使您自己使用** system.gc調用它也不保證在調用它的那一刻完成...... –

+0

'System.gc()'給JVM一個提示來做垃圾回收。不能保證會發生。通常在Java中,你不能強制分配內存被釋放。 – hotzst

+0

「它會產生很多未使用的實例」 - 也許jvm會調用gc,因爲這個原因! – Arthas

回答

1

我想確保垃圾收集器已被執行。

System.gc();在GC行爲之前可能會有一些延遲。

通常情況下,如果您在示例代碼中處理之間存在一些暫停,則總體上不需要調用System.gc();
如果你不在大處理之間停頓一下,調用System.gc();可能是有意義的,但是你仍然應該做一些基準來檢查是否真的需要,並且它不會造成相反的緩慢下降。

此外,調用System.gc();將是無助的,如果你想免費的對象不符合資格。

但是,如果使用3 giga文件,它將會產生大量未使用的實例。

您不顯示代碼,但未使用的實例並不意味着不再由活動對象引用的實例。

GC僅收集和掃描符合條件的對象:即任何活動對象不再引用的對象。
要做到這一點,您必須專注於縮小您操作的對象的範圍,使其儘可能短。

+0

感謝您的建議。 https://github.com/BenjaminBettan/XML_SAX –