Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/Tomcat堆大小问题_Java_Tomcat_Garbage Collection_Windows Server 2008_Ram - Fatal编程技术网

Java/Tomcat堆大小问题

Java/Tomcat堆大小问题,java,tomcat,garbage-collection,windows-server-2008,ram,Java,Tomcat,Garbage Collection,Windows Server 2008,Ram,我不是一个Java开发人员,而是一个放在我桌上的应用程序。它是一个运行在Tomcat容器中的web服务服务器端应用程序。用户通过客户端应用程序访问它 用户不断抱怨它的速度有多慢,而且该应用程序每周必须重新启动两次,因为情况变得非常糟糕 之前的开发人员告诉我,该应用程序只是内存不足(随着时间的推移,它会加载更多数据),最终会将所有时间都花在垃圾收集上。同时,Tomcat的堆大小设置为6GB。盒子本身有32GB的RAM 将堆大小增加到16GB有什么害处吗? 这似乎是解决问题的简单方法,但我不是Jav

我不是一个Java开发人员,而是一个放在我桌上的应用程序。它是一个运行在Tomcat容器中的web服务服务器端应用程序。用户通过客户端应用程序访问它

用户不断抱怨它的速度有多慢,而且该应用程序每周必须重新启动两次,因为情况变得非常糟糕

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

将堆大小增加到16GB有什么害处吗?

这似乎是解决问题的简单方法,但我不是Java专家

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

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

我有一个关于这个的博客链接,因为我最近不得不这么做

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


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

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

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

如果你能花这笔钱,我强烈推荐你的工具包(http://www.yourkit.com/). 它不太贵,但它有很多内置的诊断功能,可以更容易地找出发生了什么


你不能做的一件事是假设仅仅增加更多的内存就能解决问题。如果是泄漏,添加更多内存可能只会使它在重启之间运行得更糟糕。

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

否,将堆大小增加到16GB没有什么害处。

@hvgotcodes没有内存泄漏。随着时间的推移,应用程序必须将巨大的数据集加载到内存中。最终,它加载了足够多的这些数据集,导致内存不足。原因是,在处理完数据集后,它不会卸载该数据集,因为其他用户可能需要相同的信息。而将数据集加载到RAM中是最耗时的步骤。@angryhacker,那么它就做得不对了。你有一个应用程序,在正常运行的情况下,在一段时间后总是会崩溃。您应该缓存合理数量的数据,而不是所有时间的所有数据。@angryhacker,您可以做的一件事就是在使用率较低的情况下,每n天编写一次操作系统级进程来重新启动应用服务器。但这并不是一个修复方案,只是为了让用户看得更好……分析行为的一个有用工具可能是VisualVM,它也包含在当前的Java SE安装IIRC中。@hvgotcodes,如果机器上有32GB的RAM,并且所有数据都可以放入10GB,为什么不一直缓存所有数据呢?如果我在一台内存受限的机器上,我可以理解,但我不是。那么回到我最初的问题,将堆大小增加到16GB有什么害处吗?我向您保证,应用程序不会耗尽内存,因为它有足够的内存来加载所有数据。没有内存泄漏。我已经删除了大部分数据,并在我的机器上进行了尝试,效果很好。然而,在本地尝试是一回事,当有1000多用户点击时,情况就完全不同了。也许你应该弄清楚你想要“永久”缓存的数据的总大小。否则,看起来您需要更好的缓存解决方案(Ehcache)。