2017-07-02 45 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 –