1

質問の後、STWのようにすべてのスレッドがブロックされ、応答がないため、JAVA_OPTSをいくつか追加しました。

これが私の新しいオプションです。

-サーバー -Xms32g -Xmx32g \
 -XX:NewSize=10g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly \
 -XX:+CMSParallelRemarkEnabled -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 \
 -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime \
 -XX:+PrintGCCause -Xloggc:/var/log/flume-ng/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M

そして、アプリはたった今動作を停止しました。

これが ( wasgc logの最後の単語)の最後の行です。gc logstopped:

2016-01-09T18:37:14.193+0800: 18879.031: 適用時間: 0.0071232 秒
2016-01-09T18:37:14.193+0800: 18879.032: アプリケーション スレッドが停止された合計時間: 0.0003769 秒、スレッドの停止にかかった時間: 0.0000800 秒
2016-01-09T18:37:21.704+0800: 18886.542: 適用時間: 7.5105681 秒
2016-01-09T18:37:21.705+0800: 18886.543: [GC (割り当て失敗) 2016-01-09T18:37:21.705+0800: 18886.543: [ParNew: 8412583K->36040K(9437184K)] 93-9 秒 93-15 >12973495K(32505856K), 0.0162151 秒] [時間: user=0.34 sys=0.00, real=0.02 秒]
2016-01-09T18:37:21.721+0800: 18886.559: アプリケーション スレッドが停止された合計時間: 0.0172971 秒、スレッドの停止にかかった時間: 0.0001286 秒
2016-01-09T18:37:37.830+0800: 18902.668: 適用時間: 16.1087180 秒
2016-01-09T18:42:43.301+0800: 19208.140: アプリケーション スレッドが停止された合計時間:

次に、コマンドを使用しました。その後、jstack -mアプリは正常に戻りました。

次の gc ログは次のとおりです (最初の行305.4698351 secondは i execute thejstack commandの時間からアプリが動作を停止した時間を差し引いたものです)。

2016-01-09T18:42:43.301+0800: 19208.140: アプリケーション スレッドが停止された合計時間: 305.4715152 秒、スレッドの停止にかかった時間: 305.4698351 秒

一部のアプリケーション タイム ログをスキップする


