java - java应用程序假死。 Jstack可以使应用程序恢复吗?

标签 java garbage-collection jstack

今天我发现我的应用程序无法访问。然后我登录我的服务器。我发现应用程序的线程正常,但是CPU负载太高。

然后,我想使用jstack命令,但它指出需要-F选项。现在我发现GC日志停留在[GC (Allocation Failure) 2015-10-10T10:18:10.564+0800: 71147.518: [ParNew:,并且没有其他日志。

然后,我使用了jstack -F命令,奇怪的事情发生了。CPU正常了,我的服务器也正常了,GC日志也正常了,第一行是[GC (Allocation Failure) 2015-10-10T10:17:50.757+0800: 53501.137: [ParNew: 210022K->245K(2 35968K), 369.6907808 秒] 400188K->1 90410K(1022400K), 369.6909604 secs] [Times: user=3475.15 sys=11.69, real=369.63 secs]。并且jstack的结果可运行线程都是GC线程,如“Gang worker#4(并行GC线程)” os_prio=0 tid= 0x00007f5f10021800 nid=0x6477 可运行

这是我的 JAVA_OPTIONS

-server -Dfile.encoding=UTF-8 \ -Xms2g -Xmx2g -Xmn512m \ -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 \ -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 \ -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:/data/logs/gc-skynetlog_web.log \ -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M \ -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/dump_skynetlog_web.hprof

最佳答案

有一个影响 Linux 内核 3.14 - 3.18 的新错误

症状,线程在同步原语上阻塞时消耗 100%。发送信号(就像 jstack -F 所做的那样)正在解决这种情况。 对于 JVM,如果 GC 线程受此影响,应用程序将永远处于 STW 暂停状态。

您可以在 this post by Gil Tene 中找到更多详细信息

关于java - java应用程序假死。 Jstack可以使应用程序恢复吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080291/

相关文章:

java - 需要帮助退出包含在 java 字符串中的 while 循环

java - Storm 如何处理垃圾收集?

java - jstack - 不包含线程堆栈跟踪

Liferay 模块(OSGi 包)保留在 "Stopping"

java - 按顺序下载文件

java - ReSTLet客户端如何处理媒体类型的请求?

java - ElasticSearch 和 Java 环境变量

garbage-collection - 为什么需要垃圾回收?

java - 加载数据时达到饱和点;我如何控制 Java GC 生成?

java - jstack 抛出异常询问核心