JVM在服务器中使用了太多内存

时间:2014-01-24 06:56:35

标签: java tomcat garbage-collection

我有一个Web应用程序,可以记录来自各种门户的数据。 这是一个使用mongo db作为DB服务器的java应用程序。 我的应用程序足够快但我遇到的问题是Tomcat在每个应用程序服务器上占用过多的Ram内存。我必须每两个小时重新启动一次tomcat来释放这个内存,否则就会变得无法响应。我运行netstat -n |每台服务器上的wc -l和每台服务器上的平均输出为1000。 我在我的servlet和mongo dao中引入了System.gc来强制GC释放内存,但它将CPU使用率提高到100%。 你能否以任何方式建议如何解决这个记忆问题。

1 个答案:

答案 0 :(得分:0)

我使用以下方法在Java中查找内存泄漏。我已经使用jProfiler取得了巨大的成功,但我相信任何具有图形功能的专业工具(差异更容易以图形形式分析)都可以。

启动应用程序并等待它进入“稳定”状态,此时所有初始化完成并且应用程序处于空闲状态。 运行怀疑产生内存泄漏的操作几次,以允许任何缓存,与DB相关的初始化发生。 运行GC并获取内存快照。 再次运行该操作。根据操作的复杂性和处理的数据大小,操作可能需要运行几次到多次。 运行GC并获取内存快照。 为2个快照运行差异并进行分析。 基本上,分析应该从对象类型的最大正差异开始,并找出导致这些额外对象留在内存中的原因。

对于在多个线程中处理请求的Web应用程序,分析变得更加复杂,但仍然采用一般方法。

我做了很多专门用于减少应用程序内存占用的项目,这种一般方法通过一些特定于应用程序的调整和技巧总是运行良好。