Java进程没有明显的原因

时间:2010-12-07 12:24:58

标签: java linux

我正在使用Xmx2000m运行Java进程,主机操作系统是linux centos,jdk 1.6更新22.最近我在这个过程中遇到了一个奇怪的行为,它变得完全没有响应,没有明显的原因,没有日志,没有错误什么都没有..我使用jconsole监视处理器,堆和Perm内存不满,线程和加载的类没有泄漏.. 解释任何人?

7 个答案:

答案 0 :(得分:6)

我怀疑任何人都可以给你一个解释,因为有很多可能的原因,而且信息不够。但是,我建议您在进程挂起后jstack找出线程正在做什么,并从那里开始。这听起来像某种deadlockthrashing

答案 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