关于VPS的Coldfusion,多lessJVM堆内存?

最近我得到了一个VPS服务器,我正在运行ColdFusion,网站运行良好,直到它获得越来越多的stream量,我开始遇到“OutOfMemory”exception。

我只想提高VPS服务器的内存,但这并没有帮助。

在做了一些Googlesearch之后,我在CFpipe理设置中find了一个设置来设置JVM堆内存。 它是在标准:最大堆大小512MB和最小堆大小是空的。 在玩了一段时间后,我已经将它设置为Min 50MB和Max 200MB,好处是我没有得到'OutOfMemory'exception。 到现在为止还挺好!

但是,网站上有大约50个活跃的访问者,网站开始变慢。 CPU使用率只有8%左右(Windows Taskmanager),而且任务pipe理器只显示使用中的3GB RAM的大约30%。

所以我想我的价值可以调整使用更多的内存。 老实说,我不明白这些JVM内存堆设置,所以我不知道什么是一个好的设置对我来说。

我发现了一个显示内存使用情况的CF脚本,具体如下:

Heap Memory Usage - Committed 194 MB Heap Memory Usage - Initial 50.0 MB Heap Memory Usage - Max 194 MB Heap Memory Usage - Used 163 MB JVM - Free Memory 31.2 MB JVM - Max Memory 194 MB JVM - Total Memory 194 MB JVM - Used Memory 163 MB Memory Pool - Code Cache - Used 13.0 MB Memory Pool - PS Eden Space - Used 6.75 MB Memory Pool - PS Old Gen - Used 155 MB Memory Pool - PS Perm Gen - Used 64.2 MB Memory Pool - PS Survivor Space - Used 1.07 MB Non-Heap Memory Usage - Committed 77.4 MB Non-Heap Memory Usage - Initial 18.3 MB Non-Heap Memory Usage - Max 240 MB Non-Heap Memory Usage - Used 77.2 MB Free Allocated Memory: 30mb Total Memory Allocated: 194mb Max Memory Available to JVM: 194mb % of Free Allocated Memory: 16% % of Available Memory Allocated: 100% 

我的JVM参数是:

  -server -Dsun.io.useCanonCaches=false -XX:MaxPermSize=192m -XX:+UseParallelGC - Dcoldfusion.rootDir={application.home}/../ -Dcoldfusion.libPath={application.home}/../lib 

我可以给JVM更多的内存吗? 如果是这样,我应该使用什么设置?

非常感谢!!

阅读GC和性能的一个非常好的参考是Oracle的GC调优白皮书

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

一般来说,分配给JVM的内存越多越好。 年轻一代设置得越大(虚拟机总大小的一半左右)越好。 我玩过多达28 GB的JVM。

对于监控,你想要使用jconsole(如果你是一个系统pipe理员,它是可怕的接口,仪表和限制,但它是你的),并特别注意你的GC活动和总扫描。 这也会让你了解你的内存使用模式是什么样的。 这是一个用Java编写的GUI监视器。 您需要启用JVM中的JMX扩展才能使用它。

为了查看实际使用内存的情况,“jmap”实用程序将显示堆中对象的堆大小(“jmap -heap”)和库存(“直方图”)(“jmap -F -histo”)。 第一个通常很快运行,我已经看到了第二次运行20-30分钟,在这个过程中,JVM对其他任务没有反应,所以这不是在生产实例上轻易使用的东西。

有些违反直觉的是,你的ParNew /年轻一代越大,GC越less,越快,越有效。 GC通过跟踪堆中的活动对象来工作,并以ParNew填充的方式运行。 ParNew越大,耗费的时间越多,并且更多的对象已经过期(死亡),所以GC运行频率较低,更多的对象已经死亡。 允许更多的内存GCd。 ParNew的设置很荒谬(约50 MB左右),将其boost到1-2 GB,GC开销下降到原先的1-5%(CPU的0.01% – 2%取决于主机/工作量,现在已经达到10-50%)。

您还需要调整PermGen的大小,使其不会空间不足。 这是持久对象(主要是类)的地方,当空间不足时通常是一件坏事。

答案当然是“取决于”你的应用程序。 第一步是监视你的内存使用情况。 有很多产品可以提供帮助:SeeFusion,Fusion Reactor …以及像jconsole和VisualVM这样的标准JVM监控。

找出你当前的堆使用情况,并将其提升,直到GC变得更加稳定。 还要确保你的PermGen空间足够大(如果你正在使用一个框架或很多的对象,这可能是一个问题。)

在实践中,当我们的应用程序还没有接近时,我实际上已经降低了堆的大小

由于需要更频繁地进行垃圾收集来保持小堆,所以系统可能在更高的负载下开始减速。

最大堆大小实际上限制了JVM的最大内存消耗量; 如果你想让它拥有更多的系统内存,你会想增加最大的堆大小。

但是,如果软件正在咀嚼那么多的内存,并且需要那么多的垃圾回收,那么你可能只会以一个更大的堆大小来拖延不可避免的事情。 尝试更高的设置(从1024 MB开始,然后到2048 MB),但是如果这只会延迟崩溃,那么您需要优化应用程序代码,使其更适合RAM使用。

Kai把这些关于JVM调优的大量信息放在一起。 50分钟和200分钟是相当低的。 我build议(在32位)尝试1024作为最大和最小,看看你如何去。