我的桌面应用程序中出现了一些例外,这些例外情况是使用launch4j包装的,涉及内存的运行。具体来说:
OutOfMemoryError: Java heap space
由于我不知道这些计算机中有多少RAM,什么是最小化此类错误的合适策略?
通过像-Xmx
这样的巨大-Xmx64g
有危险吗?我了解我的应用程序可能会用完实际的物理RAM,但这是用户可以通过添加更多RAM来改善的问题,而最大堆空间有限,他们无能为力。
但是,这让我想到,为什么-Xmx本质上不是无限的,如果要使用的内存超出可用空间,则让操作系统和用户杀死应用程序。
答案 0 :(得分:1)
-Xmx
是重要的内存调整参数。通常,堆空间越多越好,但这是一个非常实际的设置,因此,由用户来决定多少是合适的。显然,尝试使用大于系统内存的堆会出现问题,因为这会导致交换。如果未指定,默认情况下,JVM将使用最多系统内存的1/4。
Java将继续声明最大内存,因此您需要告诉它停止在哪里。如果没有上限,堆只会越来越大。在堆变满之前,JVM不会从内存中清除不需要的对象,因此“无限制的大小”将意味着堆永远不会变满,并且永远保持增长,并且永远不会释放不需要的内存。
虽然通常堆越大越好,但这不是硬性规定,需要进行测试和调整以找到最佳数量。这将有助于提高吞吐量,但会影响延迟,因为堆越大,由于要清除的内存越多,GC暂停时间也就越长。
另一个因素是,如果您有超过32GB的堆,则需要至少提供40-42GB。中间的某些东西(例如36GB)实际上会损害性能并减少可用内存。这是因为对于小型堆,JVM能够优化对象指针,但是对于大于32GB的堆,它无法做到这一点。
请注意,仅添加更多堆并不一定是内存不足错误的解决方案。对程序进行改进以使用更少的内存是可行的,如果是这样,通常这是首选的解决方案。尤其是如果您的程序以某种方式泄漏内存,更多的堆只会使它花更长的时间才能耗尽内存。