web-dev-qa-db-ja.com

設定したgcIntervalでフルGCが実行されないのはなぜですか?

  • ColdFusion 10 Update 10
  • Windows Server 2008 R2
  • Java 1.7.0_21

フルGCが10分ごとに実行されるようにしようとしています。以前のバージョンのColdFusionでgcIntervalJVM argを使用して成功しましたが、詳細なGCログで、フルGCがその時間にまだ発生していることを確認しました(旧世代がいっぱいになって完全なコレクションを強制する場合を除く) 。

これがColdFusion10\cfusion\bin\jvm.configからの完全なJVM引数です(読みやすくするために改行が追加されています)

これをColdFusion10で機能させるために、他に何かする必要がありますか?

Java.args=
-server
-Xms4072m
-Xmx4072m
-XX:PermSize=512m
-XX:MaxPermSize=512m
-Dsun.rmi.dgc.client.gcInterval=600000
-Dsun.rmi.dgc.server.gcInterval=600000
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-Xloggc:gc.log
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=1024K
-Xbatch
-Dcoldfusion.home={application.home}
-Dcoldfusion.rootDir={application.home}
-Dcoldfusion.libPath={application.home}/lib
-Dorg.Apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true
-Dcoldfusion.jsafe.defaultalgo=FIPS186Random
-Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/wwwroot/WEB-INF/cfform/jars
1
Brad Wood

グーグルでこれを見つけた人のために、アドビのエンジニアであるルーペシュ・クマールが上記にリンクしたチケットで私に提供した回答を以下に示します。


ブラッドは、一般的に、JVMは一定の定期的な間隔でGCを実行しません。フルGCをいつ実行するかを決定するのは完全にJVM次第です。 RMIの場合、オブジェクトは他のVMによってエクスポートおよび使用されるため、ガベージコレクションが配布されるため、dgcという名前になります。 DGCとは何かを理解するには、以下のリンクを確認してください http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=%2Fcom.ibm.Java.doc.diagnostics.50 %2Fdiag%2Funderstanding%2Frmi_dgc.htmlhttp://Java.sys-con.com/node/35865

その性質上、DGCは、未使用のオブジェクトを収集できるように、GCを実行できる頻度を設定する必要があります。 JDK 1.6より前は、このデフォルト間隔は60秒でしたが、JDK 1.6以降、これはデフォルトで1時間に延長されました。

ここで、この設定が機能しない理由について説明します。デフォルトでは、RMIサーバーはTomcatで実行されないため、DGCは実行されません。 CF 9では、組み込みサーバーはJRunでした。これは、もちろんRMIサーバーを実行するスタックアプリケーションサーバーです。

-ルーペシュ・クマール

1
Brad Wood

まず、私はガベージコレクションやJVM構成の専門家ではないということから始めましょう。あなたが試みている問題では、ガベージコレクションを制御することはできないと私は理解しています。ガベージコレクターに特定の間隔で実行するように「要求」することはできますが、ガベージコレクションが必要ない場合は、実行されません。

これが私にとって非常に有用であることが証明された2つのリンクです:

JVMメモリ管理とColdFusionログ分析

パフォーマンスチューニング

上記の最初のリンクから:

ガベージコレクションが実行される正確な時間は制御できません。アプリケーションはJVMにGCの実行を要求できますが、JVMは要求されたときに必ずしもGCを実行するわけではなく、次の機会にスケジュールします。通常、アプリケーションはJVMにGCの実行を要求しません。代わりに、JVMは、ガベージコレクションの最適な実行方法に関するいくつかの可能なアルゴリズムの1つを使用するように構成されています。選択されるアルゴリズムは、アプリケーションのニーズに基づいており、さまざまな方法でパフォーマンスに影響を与える可能性があります。目標は、ハードウェアリソースとアプリケーションのニーズに適したアルゴリズムを選択することです。 Webアプリケーションにとって理想的には、ユーザーエクスペリエンスへの中断を最小限に抑えるアルゴリズムを選択することが望ましいです。ここにある-XX:+ UseParallelGCは、ColdFusionがインストールされている場合のデフォルト設定です。

0
Miguel-F

1時間のフルGcは、CF10がそれを使用するTomcatのいずれかの機能のようであり、はい、私も時間制限のあるフルGCを発生させようとして問題が発生しました。この最後の項目は、Tomcat内のどこかで抑制されていない限り、Tomcat機能ではなくJVM機能であるため奇妙だと思います。また、CF Adminのメトリックログ設定では、非常に便利なメトリックが作成されないこともわかりました。 JRunにあったので何もありません。

0
Mike Brunt