我正在使用 NetBeans 运行应用程序,并在项目属性中将 Max JVM 堆空间设置为 1 GiB。
但是,应用程序仍然因内存不足而崩溃。
JVM 是否在系统中存储了内存?如果是这样,如何清除该内存?
我正在使用 NetBeans 运行应用程序,并在项目属性中将 Max JVM 堆空间设置为 1 GiB。
但是,应用程序仍然因内存不足而崩溃。
JVM 是否在系统中存储了内存?如果是这样,如何清除该内存?
您需要使用分析器分析您的代码——Netbeans 有一个很好的分析器。这将向您显示应用程序中内存占用的位置,并且应该让您了解问题所在。
JVM 会在内存耗尽之前尽可能多地对对象进行垃圾收集,因此您很可能在不再需要引用之后很长时间仍持有引用。要么,要么您的应用程序确实需要大量内存-但我想说它更有可能是您的代码中的错误,特别是如果问题仅在长时间运行应用程序后才出现.
我不完全理解你问题的所有细节,但我想重要的部分是可以理解的。
如果分配给 JVM的OutOfMemoryError
内存不足以容纳程序中创建的对象,则会抛出(不是异常)。在您的情况下,将可用堆空间增加到 1 GB 以上可能会有所帮助。如果您认为 1 GByte 就足够了,那么您可能存在内存泄漏(在 Java 中,这很可能意味着您有对不再需要的对象的引用——也许在某种缓存中?)。
Java 在启动时为其最大堆大小保留虚拟内存。当程序使用此内存时,操作系统会为其分配更多的主内存。在 UNIX 下,这显示为常驻内存。虽然 Java 程序可以交换到磁盘,但如果交换了部分堆,垃圾收集的性能会非常糟糕,并且可能导致整个机器锁定或不得不重新启动。如果您的程序没有这样做,您可以确定它完全在主内存中。
根据您的应用程序的用途,它可能需要 1 GB、10 GB 或 100 GB 或更多。如果您无法增加最大内存大小,您可以使用内存分析器来帮助您找到减少消耗的方法。从 VisualVM 开始,因为它是内置的并且是免费的并且做得不错。如果这还不够,请尝试使用诸如 YourKit 之类的商业分析器,您可以获得免费评估许可证(通常工作时间足以解决您的问题;)
垃圾收集器会根据需要自动清理内存,并且可能每隔几秒执行一次,甚至每秒执行一次以上。如果是这样,这可能会减慢您的应用程序,因此您应该考虑增加最大大小或减少消耗。
正如@camobap 所提到的,OutOfMemory 的原因是因为Perm Gen的大小设置得非常低。现在问题解决了。
谢谢大家的回答和评论。
Java 编译器并没有像我想的那样分配 1 GiB。Java 动态分配所需的内存并且垃圾也会收集它,每次分配内存时它都会检查它是否有足够的空间来执行此操作,如果没有则崩溃。我猜你的代码中的某个地方,因为几乎不可能编写分配这么多变量的代码,你有一个占用所有内存的数组或 ArrayList。在数组的情况下,您可能有一个分配其大小的变量,并且您对其进行了一些计算,导致它占用了太多内存。在 ArrayList 的情况下,我相信您可能有一个循环,该循环进行了太多迭代,向其中添加了元素。
检查您的代码是否存在上述错误,您应该很好。