JVM是否在系统中存储内存?如果是这样,如何清除它?

时间:2013-01-25 09:48:08

标签: java garbage-collection jvm out-of-memory

我正在使用NetBeans运行应用程序,在项目属性中,我已将Max JVM堆空间设置为1 GiB。

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

JVM是否在系统中存储了内存?如果是这样,如何清除记忆?

6 个答案:

答案 0 :(得分:6)

您需要使用分析器分析您的代码 - Netbeans有一个很好的代码。这将向您显示应用程序中内存的位置,并且可以让您了解问题所在。

JVM会在内存耗尽之前尽可能多地垃圾收集对象,因此很有可能在您不再需要它们之后很久就会保留引用。要么就是这个,要么你的应用程序真的是需要大量内存的应用程序 - 但我会说它更有可能成为代码中的错误,特别是如果问题只是在运行应用程序很长一段时间后出现问题

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

如@camobap所述,OutOfMemory的原因是因为 Perm Gen 大小设置得非常低。现在问题已经解决了。

谢谢大家的回答和评论。

答案 4 :(得分:1)

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

检查您的代码是否存在上述错误,您应该做得很好。

答案 5 :(得分: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崩溃?或者应用程序抛出异常?,跟踪它!;

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

7)内存不再是ERROR而不是Exception!,所以它是平台问题,而不是应用程序。但是永远不会,你可能会因为创建错误的算法而导致内存错误,例如创建对象的不定式循环,某些值的不定增量和e.t.c;

希望这有点帮助。