Memory

Coldfusion JVM 堆與 RAM 使用情況

  • January 6, 2015

我需要幫助澄清執行 Coldfusion/Apache 的 CentOS 伺服器上的記憶體使用情況。

我有一個腳本,可以將文件讀入記憶體並逐行處理,插入數據庫並刪除文件。不是最好的過程,正在努力,但現在必須這樣做。

當文件被讀取時,它會佔用大量記憶體,導致伺服器使用交換文件並且它真的沒有響應 - TOP 中的總 RAM 使用量為 3.9/3.9 GB,交換為 1.5/1.9

我不得不重新啟動它,總使用的 RAM 下降到大約 2GB,我執行了腳本,它又回到了 3GB。在過去的幾個小時裡,它慢慢增加到 3.3GB——我還有一些空間,網站都響應了,但記憶體沒有被釋放。

同樣自重新啟動以來,FusionReactor 顯示我的 Max 和 Allocated Heap 為 3.93GB,Used 範圍為 0.3GB 到 1GB - 這與 TOP 所說的不一致,即 CF9 佔 3.9 的 58%,約為 2.25GB

該腳本在一夜之間導入數據,所以我猜當它稍後執行時,它會溢出到交換中並在一夜之間降低網站速度(一夜之間流量低但仍需要修復 - 我現在必須禁用)

所以我不明白的兩件事:

  • 為什麼在讀取文件並且腳本已完成時,RAM 沒有從 3 -> 2 回落(缺少fileClose- 太多 CFC?)
  • 為什麼我的 FusionReactor Memory Used Heap 顯示最大為 1GB,而 TOP 顯示 CF9 的 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

您的堆設置配置 4gigs 而不是 2 - 這就是 Xms4096m -Xmx4096m 告訴您的。燙髮尺寸又增加了 200 兆。您的新大小(年輕一代在一次操作中抓取的數量)非常高 - 通常這個數字在 64m 和 256m 之間 - 給一代空間在年輕堆上上下漫遊。

因此,您看到 3.9g 處於活動狀態的事實是正確的——儘管我希望看到類似 4.2 的東西。Still Top 有時會對 JVM 分配進行奇怪的數學運算。

你是正確的,ColdFusion/Jrun 將文件作為一個整體讀入記憶體(進入堆) - 所以你的堆需要足夠大以容納它。儘管如此,由於您的 newsize 參數,即使是觸發年輕一代的小文件也會導致完整的千兆字節分配。

如果您在伺服器上總共只有 4 個演出,我的建議是您將 newsize 和 maxnewsize 設置為 256m,並將您的堆設置為 3072m,就像 Xms3072m -Xmx3072m

這些設置適用於64 位 CF 9 伺服器- 如果您正在執行 32 位,那麼由於所有 32 位平台都存在連續的記憶體問題,堆的硬限制約為 2 gig。祝你好運。

引用自:https://serverfault.com/questions/656666