当java GC在64位系统上调用时,如果没有指定最大堆大小



我使用64位系统和64gb RAM来处理大数据。在处理数据时,我没有提供任何堆最大大小参数。我的程序不断消耗内存,它没有调用java GC。处理数据只需要2GB内存。有人能详细说明JVM何时调用GC吗?或者是否有必要提供堆最大大小参数?

我使用64bit系统和64gb RAM来处理大数据。在处理数据时,我没有提供任何堆最大大小参数。

64位JVM的默认堆大小是主内存的1/4,在您的情况下是16 GB。

我的程序不断消耗内存,它没有调用java GC。

如果GC没有运行,我将非常惊讶,如果你没有调优它,不管最大的大小。

处理数据只需要2GB内存。

你应该有较小的GC收集,除非你只使用大数组和非常小的对象。也就是说,你的伊甸园空间永远不会被填满。

有谁能给出JVM调用GC的细节吗?

当达到当前伊甸园大小时,它执行一个小的GC。如果GC认为需要更多的内存,并且还没有达到最大值,它将增加堆可用空间。

或者是否有必要提供堆最大大小参数?

仅当您希望它使用更少的内存(但这可能会更慢)

如果您想限制JVM使用的内存量,必须提供一个max heapsize选项。如果不这样做,JVM将使用默认堆大小,可能是可用RAM的一半(取决于JVM类型和版本)。

有谁能给出JVM调用GC的细节吗?

当JVM认为有必要时调用它。通常,这是因为Eden空间(创建大多数新对象的地方)太满了。如果您尝试分配一个对于Eden空间来说太大的对象,并且需要分配对象的年老空间太满,也可能发生这种情况。实际的决策取决于JVM使用的GC类型。(而且它是不透明的;即未在任何已发表的文件中指定/记录。而且可能与你实际试图解决的问题无关。

GC没有将最小化内存使用作为优化性能的主要目标。相反,它将尝试优化最小GC暂停时间,或优化最大吞吐量。

所以,当GC运行时,JVM不愿意减少堆的大小。这是因为如果堆大小明显大于应用程序可访问对象的工作集,GC往往会更有效地运行。

相关内容