gpt4 book ai didi

java - OutOfMemoryError 和内存泄漏有什么区别

转载 作者:行者123 更新时间:2023-11-29 09:57:42 26 4
gpt4 key购买 nike

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

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

最佳答案

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

关于java - OutOfMemoryError 和内存泄漏有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4943518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com