2015-10-14 33 views
2

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

+0

你如何测量内存分配? – biziclop

+1

不,几乎没有理由调用System.gc();它不会解决您将遇到的任何问题。 – Kayaman

+0

@biziclop我使用Windows任务管理器,我可以看到在Java(TM)平台二进制文件下的内存分配 – Thanuj

回答

5

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

您是否观察到当您接近JVM的内存限制时会发生什么,然后发生垃圾回收?如果没有,并且您收到一个OutOfMemoryError,则您要么保留比您需要的时间更长的时间,要么实际上需要为虚拟机分配额外的堆。

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

+0

简短明了... +1 –

+0

@Damien是的,我意识到使用System.gc()实际上会减慢一些进程。感谢你的回答。 :) – Thanuj

4

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

如果您可以通过jconsole测量内存分配中的问题,或者对jvm转储进行事后分析或其他任何操作,那么这是另一个问题。通过收集这些信息,您将知道内存区域中的哪些地方仍然存在,然后采取行动来控制它。

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()可能不会做任何有用的事情。

相关问题