2016-01-09T18:42:44.340+0800: 19209.179: [GC (割り当て失敗) 2016-01-09T18:42:44.340+0800: 19209.179: [ParNew: 8424650K->127192K(9437184K)] 2156 秒 3 >13064648K(32505856K), 0.0333109 秒] [時間: user=0.72 sys=0.00, real=0.03 秒]
2016-01-09T18:42:44.374+0800: 19209.212: アプリケーション スレッドが停止された合計時間: 0.0338915 秒、スレッドの停止にかかった時間: 0.0000998 秒
2016-01-09T18:42:44.374+0800: 19209.212: 適用時間: 0.0001254 秒
2016-01-09T18:42:44.375+0800:19209.213:[GC(GCLOCKER開始GC)2016-01-09T18:42:44.375+0800:19209.213:[PARNEW:133268K-> 152503K(943555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555550年->13089959K(32505856K), 0.0336755 秒] [時間: user=0.69 sys=0.00, real=0.04 秒]
2016-01-09T18:42:44.408+​​0800: 19209.247: アプリケーション スレッドが停止された合計時間: 0.0345724 秒、スレッドの停止にかかった時間: 0.0001147 秒
2016-01-09T18:42:46.920+0800: 19211.759: 適用時間: 0.8197406 秒
2016-01-09T18:42:46.921+0800: 19211.760: [GC (割り当て失敗) 2016-01-09T18:42:46.921+0800: 19211.760: [ParNew: 8541111K->441557K(9437184K)]3 0.87Ks99 >13379018K(32505856K), 0.0995702 秒] [時間: user=2.25 sys=0.00, real=0.10 秒]
2016-01-09T18:42:49.571+0800: 19214.409: 適用時間: 0.6178457 秒
2016-01-09T18:42:49.572+0800: 19214.410: [GC (割り当て失敗) 2016-01-09T18:42:49.572+0800: 19214.410: [ParNew: 8830165K->812963K(9437184K)] 26176 8 4Ks76 >13750433K(32505856K), 0.1571136 秒] [時間: user=3.58 sys=0.00, real=0.16 秒]
2016-01-09T18:42:49.729+0800: 19214.568: アプリケーション スレッドが停止された合計時間: 0.1581075 秒、スレッドの停止にかかった時間: 0.0001236 秒

2016-01-09T18:42:52.286+0800:19217.125:[GC(GCLOCKERがGCを開始したGC)2016-01-09T18:42:52.286+0800:19217.125:[PARNEW:9201571K-> 973385K(973385K) ->14095607K(32505856K), 0.3265784 秒] [時間: user=4.46 sys=0.00, real=0.33 秒]

2016-01-09T18:42:55.279+0800: 19220.117: [GC (割り当て失敗) 2016-01-09T18:42:55.279+0800: 19220.117: [ParNew: 9361993K->1048576K(9437184K4)] 25-0.10 >14506810K(32505856K), 0.3142791 秒] [時間: user=5.36 sys=0.00, real=0.31 秒]

2016-01-09T18:42:58.222+0800: 19223.061: 適用時間: 0.0000301 秒
2016-01-09T18:42:58.223+0800:19223.061:[GC(GCLOCKERがGCを開始したGC)2016-01-09T18:42:58.223+0800:19223.061:[PARNEW:9437184K-> 1048576K(9437184K-> 1048576K) ->14892045K(32505856K), 0.3386214 秒] [時間: user=5.71 sys=0.00, real=0.34 秒]

2016-01-09T18:43:01.166+0800:19226.005:[GC(GCLOCKERがGCを開始したGC)2016-01-09T18:43:01.166+0800:19226.005:[PARNEW:9437184K-> 1048576K(9437184K-> 1048576K) ->15266436K(32505856K), 0.3427797 秒] [時間: user=5.89 sys=0.00, real=0.35 秒]

2016-01-09T18:43:04.112+0800: 19228.950: 適用時間: 0.6938848 秒

その時点2016-01-09 18:43で、アプリは再び機能しなくなりました。

その後jstack -m、もう一度コマンドを使用すると、アプリは再び正常に戻りました。

これがgcログです。

2016-01-09T18:46:18.871+0800: 19423.709: [GC (割り当て失敗) 2016-01-09T18:46:18.871+0800: 19423.710: [ParNew: 9437184K->1048576K(9437184K)] 284K5 秒 80.3 秒>15632857K(32505856K), 0.3191140 秒] [時間: user=5.55 sys=0.00, real=0.32 秒]
2016-01-09T18:46:19.190+0800: 19424.029: アプリケーション スレッドが停止された合計時間: 195.0782503 秒、スレッドの停止にかかった時間: 194.7573545 秒


2016-01-09T18:46:22.197+0800: 19427.035: [GC (割り当て失敗) 2016-01-09T18:46:22.197+0800: 19427.036: [ParNew: 9437184K->1048576K(9437184K7)] 60.2 秒 60.3 >16017865K(32505856K), 0.3177865 秒] [時間: user=5.85 sys=0.00, real=0.32 秒]

2016-01-09T18:46:25.111+0800: 19429.950: [GC (割り当て失敗) 2016-01-09T18:46:25.112+0800: 19429.950: [ParNew: 9437184K->1048576K(9437184K)] 704 秒 70.4 秒>16384589K(32505856K), 0.2810767 秒] [時間: user=5.04 sys=0.00, real=0.28 秒]

2016-01-09T18:46:27.974+0800: 19432.813: [GC (割り当て失敗) 2016-01-09T18:46:27.975+0800: 19432.813: [ParNew: 9437184K->1048576K(9437184K)] 18.3 秒 73 >16833663K(32505856K), 0.3203207 秒] [時間: user=5.53 sys=0.00, real=0.32 秒]
.........
2016-01-09T18:55:25.249+0800: 19970.088: [GC (割り当て失敗) 2016-01-09T18:55:25.249+0800: 19970.088: [ParNew: 8419546K->31852K(9437184K), 37-195]5 0.01 >5382550K(32505856K), 0.0157411 秒] [時間: user=0.33 sys=0.00, real=0.02 秒]

jstack -mコマンドを実行した後、メモリが解放できなかったように、GC log ParNew: from size->to size(9437184K)が異常にto size大きくなりjstack -m、2回目の実行で、しばらくするとtoのサイズが小さくなりました。

システムが正常でない場合、jstackコマンドはオプションを追加する-F必要jmapがあり、数時間実行する必要があります。

ここでは、jstack -F結果ファイル内の特別なスレッドを示します。in_vm を除くすべてのスレッドの状態はブロックされます。

プロセス ID 23694 にアタッチしています。お待ちください...
デバッガーが正常に接続されました。
サーバー コンパイラが検出されました。
JVM のバージョンは 25.66-b17 です
デッドロック検出:

デッドロックは見つかりませんでした。

スレッド 143283: (状態 = IN_VM)
 - sun.misc.Unsafe.freeMemory(long) @bci=0 (コンパイルされたフレーム。情報は不正確な場合があります)
 - java.nio.DirectByteBuffer$Deallocator.run() @bci=17, line=94 (コンパイル済みフレーム)
 - sun.misc.Cleaner.clean() @bci=12, line=143 (コンパイル済みフレーム)
 - io.netty.util.internal.Cleaner0.freeDirectBuffer(java.nio.ByteBuffer) @bci=34, line=66 (コンパイル済みフレーム)
 - io.netty.util.internal.PlatformDependent0.freeDirectBuffer(java.nio.ByteBuffer) @bci=1, line=147 (コンパイル済みフレーム)
 - io.netty.util.internal.PlatformDependent.freeDirectBuffer(java.nio.ByteBuffer) @bci=13, line=281 (コンパイル済みフレーム)
 - io.netty.buffer.UnpooledUnsafeDirectByteBuf.freeDirect(java.nio.ByteBuffer) @bci=1, line=115 (コンパイル済みフレーム)
 - io.netty.buffer.UnpooledUnsafeDirectByteBuf.deallocate() @bci=24, line=508 (コンパイル済みフレーム)
 - io.netty.buffer.AbstractReferenceCountedByteBuf.release() @bci=39, line=106 (コンパイル済みフレーム)
 - io.netty.util.ReferenceCountUtil.release(java.lang.Object) @bci=11, line=59 (コンパイル済みフレーム)
 - io.netty.util.ReferenceCountUtil.safeRelease(java.lang.Object) @bci=1, line=84 (コンパイル済みフレーム)
 - io.netty.channel.ChannelOutboundBuffer.remove() @bci=40, line=258 (コンパイル済みフレーム)
 - io.netty.channel.ChannelOutboundBuffer.removeBytes(long) @bci=83, line=334 (コンパイル済みフレーム)
 - io.netty.channel.socket.nio.NioSocketChannel.doWrite(io.netty.channel.ChannelOutboundBuffer) @bci=238, line=317 (コンパイル済みフレーム)
 - io.netty.channel.AbstractChannel$AbstractUnsafe.flush0() @bci=89, line=750 (コンパイル済みフレーム)
 - io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0() @bci=9, line=303 (コンパイル済みフレーム)
 - io.netty.channel.AbstractChannel$AbstractUnsafe.flush() @bci=15, line=719 (コンパイル済みフレーム)
 - io.netty.channel.DefaultChannelPipeline$HeadContext.flush(io.netty.channel.ChannelHandlerContext) @bci=4, line=1119 (コンパイル済みフレーム)
 - io.netty.channel.AbstractChannelHandlerContext.invokeFlush() @bci=8, line=735 (コンパイル済みフレーム)
 - io.netty.channel.AbstractChannelHandlerContext.access$1500(io.netty.channel.AbstractChannelHandlerContext) @bci=1, line=32 (コンパイル済みフレーム)
 - io.netty.channel.AbstractChannelHandlerContext$16.run() @bci=4, line=723 (コンパイル済みフレーム)
 - io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(long) @bci=26, line=357 (コンパイル済みフレーム)
 - io.netty.channel.nio.NioEventLoop.run() @bci=106, line=357 (コンパイル済みフレーム)
 - io.netty.util.concurrent.SingleThreadEventExecutor$2.run() @bci=13, line=111 (解釈されたフレーム)
 - java.lang.Thread.run() @bci=11, line=745 (解釈されたフレーム)

ここに私の環境があります。

Java バージョン「1.8.0_66」
Linux バージョン 2.6.32-504.el6.x86_64
4

2 に答える 2

1

Linux バージョン 2.6.32-504.el6.x86_64

futex_wait バグに悩まされているカーネルを使用しているようです。

解決策は、新しいカーネルに更新することです。

于 2016-01-09T12:37:39.757 に答える
-2

メモリの問題のようです。

ケース:

  • ループ内でいくつかの変数を宣言した可能性があります。それらの変数を外側のループで作成します。
  • ヒープサイズを増やす必要があります。
于 2016-01-09T12:06:19.407 に答える