java如何处理java.lang.OutOfMemoryError异常

一、概述

我正在Java 5编写客户端Swing应用程序(图形字体设计器)最近,我遇到了错误,因为我在内存使用上并不保守。用户可以打开无限数量的文件,并且程序将打开的对象保留在内存中。经过快速研究,我在5.0 Java虚拟机中发现了人机工程学,其他人则说在Windows计算机上,JVM默认将最大堆大小设置为java.lang.OutOfMemoryError: Java heap space64MB

在这种情况下,我应该如何处理这种限制?

我可以使用java的命令行选项来增加最大堆大小,但这需要找出可用的RAM并编写一些启动程序或脚本。此外,增加到某个有限的最大值并不能最终解决这个问题。

我可以重写一些代码,以将对象频繁地持久保存到文件系统中(使用数据库是同一回事)以释放内存。它可以工作,但是可能也很多。

如果您可以将上述想法的细节或诸如自动虚拟内存,动态扩展堆大小之类的替代方法的细节介绍给我,那将是很棒的。

二、详解

最终,无论您在什么平台上运行,都始终有一个有限的最大堆可以使用。在Windows 32位环境中2GB(不是专门针对堆,而是每个进程的内存总量)。碰巧的是Java选择减小默认值(大概是为了使程序员无法创建具有失控内存分配的程序,而不会遇到此问题并且必须仔细检查它们在做什么)。

因此,考虑到这种情况,您可以采用多种方法来确定所需的内存量或减少正在使用的内存量。Java或C#等垃圾收集语言的一个常见错误是,保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象只要对象引用了它们,它们将继续使用堆空间,因为垃圾收集器不会删除它们。

在这种情况下,您可以使用Java内存探查器来确定程序中哪些方法正在分配大量对象,然后确定是否有办法确保不再引用它们,或者首先不分配它们。我过去使用的一个选项是“ JMP” http://www.khelekore.org/jmp/。

如果确定出于某种原因分配这些对象,并且需要保留引用(取决于实际情况),则只需在启动程序时增加最大堆大小。但是,一旦执行了内存分析并了解了如何分配对象,就应该对所需的内存有一个更好的了解。

通常,如果您不能保证程序将在一定数量的内存中运行(可能取决于输入大小),则总是会遇到此问题。仅在耗尽所有这些之后,您才需要研究将对象缓存到磁盘等中。在这一点上,您应该有一个很好的理由说“我需要Xgb的内存”,并且您无法通过改进来解决它您的算法或内存分配模式。通常,只有在大型数据集(例如数据库或某些科学分析程序)上运行的算法才会出现这种情况,然后诸如缓存和内存映射IO之类的技术就变得有用。

如若转载,请注明出处:https://www.javaidea.cn/article/8241.html

(0)
上一篇 2022年2月7日 上午10:03
下一篇 2022年2月7日 上午10:03

相关推荐

发表评论

您的电子邮箱地址不会被公开。