4

我不是 Java 开发人员,但我的办公桌上有一个应用程序。它是一个运行在 Tomcat 容器中的 Web 服务服务器端应用程序。用户从客户端应用程序中找到它。

用户不断抱怨它有多慢,应用程序必须每周重新启动两次,导致事情变得非常糟糕。

之前的开发人员告诉我,该应用程序只是内存不足(因为它会随着时间的推移加载更多数据)并最终将所有时间都花在垃圾收集上。同时,Tomcat 的堆大小设置为 6GB。盒子本身有 32GB 的 RAM。

将堆大小增加到 16GB 有什么害处吗?
似乎是解决问题的简单方法,但我不是 Java 专家。

4

5 回答 5

5

您应该识别泄漏并修复它,而不是添加更多的堆空间。那只是一个权宜之计。

您应该配置 tomcat 以在错误时转储堆,然后在崩溃后使用任意数量的工具之一分析堆。您可以计算所有类别的保留大小,这应该可以让您非常清楚地了解问题所在。

我的个人资料我有一个关于这个的博客文章的链接,因为我最近不得不这样做。

于 2011-03-03T18:19:49.587 回答
2

不,将堆大小增加到 16GB 并没有什么坏处。

于 2011-03-03T23:01:38.603 回答
1

我建议您使用 JProfiler、VisualVM、jConsole、YourKit 等分析工具。您可以对应用程序进行堆转储并分析哪些对象正在占用内存。

于 2011-03-03T18:59:35.493 回答
1

之前的开发人员告诉我,该应用程序只是内存不足(因为它会随着时间的推移加载更多数据)

这看起来像是内存泄漏,是应用程序中的一个严重错误。如果您将可用内存量从 6 GiB 增加到 16 GiB,您仍然需要重新启动应用程序,只是频率降低了。一些有经验的开发人员应该在运行时查看应用程序堆(查看hvgotcodes提示)并修复应用程序。

于 2011-03-03T18:21:25.327 回答
1

要解决这些问题,您需要进行性能测试。这包括 CPU 和内存分析。JDK (6) 捆绑了一个名为 VisualVM 的工具,在我的 Mac OS X 机器上,它默认位于路径上,即“jvisualvm”。这是免费的和捆绑的,所以它是一个开始的地方。

接下来是 NetBeans Profiler (netbeans.org)。这会进行更多的内存和 CPU 分析。它也是免费的,但有点复杂。

如果你能花钱,我强烈推荐 YourKit (http://www.yourkit.com/)。它不是很贵,但它有很多内置的诊断功能,可以更容易地弄清楚发生了什么。

您不能做的一件事是假设只需添加更多内存即可解决问题。如果是泄漏,添加更多内存可能只会让它在重新启动之间运行得更久一些。

于 2011-03-03T18:30:07.403 回答