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

Rag*_*van 1 java

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

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

Sto*_*ica 9

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

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

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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个不是内存泄漏,但通常会导致某个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);
  }
}
Run Code Online (Sandbox Code Playgroud)