我正在开发一个Java应用程序,其架构类似于Java-EE组件作为一端而C ++组件作为另一端。
当我连续执行应用程序时,我在Java堆中得到java.lang.OutOfMemoryError
。我被告知这与Java内存泄漏不同。如果是这样,OutOfMemoryError
和Java内存泄漏之间有什么区别?我如何使用Java Profiler进行分析?
答案 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)
把它想象成一个用于盛水的水桶:泄漏意味着它正在失水,但仅仅是“空间不足”就意味着你试图过多地投入水中!所以一个水桶可能没有任何泄漏的问题。