2015-02-26 57 views
1

我无法调试问题,它可能发生的可能性有多大。 任何人都可以告诉我吗?如何调试JAVA堆中的内存不足错误

+0

很多可能性都可能导致这种情况。最有可能是Vector的一个非常大的ArrayList。没有看到你的代码很难知道。它是否有大量的课程或只有一两个? –

+0

另外,您可以使用java的'-Xmx'标志来增加堆大小。但是,您应该尝试了解是什么导致它首先发生它是一个有问题的对象,它正在泄漏并且未被GC收集。 –

+0

您能否提供代码?最常见的原因是尝试创建比JVM可用内存大的数据结构(集合或数组),无限循环将元素插入集合和无限递归中。 –

回答

0

简单的方法 - 您可以使用JDK中的jvisualvm。在左侧选择您的应用程序,然后在Monitoring选项卡上执行堆转储,然后您可以发现内存泄漏。你也可以在jvisualvm中运行内存分析器。

0

使用命令行'断点'。 几行中,添加类似

System.out.println("Made it thus far!");

或有很多循环的代码,你可以用它来确保您不会重复太多次:

System.out.println("Made it thus far! i = " + i1); 哪里i1是一个额外的循环计数器。

并将其向下和向下移动,直到出现错误而不是该打印。这将有助于确定发生错误的线路。

如果可以的话,请记住发布您的代码,因为它可以使工作变得更加简单,并且您可以在一分钟之内解决问题。

+0

虽然它会起作用,但在抛出OutOfMemoryError之前,您很可能会看到数百万个打印输出。您也可以分析应该显示最近的方法调用的错误的堆栈跟踪。 –

+0

@JaroslawPawlak你为什么会看到数百万?在没有意图侮辱的简单程序中,听起来像是这个开发人员的相对能力,可能不会有数百万的打印。尽管每个程序都是独一无二的*。你能举出一些简单的代码,这会导致高内存使用率,简单,并产生数百万这些打印? – Scruffy

+0

@ TheJavaNot-So-Pro意外的无限循环,不断向集合添加元素。递归斐波那契用于大输入。 –

1

有一些工具可用于内存分析。

1) Eclipse Memory Analyzer (MAT)

2Java VisualVM

参阅通过工具生成的报告,并修复问题提内存分析报告。

您可以使用它们中的任何一个来生成报告

+0

只是添加到这个答案 - 我最近有一个类似的问题,并设法跟踪这个问题,使用VisualVM我能够采取堆转储和确定堆中最大的对象,并从那里开始工作。 – PeterK