2013-01-25 30 views
4

我正在运行使用NetBeans的应用程序,并且在项目属性中我已将Max JVM堆空间设置为1 GiB。JVM是否在系统中存储内存?如果是这样,如何清除它?

但是,应用程序仍然崩溃,内存不足。

JVM是否有存储在系统中的内存?如果是的话如何清除内存?

+3

也许你的应用程序没有足够的PermGen内存? – CAMOBAP

+0

崩溃的原因是在你的代码中。分析你的代码与内存分配的关系。 –

+1

代码将在全新检出后正常运行。在连续编译,运行,调试大约1或2天后,Out of Memory错误开始。 –

回答

3

正如@camobap所提到的,OutOfMemory的原因是因为彼尔姆Gen大小设置得非常低。现在问题解决了。

谢谢大家的回答和意见。

4

我不完全理解你的问题的所有细节,但我想重要的部分是可以理解的。

如果分配给JVM的内存不足以满足程序中创建的对象,则会抛出OutOfMemoryError(不是一个例外)。在你的情况下,它可能有助于将可用堆空间增加到1 GB以上。如果您认为1 GByte就足够了,那么您可能会发生内存泄漏(在Java中,这很可能意味着您有对不再需要的对象的引用 - 可能是某种缓存?)。

6

你会想用一个分析器来分析你的代码 - Netbeans有一个好的。这会告诉你内存在你的应用程序中的位置,并且应该告诉你问题出在哪里。

JVM会在内存耗尽之前尽可能多地垃圾收集对象,所以很可能在您不再需要它们很长时间之后仍然保留引用。要么,要么你的应用程序真的是需要大量内存的应用程序 - 但我认为这很可能是你的代码中的一个bug,特别是如果问题只在长时间运行应用程序后才会出现。

3

Java在启动时为其最大堆大小保留虚拟内存。当程序使用这个内存时,操作系统会为它分配更多的主内存。在UNIX下,这显示为驻留内存。虽然Java程序可以交换到磁盘,但如果堆的一部分被交换,垃圾收集的性能会非常糟糕,并且可能导致整个机器被锁定或重新启动。如果你的程序没有这样做,你可以确定它完全在主内存中。

根据您的应用程序的不同,它可能需要1 GB,10 GB或100 GB或更多。如果无法增加最大内存大小,则可以使用内存分析器来帮助您找到降低功耗的方法。从VisualVM开始,因为它是内置的,免费的,并且做一份体面的工作。如果这还不够,请尝试使用商业性能分析器,例如YourKit,您可以获得免费的评估许可证(通常工作时间足以解决您的问题;)

垃圾收集器根据需要自动清除内存,每隔几秒执行一次,甚至每秒执行一次。如果这可能会减慢你的应用程序,那么你应该考虑增加最大尺寸或降低功耗。

+0

应用程序在调试IDE(Netbeans)时将自行关闭。这是因为内存不足吗? –

+0

抛出OutOfMemoryError的线程可能会死,如果你没有捕获它。如果它是唯一的非守护线程,这可能会导致程序退出。您可以让调试器捕获这个错误以确定它发生的位置,但它通常不是一个简单的错误,所以调试器对于诊断这类问题并不是那么有用。问题通常是,您使用的程序数量太多而无法使用内存。您必须分析整个内存使用情况,以确定其原因。 –

+0

@AndrewAlcock 1)JVM的虚拟内存大小包括启动时的最大堆大小。它这样做是为了确保堆地址空间连续。最小尺寸是它可以自由成长的关键。 hello world程序不会使用最小尺寸,并且JVM在达到最小尺寸之前可能仍然是GC。 2)这是真的,但如果即使一小部分被交换,JVM的行为也会非常糟糕,以至于在GC之后可以假设它不会被交换。 –

1

Java编译器不会像我想的那样分配1 GiB。 Java动态分配所需的内存,并且垃圾也会收集它,每次分配内存时,它都会检查它是否有足够的空间来执行此操作,如果不是,则会崩溃。我在你的代码的某个地方猜测,因为编写分配那么多变量的代码几乎是不可能的,你有一个数组或ArrayList占用所有内存。在一个数组的情况下,你可能有一个变量分配它的大小,你做了一些计算,使得它占用太多的内存。在ArrayList的情况下,我认为你可能会有一个循环迭代过多,增加了元素。

检查你的代码是否有上述错误,你应该很好。

0

你真正的意思在“JVM在系统上存储内存”? JVM肯定是OS上的DEPENDED平台,但同时它也是框架库集合。 所以我会尝试详细解释JVM的行为:

1)Java代码编译成字节码(JVM可理解);

2)JVM处理这些代码,并且当应用程序运行时,JIT编译器从驻留在JVM上的编译源调用适当的字节码 。在这个以前的应用(如WINAPI)平台上运行的应用程序完全是HEX !,所以如果你只需要打开1个窗口,应用程序就会窃取你的RAM内存,只要它需要它!

3)JVM定位编译的字节码,当发生适当的事件时,它只编译相应的代码! (这在JVM中非常重要),它不会完全像WinApi那样做! 4)它可能是算法错误,也可能是应用程序由于某些异常错误或系统故障而崩溃(请仔细检查!);

5)当然! JVM取决于RAM内存,还有哪些地方应该超越? - ),所以强烈建议您先检查应用程序源代码!是JVM崩溃?或App引发异常?,追踪它!

6)Borh HEAP和STACK内存是COMPUTER MEMORY的一部分。这是为了另一个目的,以这种方式区分内存位置;

7)内存不足更像是ERROR而不是Exception !,所以它是平台问题而不是应用程序的问题。但无论如何,你可能通过创建不正确的算法导致内存错误,例如创建对象的不定式循环,某些值和e.t.c的不定增量;

希望这有助于一点。

相关问题