Coldfusion JVM 堆与 RAM 使用情况

Coldfusion JVM 堆与 RAM 使用情况

我需要帮助澄清运行 Coldfusion/Apache 的 CentOS 服务器上的内存使用情况。

我有一个脚本,可以将文件读入内存并逐行处理,然后插入数据库并删除文件。这不是最好的流程,正在努力,但现在只能这样做了。

读取文件时会占用大量内存,导致服务器使用交换文件,导致响应迟钝 - TOP 中的总 RAM 使用量为 3.9/3.9 GB,交换量为 1.5/1.9

我不得不重启它,总使用内存下降到大约 2GB,我运行脚本后它又回到了 3GB。在过去的几个小时里它慢慢增加到了 3.3GB - 我还有一些空间,网站都响应了,但内存没有被释放。

此外,自重新启动以来,FusionReactor 显示我的最大和分配的堆为 3.93GB,使用范围从 0.3GB 到 1GB - 这与 TOP 所说的不一致,后者是 CF9 占 3.9 的 58%,约为 2.25GB

该脚本会在夜间导入数据,因此我猜测当它稍后运行时,它会溢出到交换中并在夜间减慢网站速度(夜间流量较低但仍然需要修复 - 我现在必须禁用它)

所以我不明白两件事:

  • 为什么当文件已被读取并且脚本已完成时,RAM 没有从 3 降至 2(缺少fileClose- 太多 CFC?)
  • 为什么我的 FusionReactor 内存使用堆显示最大值为 1GB,而 CF9 的 TOP 显示为 3.9GB(2.25GB)的 58%

更新- jvm.config,减去大部分注释

# Where to find JVM
java.home=/opt/coldfusion9/runtime/jre/

# Arguments to VM
java.args=-server  -Djava.awt.headless=true -Xms4096m -Xmx4096m 
    -Dsun.io.useCanonCaches=false -XX:ParallelGCThreads=2 -XX:PermSize=64m 
    -XX:+UseConcMarkSweepGC -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:SurvivorRatio=4
    -XX:+UseParNewGC -XX:MaxPermSize=192m -Dcoldfusion.rootDir={application.home}/../ 
    -Dcoldfusion.libPath={application.home}/../lib -Dcoldfusion.classPath=
    {application.home}/../lib/updates,{application.home}/../lib,
    {application.home}/../gateway/lib/,{application.home}/../wwwroot/WEB-INF/flex/jars,
    {application.home}/../wwwroot/WEB-INF/cfform/jars -
    javaagent:/opt/fusionreactor/instance/coldfusion.CF9Standalone.cc02/                 
    fusionreactor.jar=name=coldfusion.CF9Standalone.cc02,address=8088

# commas will be converted to platform specific separator and the result will be passed
# as -Djava.ext.dirs= to the VM
java.ext.dirs={jre.home}/lib/ext

# where to find shared libraries
java.library.path={application.home}/../lib
system.path.first=false

# set the current working directory
java.user.dir={application.home}/../../lib

# JVM classpath
java.class.path={application.home}/servers/lib,{application.home}/../lib/
    macromedia_drivers.jar,        
    {application.home}/lib/cfmx_mbean.jar,{application.home}/../lib/oosdk/classes,
    {application.home}/../lib/oosdk/lib,{application.home}/lib

答案1

您的堆设置配置了 4gigs 而不是 2 - 这是 Xms4096m -Xmx4096m 告诉您的。Perm 大小又增加了 200 兆。您的新大小(年轻一代在一次操作中抓住的数量)非常高 - 通常这个数字在 64m 和 256m 之间 - 为年轻一代提供了空间来在年轻堆中上下漫游。

因此,您看到 3.9g 处于活动状态是正确的 - 尽管我期望看到类似 4.2 的情况。但 Top 有时会对 JVM 分配进行奇怪的计算。

您说得对,ColdFusion/Jrun 将整个文件读入内存(堆)——因此您的堆需要足够大才能容纳它。不过,即使是一个小文件,如果它触发了年轻一代,也会因为您的 newsize 参数而导致整整 1 GB 的分配。

如果你的服务器上总共只有 4 GB,我建议你将 newsize 和 maxnewsize 设置为 256m,并将堆设置为 3072m,如下所示 Xms3072m -Xmx3072m

这些设置适用于64 位 CF 9 服务器- 如果您运行的是 32 位系统,那么由于所有 32 位平台都存在连续内存问题,堆大小将受到约 2 GB 的硬性限制。祝您好运。

相关内容