我正在使用Xmx2000m运行Java进程,主机操作系统是linux centos,jdk 1.6更新22.最近我在这个过程中遇到了一个奇怪的行为,它变得完全没有响应,没有明显的原因,没有日志,没有错误什么都没有..我使用jconsole监视处理器,堆和Perm内存不满,线程和加载的类没有泄漏.. 解释任何人?
答案 0 :(得分:6)
答案 1 :(得分:4)
进行线程转储。如果您可以访问Linux上的前台进程,请使用ctrl-\
。或者使用jstack远程转储堆栈。或者您可以通过jconsole在MBeans/java.lang/Threading/Operations/dumpAllThreads
处通过JMX戳它。
在不了解您的应用的情况下,很难推测原因。大概你的线程是a)被阻止或b)退出。如果它们被阻止,它们可能正在等待数据库上的I / O或其他操作,或者它们可能正在等待锁定或监视器(死锁)。如果存在死锁,则线程转储将告诉您哪些线程已死锁,哪个锁定,以及(在Java 6中)注释堆栈的锁定位置。您还可以使用JMX方法搜索死锁,可通过MBeans/java.lang/Threading/Operations/find[Monitor]DeadlockedThreads()
处的jconsole获取。
或者您的主题可能已收到未处理的异常并退出。查看Thread的uncaughtExceptionHandlers或(更好)在java.util.concurrent中使用Executors。
最后,Java中其他经典的暂停源是GC。使用-verbose:gc和其他GC标志运行,看看它是否正在进行完整的GC集合。您还可以通过在MBeans/java.lang/Memory/Attributes/Verbose
翻转标记来动态地在jconsole中启用此功能。
答案 2 :(得分:2)
同意aix,但想添加几个推荐内容。 1.检查你的系统。运行top以查看系统本身是否正常,CPU不是100%且内存可用。如果没有,请解决此问题。 2.应用程序可能因死锁而冻结。检查一下。
答案 3 :(得分:1)
好的,我想分享一些更新:
NTPL(Linux的新线程库)和Java 1.6+ JVM之间存在不兼容性。随机错误导致JVM挂起并占用100%的CPU。
要解决此问题,请在运行JVM之前设置LD_ASSUME_KERNEL = 2.4.1,导出LD_ASSUME_KERMEL = 2.4.1。这会禁用NTPL:问题解决了!
但出于兼容性原因,我仍在寻找使用NTPL的解决方案。
答案 4 :(得分:0)
可以使用jvisualvm和jconsole跟踪线程,也可以避免死锁。请注意,有几个网络服务,每个服务都有单独的线程池,并且它们都无法访问。
答案 5 :(得分:0)
你能详细说明你在做什么吗?记忆的2000
相当多。
答案 6 :(得分:0)
在崩溃之前检查进程的jvisualvm。 http://www.jadyounan.com/wp-content/uploads/2010/12/process.png