代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

更新到Java 6更新14后的JVM错误

  •  2
  • Robert Munteanu  · 技术社区  · 15 年前

    更新Java服务器6更新14的服务器之后,我一直有一些奇怪的错误(也许每天一次)。

    错误与

    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    # java.lang.OutOfMemoryError: requested 1759920 bytes for Chunk::new. Out of swap space?
    #
    #  Internal Error (allocation.cpp:215), pid=26706, tid=317545360
    #  Error: Chunk::new
    #
    # JRE version: 6.0_14-b08
    # Java VM: Java HotSpot(TM) Server VM (14.0-b16 mixed mode linux-x86 )
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    #
    

    够了,当前线程是编译器

      0x088a0800 JavaThread "CompilerThread1" daemon [_thread_blocked, id=26716, stack(0x12c7f000,0x12d00000)]
    =>0x0889e400 JavaThread "CompilerThread0" daemon [_thread_in_native, id=26715, stack(0x12e55000,0x12ed6000)]
    

    还有足够的内存:

     PSYoungGen      total 256064K, used 93533K [0xa2cd0000, 0xb4290000, 0xb4290000)
      eden space 228352K, 31% used [0xa2cd0000,0xa72d6308,0xb0bd0000)
      from space 27712K, 78% used [0xb2780000,0xb3cd1150,0xb4290000)
      to   space 28032K, 0% used [0xb0bd0000,0xb0bd0000,0xb2730000)
     PSOldGen        total 2275584K, used 885858K [0x17e90000, 0xa2cd0000, 0xa2cd0000)
      object space 2275584K, 38% used [0x17e90000,0x4dfa8bf8,0xa2cd0000)
     PSPermGen       total 32128K, used 27819K [0x13e90000, 0x15df0000, 0x17e90000)
      object space 32128K, 86% used [0x13e90000,0x159bac50,0x15df0000)
    

    我知道JVM崩溃很难调试,但我很好奇你们中是否有人遇到过类似的问题——以及你们是如何解决这些问题的。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Greg Bowyer    15 年前

    您正在获得的bug不是Java代码错误,而是JIT编译器中的一个问题。当JIT启动时,它会占用大量的内存作为它正常工作的内存)。此内存来自本机堆。

    对于真正有意思的错误,这个错误最终从VM(C++代码前面)发出。 http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#aRIt9pqzOVI/src/share/vm/utilities/vmError.cpp&q=OutOfMemoryError%20Out%20of%20swap%20space&l=258 不幸的是,它不是一个“真实”的记忆错误,它不会按照正常的规则行事,你不能抓住它等等。

    本机(JNI/JNA)方法可以直接从操作系统分配内存。NIO直接使用内存、热点编译器,还有其他一些

    此内存是应用程序本机堆(由malloc和friends管理的内容)的一部分,您的应用程序可能已用完本机堆,从而导致此情况发生,请查看框中的总体内存、ulimit设置等。JNI/JNA代码也可以在一定程度上发挥作用,如果它们能够耗尽可用内存,则AP应用程序具有用于本机代码的。从NIO中查找DoTimeAdppdBuffisher,因为它们也可以从Java堆中窃取内存。

    很有可能,因为您刚刚更新了JIT编译器中的某个bug,gc和jit设置可能会影响这一点,所以请尝试更改jit(从客户端到服务器或从服务器到客户端),以查看是否有任何影响,也可以尝试更改gc策略(但是请记住,您正在更改gc策略t)。o更改它与JIT的交互,而不是修复Java内存问题。

    您也可以使用命令行标志djava.compiler=none完全关闭JIT,但是这样会删除任何本机代码生成,这会损害您的性能。

    除此之外,如果你把hprof崩溃文件放在某个地方,我可能会给你更多的建议。