我正在开发一个Java应用程序,它的体系结构类似于以Java-EE组件为一端,以C++组件为另一端。
当我连续执行应用程序时,我在Java heap中获得了java.lang.OutOfMemoryError。我被告知这与Java内存泄漏不同。如果是这样的话,OutOfMemoryError和Java内存泄漏有什么区别?我如何用Java分析器来分析它呢?
发布于 2011-02-09 18:26:18
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);
}
}发布于 2011-02-09 18:28:09
当我讨论一些像这样的时候,我告诉了
内存leak.If是不同的,那么OutofMemory错误和java内存泄漏有什么不同呢?
这两者是密切相关的。OutOfMemoryError是一个错误(不是异常,因此不会被catch(Exception e)块捕获),它在JVM耗尽内存时抛出。内存泄漏可能是导致JVM内存不足的原因。在你所描述的情况下,我会说这是可能的原因。
(还有其他可能的原因以及内存泄漏。您可能试图在一个对配置的堆大小而言太大的问题上运行应用程序。或者,您可能有一个bug,导致它分配(比方说)一个非常大的数组。)
发布于 2011-02-09 18:25:48
把它想象成一个用来盛水的水桶:漏水意味着它失去了水,但简单地说,“空间不足”意味着你试图往里面放太多水!因此,存储桶可能会空间不足,而不会有泄漏的问题。
https://stackoverflow.com/questions/4943518
复制相似问题