我发现我的整个应用程序都搞砸了。第一个日志混在一起了。应用程序似乎每隔一段时间就会冻结,每隔一分钟左右就冻结几乎半分钟。执行大部分任务的常规线程似乎丢失了,它们没有任何痕迹。所有这些都是从记录。根据用户的报告,套接字似乎已挂断。
仍然很少有线索,是什么引发了这一切。CPU 使用记录显示当时一切正常。正如我所猜测的,你能指出一个起点或任何逃离我脑海的特定实例,我可以解密所有这些混乱的可能原因。
谢谢, 玛维亚
我发现我的整个应用程序都搞砸了。第一个日志混在一起了。应用程序似乎每隔一段时间就会冻结,每隔一分钟左右就冻结几乎半分钟。执行大部分任务的常规线程似乎丢失了,它们没有任何痕迹。所有这些都是从记录。根据用户的报告,套接字似乎已挂断。
仍然很少有线索,是什么引发了这一切。CPU 使用记录显示当时一切正常。正如我所猜测的,你能指出一个起点或任何逃离我脑海的特定实例,我可以解密所有这些混乱的可能原因。
谢谢, 玛维亚
在内存有限的虚拟机上运行非常密集地使用 GC 的 Java 应用程序时,我遇到了这种行为。来宾操作系统没有足够的“物理”内存,因此它使用交换内存。但是交换位于映射到主机操作系统物理磁盘的“虚拟”磁盘上。
当在来宾操作系统上运行的 java GC 开始工作时,它必须从实际上位于主机操作系统物理磁盘上的堆中删除垃圾。
我不想说你的情况是相同的,但可能是相似的。所以,试着检查你有多少物理内存,你的 GC 运行的频率以及它试图清除多少内存。你给了你的 JVM 1GB。你有足够的物理内存吗?可能您的 JVM 堆实际上位于操作系统交换内存中,即磁盘上?
尝试调查您的应用程序。它是否有可能分配大量内存并经常清理它?是否可以使用缓存等?检查 perm gen 使用了多少内存以及短期对象使用了多少内存。
您为什么不尝试使用基于示例的监控工具附加到您的程序并查看线程和 JVM 子系统在做什么? JVisualVM附带 JDK,并且易于使用。