代码之家  ›  专栏  ›  技术社区  ›  oxbow_lakes

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

  •  19
  • oxbow_lakes  · 技术社区  · 15 年前

    我们最近已经将一些应用程序从运行在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是有效的。
    • 有时我们的应用程序会与热点发生冲突 SIGSEGV 错误
    • 这影响了用Java和Scala编写的应用程序。

    最重要的一点是: 这种行为表现在那些突然得到大量数据(通常通过TCP)的应用程序中。 .就好像虚拟机决定继续添加更多的数据(可能将其推进到TG),而不是在“newspace”上运行GC,直到它意识到必须执行完整的GC,然后, 尽管实际上虚拟机中的所有内容都是垃圾,但它还是决定不收集它!

    听起来很疯狂,但我就是不知道还有什么。另外,你如何解释一个应用程序,一分钟的最大容量为1GB,下一分钟的工作正常(当应用程序运行时,永远不会超过256M) 完全一样的东西 )

    所以我的问题是:

    1. 还有人观察过这种行为吗?
    2. 对于如何调试JVM本身(而不是我的应用程序),是否有任何建议?我如何证明这是一个虚拟机问题?
    3. 有没有虚拟机专家论坛,我可以在那里问虚拟机的作者(假设他们没有这样做)?(我们没有支持合同)
    4. 如果这是最新版本的虚拟机中的一个bug,为什么没有其他人注意到它?
    6 回复  |  直到 15 年前
        1
  •  2
  •   Bill K    15 年前

        2
  •  2
  •   Rex Kerr    15 年前

    -Xmx3580M -Xmx3072M

        3
  •  2
  •   Erik Engbrecht    15 年前

        4
  •  1
  •   jarnbjo    15 年前

        5
  •  1
  •   finnw    15 年前