OutOfMemoryError和内存泄漏之间有什么区别

时间:2011-02-09 10:22:27

标签: java

我正在开发一个Java应用程序,其架构类似于Java-EE组件作为一端而C ++组件作为另一端。

当我连续执行应用程序时,我在Java堆中得到java.lang.OutOfMemoryError。我被告知这与Java内存泄漏不同。如果是这样,OutOfMemoryError和Java内存泄漏之间有什么区别?我如何使用Java Profiler进行分析?

3 个答案:

答案 0 :(得分:9)

Java中的内存泄漏是指您不使用的对象无法进行垃圾回收,因为您仍然可以在某处对它们进行引用。

当没有剩余内存来分配新对象时,抛出OutOfMemoryError。这通常是由内存泄漏引起的,但如果您只是想在内存中同时保留太多数据,也会发生这种情况。

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

实施例

这是一个特别愚蠢的内存泄漏。从不使用旧对象,但不能进行垃圾回收。虽然看起来很荒谬,但在大型项目中,您可以轻易地错误地创建等效泄漏。

public class Leaky
{
  private static List<Object> neverRead = new ArrayList<Object>();
  public static void main(String[] args)
  {
    while(true)
    {
      neverRead.add(new Object());
    }
  }
}

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

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);
  }
}

答案 1 :(得分:1)

  

当我讨论一些这样的说法与java内存泄漏有所不同。如果是这样,那么OutofMemory Error和Java Memory泄漏之间的区别是什么。

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

(还有其他可能的原因以及内存泄漏。您可能正在尝试针对配置的堆大小过大的问题运行应用程序。或者,您可能有一个导致它分配的错误(比如说)一个可笑的大阵列。)

答案 2 :(得分:0)

把它想象成一个用于盛水的水桶:泄漏意味着它正在失水,但仅仅是“空间不足”就意味着你试图过多地投入水中!所以一个水桶可能没有任何泄漏的问题。