【发布时间】:2014-01-24 06:56:34
【问题描述】:
我有一个 Web 应用程序,它记录来自各种门户的数据。 这是一个使用 mongo db 作为数据库服务器的 java 应用程序。 我的应用程序足够快,但我面临的问题是 Tomcat 在每个应用程序服务器上消耗了太多的 Ram 内存。我必须每两个小时重新启动一次 tomcat 以释放此内存,否则它会变得无响应。我运行 netstat -n | wc -l 在每台服务器上,平均输出在每台服务器上为 1000。 我在我的 servlet 和 mongo dao 中引入了 System.gc 来强制 GC 释放内存,但它会将 CPU 使用率增加到 100%。 您能否建议如何解决此内存问题。
【问题讨论】:
-
在特定时间创建转储并对其进行分析。
-
我以 30 分钟的间隔创建了堆转储,但某些对象始终没有明确的模式以递增的顺序排列。我发现创建了很多字符串对象。
-
您是否看到内存使用接近满并且 GC 启动的证据?与此同时,“netstat -n | wc -l”返回 1000 听起来很多。在我的机器上,我得到了 100 左右。会不会是连接没有正确关闭?
-
这 1000 个已建立连接,正在等待。我也检查了我的数据库连接,在我的代码中我正确地关闭了它(我想是这样)我总是用 db.requestStart() 开始我的数据库连接,最后我调用 db.requestDone()。
标签: java tomcat garbage-collection