我不是Java开发人员,但是我的桌面上有一个应用程序。它是一个在Tomcat容器中运行的Web服务服务器端应用程序。用户从客户端应用程序中获取它。
用户经常抱怨它有多慢,应用程序必须每周重启两次,导致事情变得非常糟糕。
之前的开发人员告诉我,应用程序只是内存不足(因为它会随着时间的推移加载更多数据),并最终花费所有时间进行垃圾收集。同时,Tomcat的堆大小设置为6GB。盒子本身有32GB的RAM。
将堆大小增加到16GB是否有任何危害?
似乎是解决问题的简单方法,但我不是Java专家。
答案 0 :(得分:5)
您应该识别泄漏并修复它,而不是添加更多的堆空间。这只是一个停止差距。
您应该配置tomcat以在出错时转储堆,然后在崩溃后在任意数量的工具中分析堆。您可以计算所有clases的保留大小,这可以让您清楚地了解错误。
我的个人资料我有关于此的博文的链接,因为我最近必须这样做。
答案 1 :(得分:2)
不,将堆大小增加到16GB没有任何害处。
答案 2 :(得分:1)
之前的开发人员告诉我,应用程序内存不足(因为它会随着时间的推移加载更多数据)
这看起来像是内存泄漏,这是应用程序中的一个严重错误。如果您将可用内存量从6增加到16 GiB,那么您仍然需要重新启动应用程序,但频率会降低。一些有经验的开发人员应该在运行时查看应用程序堆(查看 hvgotcodes 提示)并修复应用程序。
答案 3 :(得分:1)
要解决这些问题,您需要进行性能测试。这包括CPU和内存分析。 JDK(6)捆绑了一个名为VisualVM的工具,在我的Mac OS X机器上,默认路径为“jvisualvm”。这是免费和捆绑的,所以这是一个开始的地方。
接下来是NetBeans Profiler(netbeans.org)。这会进行更多的内存和CPU分析。它也是免费的,但有点复杂。
如果你能花钱,我强烈推荐YourKit(http://www.yourkit.com/)。它不是非常昂贵,但它有很多内置的诊断功能,可以更容易地弄清楚发生了什么。
你不能做的一件事是假设只添加更多内存将解决问题。如果是泄漏,添加更多内存可能会使重启之间的运行时间变得非常长。
答案 4 :(得分:1)
我建议您使用JProfiler,VisualVM,jConsole,YourKit等分析工具。您可以对应用程序进行堆转储,并分析哪些对象正在占用内存。