为什么可以在Java中注销OfMemory错误?

为什么可以在Java中注销OfMemory错误?,java,exception-handling,heap,Java,Exception Handling,Heap,为了记录catch块中的任何内容,我们需要文本,它是一个字符串对象,但JVM已经耗尽了内存。我可以想到两个可能的原因: OutOfMemory错误表示堆空间和字符串对象可以保存在字符串池中 OutOfMemory错误表示只剩下很少的空间,而堆已完全满,并且用于存储要记录的字符串的空间非常小 这是一个非常广泛的问题,但有一个简单的答案:在实现JVM时,您可能不想等到100%的内存用完了 意思是:当你达到极限的99.99%时,你可以简单地拉“紧急刹车”。因为这样你就知道你有一个“微小”的储备来允许(

为了记录catch块中的任何内容,我们需要文本,它是一个字符串对象,但JVM已经耗尽了内存。我可以想到两个可能的原因:

  • OutOfMemory错误表示堆空间和字符串对象可以保存在字符串池中
  • OutOfMemory错误表示只剩下很少的空间,而堆已完全满,并且用于存储要记录的字符串的空间非常小

  • 这是一个非常广泛的问题,但有一个简单的答案:在实现JVM时,您可能不想等到100%的内存用完了

    意思是:当你达到极限的99.99%时,你可以简单地拉“紧急刹车”。因为这样你就知道你有一个“微小”的储备来允许(不知何故)协调的“紧急关闭”


    除此之外:这可能是“少”一些消息字符串给异常。。。请记住,JVM还收集堆栈跟踪信息;并将其附加到异常/错误。(imho)这比为一些消息字符串腾出空间更昂贵

    表面上的一个奇怪问题;但是给人有趣的思考食物…与你的问题不完全相同,但许多答案提供了你想要的洞察力。@Michael,这是一个很好的观点!是的,我在第二个理由中也有同样的想法。我想知道我们是否在某个地方写下了它,这样我们就可以确定这是真正的原因。我认为,作为接近原因提到的问题可能有一些见解。在任何情况下:这将是真正的具体实施;因为有很多不同的方法来处理它。@GhostCat我认为你是对的,它取决于实现。你可能很幸运,能够记录OOME没有问题,或者你可能没有。有一个JVM选项
    OnOutOfMemoryError
    ,它允许您指定在OOME情况下运行的可执行文件。这一点的存在向我表明,处理这一问题的最可靠方法是遵从其他程序。