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

Java JVM在服务器中使用了太多内存,java,tomcat,garbage-collection,Java,Tomcat,Garbage Collection,我有一个web应用程序,它记录来自各种门户的数据。 这是一个使用MongoDB作为db服务器的java应用程序。 我的应用程序足够快,但我面临的问题是Tomcat在每个应用服务器上消耗了太多的Ram内存。我必须每两个小时重新启动tomcat以释放内存,否则它将变得无响应。我在每台服务器上运行netstat-n | wc-l,每台服务器的平均输出为1000。 我在servlet和mongo dao中引入了System.gc,以强制gc释放内存,但它将CPU使用率增加到100%。 您能建议一下如何解

我有一个web应用程序,它记录来自各种门户的数据。 这是一个使用MongoDB作为db服务器的java应用程序。 我的应用程序足够快,但我面临的问题是Tomcat在每个应用服务器上消耗了太多的Ram内存。我必须每两个小时重新启动tomcat以释放内存,否则它将变得无响应。我在每台服务器上运行netstat-n | wc-l,每台服务器的平均输出为1000。 我在servlet和mongo dao中引入了System.gc,以强制gc释放内存,但它将CPU使用率增加到100%。
您能建议一下如何解决这个内存问题吗。

我使用以下方法来查找Java中的内存泄漏。我已经成功地使用了jProfiler,但我相信任何具有绘图功能的专用工具(diff更容易以图形形式分析)都可以工作

启动应用程序并等待它进入“稳定”状态,此时所有初始化都已完成且应用程序处于空闲状态。 运行涉嫌产生内存泄漏的操作数次,以允许进行任何与缓存、数据库相关的初始化。 运行GC并拍摄内存快照。 再次运行该操作。根据操作的复杂性和所处理数据的大小,可能需要多次运行该操作。 运行GC并拍摄内存快照。 为2个快照运行一个diff并对其进行分析。 基本上,分析应该从最大的积极差异开始,比如说,对象类型,并找出是什么导致这些额外的对象留在内存中

对于在多个线程中处理请求的web应用程序,分析变得更加复杂,但通用方法仍然适用


我做了很多专门针对减少应用程序内存占用的项目,这种带有一些特定于应用程序的调整和技巧的通用方法总是很有效。

在特定时间创建转储并对其进行分析。我每隔30分钟创建一次堆转储,但没有确定的模式对象始终按递增顺序排列。我发现创建了很多字符串对象。您是否看到内存使用率接近满且GC开始工作的证据?与此同时,“netstat-n | wc-l”拿回1000美元听起来好像很多。在我的机器上,我找回了大约100个。是否连接未正确关闭?这1000个已建立连接,正在等待。我还检查了我的db连接,在我的代码中,我正确地关闭了它(我想是的),我总是用db.requestStart()启动我的db连接,最后我调用db.requestDone()。