2016-09-01 20 views
1
私は、Java 7オーバーのTomcat 7.0.42を使用してアプリケーション( Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

問題があるとやや再発の問題を抱えている

、その目に見える原因、と明らかにせず無作為に(明らかにそうではないと思いますが)、Javaヒープが75%以上までいっぱいになり、完全なガーベジコレクションが有効になります。

問題は、FullGCの後でメモリが解放されないため、FullGCが再び開始されることです。これは連続的に繰り返されるので、CPUはGCを実行するだけでビジーであり、他のスレッドにはほとんどCPUサイクルが与えられず、他のすべてのTomcatスレッドを効果的にハングします。

これは、5分または10分を超えない範囲で発生します。

システムの負荷には関係していないようです。これは、3つ以上のスレッドをアクティブにして実行していないときにも発生するためです。

ヒープまたはスタックのダンプを取得しようとしても、Javaプロセスの応答がないために困難です。

私は1時間のヒープヒストグラムを取得し、とにかく、やった、と、残念ながら私は今、完全なヒストグラムを持っていない(私の悪い、私は予告なしにファイルを削除した)が、私はチャットからこの情報を保持:

1:  48504970  1552159040 org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2 
2:  48506821  1164163704 java.util.concurrent.ConcurrentLinkedQueue$Node 

ご覧のとおり、org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2のインスタンス数が48kを超え、同じ数のjava.util.concurrent.ConcurrentLinkedQueue$Nodeインスタンスがあります(このインスタンスは最初のインスタンスによって保持されています)。これは、ほぼ2.5GBを保持し、私のメモリヒープは3GBです。

私はこの問題が発生した時間のうちの1つをjstackスレッドでダンプしています。ここで投稿できる文字制限はありません。誰かがそれを見たいと思ったら、私にそれを共有してくれるようお願いしてください。

今私が持っている唯一の解決策は、TomcatのJavaプロセスを強制終了し、サーバーを再起動することです。

この理由は何ですか?

オカレンスの時間さえもランダムなようです。それは時々朝、時には夜に起こる。ある日、同じ日に2回発生しました(真ん中でTomcatを再起動します)。

Linux(Linux version 3.10.0-123.9.2.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)) #1 SMP Tue Oct 28 18:05:26 UTC 2014)よりJava 7(ビルド1.7.0_51-b13)でTomcat 7.0.42を実行しています。

また、JBoss Infinispan CacheとApollo MQメッセージサービスのインスタンスもありますが、どちらも原因ではないと思います。

+0

問題が発生した場合は、アプリケーションのスレッドダンプを提供してください。 – benbenw

+0

@benbenw、あなたの応答のおかげで!私はあなたの応答に[ファイル](https://drive.google.com/file/d/0B_dQKrkjWdg_MU51MjBESG9fVlE/view?usp=sharing) – medicenfranito

答えて

1

ほとんどのhttpスレッドはlog4jでブロックされています。

おそらく、log4jのレベルが低すぎる(例えばトレース)を持っている

これはにつながる:により競合に

  • 競合
  • メモリ割り当て
  • 悪いパフォーマンス

を、メモリは長く保持されます。

log4jレベルをWARNに設定してください。

これで問題はすべて解決するわけではありませんが、役立つでしょう。

+0

へのリンクです! 私はそれも気付きましたが、GC Utilizationの大半を占めるGCのために、スレッドがコードを実行することができないので、log4jを介したブロックと競合が起こるかどうかは分かりません。ロックを保持しているスレッドが前進して解放することができないためにロックされる もう1つのことは、これが本当に素早く発生し、次に同じ(またはそれ以上の)量のHTTPロード(およびそれ以上のログ)もう一度オカラしません。 私は間違いなくlog4jのパフォーマンスを調整しようとしていますが、これが本当の原因だとは思わない... – medicenfranito