java - 在桌面应用程序中处理 Java 最大内存的适当策略是什么?

标签 java launch4j

我从使用 launch4j 封装的桌面应用程序中得到一些关于内存运行的异常。具体来说:

OutOfMemoryError: Java heap space

由于我不知道这些计算机中有多少 RAM,因此最大限度地减少此类错误的适当策略是什么?

传递巨大的-Xmx(例如-Xmx64g)是否有任何危险?我知道我的应用程序可能会耗尽实际的物理 RAM,但用户可以通过添加更多 RAM 来改善这个问题,而最大堆有限则他们无能为力。

但这让我思考,为什么 -Xmx 本质上不是无限的,并让操作系统和用户在应用程序试图使用超出可用内存的情况下杀死应用程序。

最佳答案

-Xmx 是一个重要的内存调整参数。一般来说,堆空间越大越好,但这是一个非常具体的设置,因此由用户决定多少合适。显然,尝试使用比系统内存更大的堆会出现问题,因为您会遇到交换。如果未指定,JVM 默认将使用最多 1/4 的系统 RAM。

Java 将不断占用内存直至达到最大值,因此您需要告诉它在哪里停止。如果没有上限,堆就会越来越大。在堆满之前,JVM 不会从内存中清除不需要的对象,因此“无限大小”意味着堆永远不会满,并且会永远不断增长,并且不需要的内存永远不会被释放。

虽然堆通常越大越好,但这并不是一个硬性规则,需要进行测试和调整才能找到最佳数量。它会提高吞吐量,但会损害延迟,因为堆越大,GC 暂停时间就越长,因为有更多内存需要清除。

另一个因素是,如果您有超过 32GB 的堆,则需要至少提供 40-42GB。像 36GB 这样的中间值实际上会损害性能并提供更少的可用内存。这是因为对于小型堆,JVM 能够优化对象指针,但对于大于 32GB 的堆则无法做到这一点。

请注意,仅添加更多堆并不一定能解决内存不足错误。同样可能的是,对程序进行改进以使用更少的内存是可行的,如果是的话,这通常是首选解决方案。特别是如果您的程序以某种方式泄漏内存,更多的堆只会使您在内存耗尽之前花费更长的时间。

关于java - 在桌面应用程序中处理 Java 最大内存的适当策略是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989636/

相关文章:

java - 非法状态异常,应用程序找不到类中定义的方法

java - 无法运行自解压安装程序-无法访问jarfile C :\Users\Ray\AppData\Local\Temp\RarSFX0\install. jar

java - 尝试使用 Alakai 插件将 Launch4j 集成到 Maven 项目中

java - Launch4j 中的异常

java - 无法运行我的 java .exe 程序。我该如何解决这个问题? ("A Java exception has occured")和JNI问题

java - 使用 commons-email 生成的附件+Html 在某些电子邮件客户端中不显示

java - AspectJ 建议未通过单元测试执行

java.lang.ClassCastException : [Ljava. lang.Object;无法转换为 com.xl.entity.Users

java - 在 apache log4j 中编码模式布局

java - 无法创建数据库设置的文本文件