我必须解析一个3千兆xml文件并使用SAX生成一个更改过的文件。
要做到这一点,我使用序列化对象,一个线程。
首次测试对于小文件很有用。但是使用3千兆位文件会产生大量未使用的实例。
我想确定垃圾收集器已被执行。
我的想法:
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 :(得分:1)
在GC行动之前,我想确定垃圾收集器已被执行。
System.gc();
可能会有一些延迟。
通常情况下,如果您的示例代码中的处理之间有一些暂停,则不需要调用System.gc();
。
如果你没有在大型处理之间暂停,调用System.gc();
可能有意义,但你仍然应该做一些基准来检查是否真的需要并且它不会创造相反的减速点。
此外,如果您想要免费的对象不符合条件,则调用System.gc();
将无能为力。
但是使用3千兆位文件会产生大量未使用的实例。
您不会显示代码,但未使用的实例并不代表生活对象不再引用的实例。
GC仅收集和扫描有资格的对象:即任何生物对象不再引用的对象。
要做到这一点,你必须专注于减少你操纵的对象的范围,使其尽可能短。