当前位置: 首页 > 知识库问答 >
问题:

如何处理“java.lang.OutOfMemoryError:java堆空间”错误?

狄子真
2023-03-14

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

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

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

我可以重写一些代码,以便经常将对象持久化到文件系统(使用数据库也是一样),从而释放内存。这可能行得通,但可能也有很多工作要做。

如果你能告诉我以上想法的细节,或者自动虚拟内存、动态扩展堆大小之类的替代方案,那就太好了。

共有3个答案

杨飞飙
2023-03-14

您可以指定每个项目需要多少堆空间

以下是日蚀太阳神/朱诺/开普勒:

鼠标右键单击

 Run As - Run Configuration - Arguments - Vm Arguments, 

然后加上这个

-Xmx2048m
曾景龙
2023-03-14

使用命令行选项-Xmx运行Java,该选项设置堆的最大大小。

详见此处。

益富
2023-03-14

不管你在什么平台上运行,最终你总是有一个有限的堆最大值来使用。在视窗32位中,这大约是<代码>2GB(不是特别的堆,而是每个进程的内存总量)。只是碰巧Java选择把默认值变小(大概是为了让程序员在不遇到这个问题并且必须检查他们到底在做什么的情况下,无法创建具有失控内存分配的程序)。

因此,有几种方法可以决定你需要多少内存,或者减少你正在使用的内存。Java或C等垃圾收集语言的一个常见错误是保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象有对它们的引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们。

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

如果您确定分配这些对象是有原因的,并且需要保留引用(取决于您正在执行的操作),那么启动程序时只需要增加最大堆大小。然而,一旦你做了内存分析并了解了你的对象是如何被分配的,你应该对你需要多少内存有更好的了解。

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

 类似资料:
  • 问题内容: 如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误? 问题答案: 最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。 因此,考虑

  • 在我们的项目中,我们使用两个队列,一个用于正常处理,另一个用于错误。“Error”队列有时会被“Error”消息填满,这些消息一直放在那里,直到人类检查出来。在某些情况下,“错误”队列会用大量消息填满,然后JVM会用完堆。 例如,目前最大4GB堆配置的JVM会随机出现OOM异常。我们使用了MemoryAnalyzer和IBM堆Analyzer,两者都有点指向Artemis。当我检查文件系统上日记的

  • 在Ubuntu中,当我运行hadoop示例时: 在日志中,我得到的错误为: 信息映射。JobClient:任务Id:尝试\u 201303251213\u 0012\u m\u000000 \u 2,状态:失败错误:Java堆空间13/03/25 15:03:43信息映射。JobClient:任务Id:trunt\u 201303251213\u 0012\u m\00000 1\u 2,状态:F

  • 我在向服务器调用API时出错。以下是日志: 附截图:Java内存使用率系统CPU使用率 我还需要知道这句话的意思: HikariPool-1-检测到线程饥饿或时钟跳跃(管家delta=50s527ms107µs731ns)。 有人能帮我解释一下这个错误吗?

  • XPath如何处理XML命名空间? 如果我使用 为了解析下面的XML文档,我得到了0个节点。 但是,我没有在XPath中指定名称空间(即不是路径的每个标记的前缀)。如果我没有明确告诉XPath,它怎么知道我想要哪个?我认为在这种情况下(因为只有一个名称空间),XPath可以完全忽略。但如果有多个名称空间,事情可能会变得糟糕。

  • 我正在尝试使用scala执行小计算。Im使用datastax-4.6。我有6个节点,每个16gb RAM和8核。当我尝试执行scala程序时,它会显示以下错误。 错误ActorSystemImpl:线程[sparkDriver-akka.actor.default-dispatcher-17]关闭ActorSystem[sparkDriver]java时出现未捕获的致命错误。lang.OutOfM