Java应用程序不一致的状态

时间:2012-04-17 16:34:25

标签: java multithreading jvm

我发现我的整个申请搞砸了。第一个日志得到mingled up。应用似乎在每隔一定时间间隔后冻结,每分钟左右后冻结差不多半分钟。执行大部分任务的常规线程似乎已经丢失并且没有他们的痕迹。所有这些都是从日志记录。根据用户的报告,Socket似乎已经挂起了。

仍然很少有线索,是什么引发了所有这些。 CPU使用记录显示当时一切正常。正如我猜测的那样,你能指出一个起点或任何特定的实例逃避我的想法,打击我可以解释所有这些混乱的可能原因。

谢谢, Mawia

2 个答案:

答案 0 :(得分:2)

我在运行java应用程序时经历了这种行为,该应用程序在内存有限的虚拟机上非常密集地使用GC。来宾操作系统没有足够的“物理”内存,因此使用了交换内存。但交换是在映射到主机操作系统物理磁盘的“虚拟”磁盘上。

当客户操作系统上运行的java GC开始工作时,它必须从实际位于主机操作系统物理磁盘上的堆中删除垃圾。

我不想说你的情况是一样的,但可能是相似的。因此,请尝试检查您拥有多少物理内存以及GC运行的频率以及尝试清除的内存量。你给你的JVM 1GB。你有足够的物理记忆吗?可能你的JVM堆实际上位于OS交换内存中,即在磁盘上?

尝试调查您的申请。是否有机会分配大量内存并经常清理它?是否可以使用缓存等?检查perm gen使用了多少内存以及我的短生命对象。

答案 1 :(得分:1)

为什么不尝试使用基于样本的监视工具附加到程序中,看看线程和JVM子系统正在做什么? JVisualVM附带JDK,并且易于使用。