我应该在我的java持久性项目中调用System.gc()吗?

时间:2015-10-14 10:39:00

标签: java memory-management garbage-collection jvm

我正在使用 Java持久性API 来开发独立软件。最近我看到当我从实体类以及JPAController类创建对象时,内存使用率不断上升。似乎对象停留在存储器中,因为对项目的存储器分配不会减少(例如:400mb --->创建对象---> 450mb --->停留在450mb)。这会对性能造成严重影响吗?我应该调用System.gc()方法来删除这些对象吗?

3 个答案:

答案 0 :(得分:5)

通常System.gc()不保证执行垃圾回收。最终由JVM来决定。请参阅javadoc

您是否观察过当您接近JVM的内存限制时会发生什么,那么垃圾收集会发生吗?如果没有,并且您收到OutOfMemoryError,则要么保留超出需要的时间,要么实际需要为VM分配额外的堆。

在任何情况下System.gc(),我认为不应该用它来解决这些问题。

答案 1 :(得分:4)

在我看来,解决问题的方法应该是不同的。实际上,对System.gc()的调用并不能保证它会释放任何内存;请参阅When does System.gc() do anything

如果您可以通过jconsole测量内存分配中的问题,或者对jvm转储进行事后分析,或者其他什么,那么这是另一个问题。通过收集这些信息,您将了解内存区域中的内容,然后采取措施以包含它。

答案 2 :(得分:1)

这会在程序的整个生命周期中对性能产生负面影响的唯一方法是,如果您希望永久保留这些实体,但堆中旧代的大小小于您指定的450MB。假设你想要保持你已经永远指定的450MB的1到2倍,使用JVM的默认比率,设置一个参数如-Xmx2g可能会没问题。还有更多参数可以更好地调整您的性能,但这可能是您现在正在寻找的所有复杂性。如果您想查看有关堆调优的更多详细信息并真正了解性能,请查看Garbage Collection Tuning by Oracle上的此文档。或者,吃午餐的事情很棒Youtube video on GC tuning by a guy named Gil Tene

但是调用System.gc()可能不会做任何有用的事情。