我们的 ColdFusion 服务器和正确配置 JRE 时遇到问题。为了解决这个问题,我们安装了 Oracle JRockit 并切换了 jvm.config 以尝试查找任何内存泄漏。
安装 JRockit 后,我们的服务器运行得比以往更好。我们将 JRockit 程序和控制台保持打开状态几天,内存使用量保持在 200mb 以下。我们最终关闭了服务器上的程序,立即内存使用问题又回来了。
这是 FusionReactor 中 Java 堆的屏幕截图,用于说明正在发生的情况。
我无法直接在这里发布此内容,因为我还没有足够的声誉点: http://www.weblisters.com/icm/FusionReactorJavaHeap-JRockit-Console.png
以下是 jvm.config 文件中的主要设置:
java.home=C:/Progra~2/Java/jrockit-jdk1.6.0_33-R28.2.4-4.1.0/jre
java.args=-server -Xms1024m -Xmx1024m -Xgc:parallel -Dsun.io.useCanonCaches=false -Dcoldfusion.rootDir={application.home}/ -XX:+HeapDumpOnOutOfMemoryError -Xmanagement:ssl=false,authenticate=false,autodiscovery=true
我们关闭 Jrockit 控制台后立即抛出此错误: 错误:没有足够的存储空间来处理 tsStartJavaThread (src/jvm/threads/vmthread/lifecycle.c:1096) 中的此命令。
Attempting to allocate 1G bytes There is insufficient native memory for the Java Runtime Environment to continue.
有谁知道为什么垃圾收集 (GC) 在 JRockit 控制台窗口打开并运行时似乎工作得更好?我们不能将其作为永久解决方案保持开放。
最佳答案
我想我应该发布一个最终对我们有用的决议的更新。我不确定为什么在使用 JRockit 时 GC 似乎运行得更好(特别是在内存泄漏测试期间),但我们找到了 JVM 机器的一个设置,它似乎使我们能够控制调用 GC 的频率。
-Dsun.rmi.dgc.client.gcInterval=27000 -Dsun.rmi.dgc.server.gcInterval=27000
这两个设置允许我们根据需要频繁或不频繁地专门调用 GC,并且我们需要更改它的默认设置。我们还根据一些精彩的博客文章(链接在底部)更新了整个 java.args 行。这是我们更新的 java.args,它使我们的服务器正常运行。
java.args= -server -DJINTEGRA_NATIVE_MODE -DJINTEGRA_PREFETCH_ENUMS -Xmx1024m -Xms1024m -XX:MaxPermSize=192m -XX:PermSize=192m -XX:+UseParallelGC -Dsun.rmi.dgc.client.gcInterval=27000 -Dsun.rmi.dgc.server.gcInterval=27000 -Dcoldfusion.rootDir={application.home}/ -Djava.compiler=NONE -Xnoagent -Xdebug
博客文章:
关于java - 当 JRockit Console 窗口打开时,ColdFusion Java 堆工作正常,但当 JRockit Console 关闭时,内存使用量会急剧上升然后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800271/