2

我正在使用 Spring 3.1 + Jetty 8.1.2 + Eclipse (Juno) 开发一个 Spring Web 应用程序。

我注意到当应用程序运行时,每次运行都会迅速消耗内存并且不会下降,即使在我停止运行它之后也是如此。

所以,根据我的研究,我插入

jlibs.core.lang.RuntimeUtil.gc();

在我处理用户请求的代码结束时。这行代码阻止内存使用率上升,内存使用率始终很低。

我的问题:

  1. 你觉得我的应用程序有内存泄漏吗?

  2. 在代码中运行垃圾收集是一种好习惯吗?垃圾收集的最佳实践(整体设计或 Spring 的情况)是什么?

谢谢你的帮助!

4

2 回答 2

3

如果您的应用程序可以收回内存,那么它肯定不是内存泄漏。没有理由担心内存使用情况。

调用没有什么意义,System.gc()因为垃圾收集会在需要时这样做。如果内存使用没有达到限制,Xmx那么垃圾收集器就没有理由担心自己。

除非您OutOfMemoryError不关心 RAM 的使用。如果您想使用更少的 RAM,请减少分配给 JVM-reduce 的数量Xmx

于 2013-04-07T18:46:27.530 回答
1

关于你的问题:

  1. 您的应用程序可能仍会消耗不相关的资源,并且它们的内存消耗未释放(可能在 HEAP 上)。在这种情况下,运行 GC 是浪费时间,因为您的应用程序仍在引用这些资源/对象。

  2. 众所周知,虚拟机会根据需要自动调用GC进行回收,所以答案是否定的,调用GC并不能解决你的问题。

我确实建议使用 Java Profiler 来查看未释放内存的高消耗情况并从那里继续。

此外,您可以使用一些 -X JVM 参数来增加内存,但如果您怀疑自己有“内存泄漏”,这只是临时解决方案。

于 2013-04-07T19:00:08.037 回答