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:+PrintGCC原因 -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(94370384K),0.015 秒 0.015 秒>12973495K(32505856K),0.0162151 秒] [时间:用户=0.34 系统=0.00,实际=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是我执行jstack 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(943132154K),0.203132154Ks]2013 >13064648K(32505856K),0.0333109 秒] [时间:用户=0.72 系统=0.00,实际=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:444.375+0800:19209.213:[GC(GCLOCKER GC)2016-01-09T18:42:44.375+0800+0800:19209.213:[PARNEW:[PARNEW:133268K-> 1522503K)(94337184.07777777774.844,844,844,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,844,844,844,844,844,844,844,844,844,844,n 0.07; -> 13089959K(32505856K),0.0336755 秒] [时间:用户=0.69 系统=0.00,实际=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(943785864K), 0.209 秒>13379018K(32505856K),0.0995702 秒] [时间:用户=2.25 系统=0.00,实际=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(9437686184K), 0.717676184K), 0.71 >13750433K(32505856K), 0.1571136 secs] [Times: user=3.58 sys=0.00, real=0.16 secs]
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)2016-01-09T18:42:52.286+0800:19217.125:[PARNEW:[PARNEW:9201571K-> 9771K-> 9733385K) -> 14095607K(32505856K),0.3265784 秒] [时间:用户=4.46 系统=0.00,实际=0.33 秒]

2016-01-09T18:42:55.279+0800:19220.117:[GC(分配失败)2016-01-09T18:42:55.279+0800:19220.117:[ParNew:9361993K->1048576K(94347184K),233484584K秒]233 >14506810K(32505856K),0.3142791 秒] [时间:用户=5.36 系统=0.00,实际=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)2016-01-09T18:42:42:58.223+0800:192223.061:[PARNEW -> 14892045K(32505856K),0.3386214 秒] [时间:用户=5.71 系统=0.00,实际=0.34 秒]

2016-01-09T18:43:01.166+0800: 19226.005: [GC (GCLocker Initiated GC) 2016-01-09T18:43:01.166+0800: 19226.005: [ParNew: 9437184K->1048576K(9437184K), 0.3425942 secs] 23280717K -> 15266436K(32505856K),0.3427797 秒] [时间:用户=5.89 系统=0.00,实际=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(9431685084K),233385084K秒] 0. >15632857K(32505856K), 0.3191140 secs] [Times: user=5.55 sys=0.00, real=0.32 secs]
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(94371484K),430714685秒]20. >16017865K(32505856K),0.3177865 秒] [时间:用户=5.85 系统=0.00,实际=0.32 秒]

2016-01-09T18:46:25.111+0800:19429.950:[GC(分配失败)2016-01-09T18:46:25.112+0800:19429.950:[ParNew:9437184K->1048576K(9430487184K),222222 >16384589K(32505856K),0.2810767 秒] [时间:用户=5.04 系统=0.00,实际=0.28 秒]

2016-01-09T18:46:27.974+0800:19432.813:[GC(分配失败)2016-01-09T18:46:27.975+0800:19432.813:[ParNew:9437184K->1048576K(942073184K)7秒] 2016-01-09T18:46:27.975+0800: >16833663K(32505856K),0.3203207 秒] [时间:用户=5.53 系统=0.00,实际=0.32 秒]
…………
2016-01-09T18:55:25.249+0800: 19970.088: [GC (分配失败) 2016-01-09T18:55:25.249+0800: 19970.088: [ParNew: 8419546K->31852K(943714844K), 0.016 秒>5382550K(32505856K), 0.0157411 secs] [Times: user=0.33 sys=0.00, real=0.02 secs]

我发现,我执行jstack -m命令后,GC log ParNew: from size->to size(9437184K)异常,to size变得越来越大,就像一些内存无法释放。但是我jstack -m第二次执行,一段时间后to size变小了。

当系统不正常时,该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 回答