首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutOfMemoryError和内存泄漏之间的区别是什么

OutOfMemoryError和内存泄漏之间的区别是什么
EN

Stack Overflow用户
提问于 2011-02-09 18:22:27
回答 3查看 3.4K关注 0票数 1

我正在开发一个Java应用程序,它的体系结构类似于以Java-EE组件为一端,以C++组件为另一端。

当我连续执行应用程序时,我在Java heap中获得了java.lang.OutOfMemoryError。我被告知这与Java内存泄漏不同。如果是这样的话,OutOfMemoryError和Java内存泄漏有什么区别?我如何用Java分析器来分析它呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-09 18:26:18

Java中的内存泄漏是当您不使用的对象不能被垃圾收集时,因为您在某个地方仍然有对它们的引用。

当没有剩余内存可用于分配新对象时,将抛出OutOfMemoryError。这通常是由内存泄漏引起的,但如果您只是试图一次在内存中容纳太多数据,也可能发生这种情况。

JDK包括一些有用的工具,如jhat和visualVM,它们允许您检查内存中的对象以及它们之间的引用。使用这些工具,您通常可以找到导致问题的对象。

示例

这是一个特别愚蠢的内存泄漏。旧对象永远不会被使用,但不能被垃圾回收。虽然这看起来很可笑,但你很容易在大型项目中错误地创建一个等效的泄漏。

代码语言:javascript
复制
public class Leaky
{
  private static List<Object> neverRead = new ArrayList<Object>();
  public static void main(String[] args)
  {
    while(true)
    {
      neverRead.add(new Object());
    }
  }
}

这不是内存泄漏,但通常会在某个地方导致OutOfMemoryError

代码语言:javascript
复制
public class Allocaty
{
  public static void main(String[] args)
  {
    long[] array = new long[Integer.MAX_VALUE];
    long value = 1L;
    for(int ii=Integer.MAX_VALUE; ii>=0; ii--)
    {
      array[ii] = value++;
    }
    String str = Arrays.toString(array);
    System.out.printf("%d: %s", array.length, str);
  }
}
票数 9
EN

Stack Overflow用户

发布于 2011-02-09 18:28:09

当我讨论一些像这样的时候,我告诉了

内存leak.If是不同的,那么OutofMemory错误和java内存泄漏有什么不同呢?

这两者是密切相关的。OutOfMemoryError是一个错误(不是异常,因此不会被catch(Exception e)块捕获),它在JVM耗尽内存时抛出。内存泄漏可能是导致JVM内存不足的原因。在你所描述的情况下,我会说这是可能的原因。

(还有其他可能的原因以及内存泄漏。您可能试图在一个对配置的堆大小而言太大的问题上运行应用程序。或者,您可能有一个bug,导致它分配(比方说)一个非常大的数组。)

票数 1
EN

Stack Overflow用户

发布于 2011-02-09 18:25:48

把它想象成一个用来盛水的水桶:漏水意味着它失去了水,但简单地说,“空间不足”意味着你试图往里面放太多水!因此,存储桶可能会空间不足,而不会有泄漏的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4943518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档