2017-08-22 5 views
1

中規模の大規模なGroovyアプリケーションが何を生産時にゆっくり実行するのかを判断するのは、苦労しています。私はいくつかのsetCallSiteTargetNormal方法はかなりヘビー級であり、すべてのブロックのことをオンラインに言及見てきたInvoke DynamicでのGroovyパフォーマンスの問題?

at java.lang.invoke.MethodHandleNatives.setCallSiteTargetNormal(Native Method) 
    at java.lang.invoke.CallSite.setTargetNormal(CallSite.java:258) 
    at java.lang.invoke.MutableCallSite.setTarget(MutableCallSite.java:154) 
    at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.doCallSiteTargetSet(Selector.java:909) 
    at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.setCallSiteTarget(Selector.java:969) 
    at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:228) 
    at java.lang.invoke.LambdaForm$DMH/1665404403.invokeStatic_L3IL5_L(LambdaForm$DMH) 
    at java.lang.invoke.LambdaForm$BMH/1705072168.reinvoke(LambdaForm$BMH) 

:実行中のアプリケーションのスレッドダンプを取るとき、私は見ている奇妙なことは、このようなスタックトレースとたくさんのスレッドのです呼び出されている間のJVMスレッド。私たちはGroovyの動的呼び出しの呼び出しを使用しています。このメソッドをあまりにも広範囲に呼び出す原因となっているGroovyの何らかのバグにぶつかっているのだろうかと思います。私はすでにチェックした

明らかなパフォーマンスの問題:

  • メモリ使用量が
  • ファインGCオーバーヘッドでサーバー上の
  • 通常のCPU使用率がOKに見えている
  • 外部DBとWebサービスの呼び出しがありますすべて正常

CPU使用量に関する1つの注意点は、CPUが不足しているようにアプリケーションが動作していることですyは4 CPUマシンの合計CPUの約1/4を使用しています。それはスレッドがCPUを100%ペグする必要があるように動作していますが、私はそれをまったく見ていません。しかし、私が見つけたいくつかの情報は、setCallSiTeTargetNormalメソッドコールのオンラインポイントが、JVM上のすべてのスレッドを完全にブロックするものであると指しています。

+0

uがこれをヒットしていますか? https://bugs.openjdk.java.net/browse/JDK-8151981 – Eugene

+0

ええ、私はそれが同じだと思います。私はそれがGroovyの問題であると確信しているので、Groovyのバグを提出しました。 https://issues.apache.org/jira/browse/GROOVY-8298 – jjathman

答えて

0

私は、setCallSiTeTargetNormalメソッドの別の代替案を提案しよう。このような問題では、Permgen(Java 7以前)またはMetaspace(Java 8以降)をクリーニングする頻度が高すぎるかどうかを確認するためにGCログをチェックします。メタスペースは、制限を指定すると自動的に消去されますが、Permgenではコマンドラインに特定のスイッチが必要です。

実行中のJVM内でスクリプトを実行する場合、Groovyはそのような領域を集中的に使用して、すべてのスクリプトのクラスローダーをインスタンス化します。次に、限界に達すると、GCはそれをクリーニングする必要があります。たとえば、Jenkinsを使用する場合のこれは私のシナリオです。したがって、メタスペースをヒープのように使用し、同じ動作をします。すべてのGCスイープはアプリを停止し、CPUなどを叩くことなく目立つ停止を引き起こします。

このコマンドラインを使用してアプリケーションを起動し、GCがどのくらいの頻度で完全な掃引(そしてどのくらいの時間停止)。

-XX:+PrintGC -XX:+PrintGCTimeStamps -Xloggc:/my/log/file

+0

申し訳ありませんが、すでに過負荷のためにGCをチェックしていたと言われました。 –