当前位置: 首页 > 面试题库 >

JVM OutOfMemory错误“死亡螺旋”(不是内存泄漏)

沈思博
2023-03-14
问题内容

我们最近一直在将许多应用程序从RedHat linux JDK1.6.0_03下运行迁移到Solaris 10u8
JDK1.6.0_16(规格更高的机器),并且我们注意到了一个似乎很紧迫的问题:在某些负载下,我们的JVM获得了自己陷入“死亡螺旋”,并最终失去记忆。注意事项:

  • 不是内存泄漏的情况 。这些应用程序运行良好(在一种情况下已超过3年),并且在任何情况下都无法确定内存不足错误。有时应用程序可以工作,有时却不能
  • 不是我们迁移到64位虚拟机 -我们仍在运行32位
  • 在一种情况下,在1.6.0_18上使用最新的G1垃圾收集器似乎已解决了该问题。在另一个方面,回到1.6.0_03已奏效
  • 有时我们的应用会因HotSpot SIGSEGV错误而崩溃
  • 这影响了用Java和Scala编写的应用程序

最重要的一点是: 这种行为在突然获取大量数据(通常通过TCP)的那些应用程序中表现出来 。好像VM决定继续添加更多数据(可能将其添加到TG),而不是在“
newspace”上运行GC,直到它意识到必须执行完整的GC,然后, 尽管VM中的几乎所有内容都是垃圾,它决定以某种方式不收集它!

听起来很疯狂,但我只是看不到其他东西。您还能如何解释一个应用程序,该应用程序在一分钟内崩溃,最大堆容量为1Gb,而下一分钟工作正常(当应用程序做
完全相同的事情 时,永远不会达到256M左右)

所以我的问题是:

  1. 有没有其他人观察到这种行为?
  2. 有谁对我如何调试JVM本身(相对于我的应用程序)有任何建议?如何证明这是VM问题?
  3. 是否有任何VM专家论坛可供我询问VM的作者(假设他们不在SO上)?(我们没有支持合同)
  4. 如果这是最新版本的VM中的错误,那么为什么没有人注意到它?

问题答案:

有趣的问题。听起来其中一个垃圾收集器在您的特定情况下效果不佳。

您是否尝试过更改正在使用的垃圾收集器?有很多GC选项,弄清楚哪个是最佳选择,似乎有点不明智,但是我想知道是否有一个基本的更改对您有用。

我知道有一个“服务器” GC的工作往往比默认GC更好。你在用那个吗?

对于您的特定情况,线程GC(我相信这是默认值)可能是最糟糕的,我注意到,当计算机繁忙时,它的攻击性通常会降低。

我注意到的一件事,通常需要两个GC才能说服Java真正清除垃圾。我认为第一个倾向于取消链接一堆对象,第二个实际上删除它们。您可能要执行的操作有时是强制两个垃圾回收。这将导致大量的GC暂停,但是我从未见过要花费两个以上的时间来清理整个堆的情况。



 类似资料:
  • 我有一个复杂的应用程序,有很多第三方库,动态加载的插件。并且在main退出后,某个东西会导致应用程序崩溃()。调用堆栈指向未知地址,因此我不仅无法调试,甚至不知道崩溃发生在哪里。 我试着用运行这个应用程序--它显示了泄漏(一些千字节),但我认为它们是误报,并且/或者我无法对它们做任何处理,因为它们来自第三方。 我的问题:我相信内存泄漏不可能造成一个分段故障,至少我找不到可能的场景。但因为我不确定,

  • 本文向大家介绍什么是内存泄漏?相关面试题,主要包含被问及什么是内存泄漏?时的应答技巧和注意事项,需要的朋友参考一下 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

  • 问题内容: 我正在运行django应用程序,其中包括matplotlib,并允许用户指定图形的轴。这可能会导致 “溢出错误:超出了Agg复杂度” 发生这种情况时,最多会占用100MB的RAM。通常,我会使用,和释放该内存,但是与该错误关联的内存似乎与该绘图对象无关。 有谁知道我该如何释放记忆? 谢谢。 这是一些给我Agg复杂度错误的代码。 问题答案: 我假设您可以至少运行一次您发布的代码。该问题仅

  • 我在Camel中定义了一个路由,内容如下:GET请求进来,在文件系统中创建一个文件。文件消费者将其拾取,从外部Web服务获取数据,并通过POST将生成的消息发送到其他Web服务。 下面的简化代码: 多播中的三个endpoint只是将生成的消息发布到其他Web服务。 当队列(即文件目录cameldest)相当空时,这一切都可以很好地工作。正在cameldest中创建文件/ 但是,一旦传入请求堆积到大

  • 本文向大家介绍内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?相关面试题,主要包含被问及内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?时的应答技巧和注意事项,需要的朋友参考一下 (1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。 (2)引起内存泄露的原因 (3)内存泄露检测工具 ------>LeakCanary 内存溢出 out of memory:是指程序在申请内存时,没有足够的内

  • 我有一个后台服务正在运行,它正在将数据同步到我的服务器。 泄漏发生在以下代码中: 内存分析器显示: stockserv.datasyncer.jobexecutor@0x135f6550上的线程保留了总大小为18.603.056(37,90%)字节的局部变量。内存累积在“”加载的“java.lang.Object[]”的一个实例中。 JobExecutor->Arraylist->Object[2