我使用64位系统和64gb RAM来处理大数据。 处理数据时,我没有提供任何堆最大大小参数。 我的程序不断消耗内存,而不是调用java GC。 要处理数据,只需要2GB内存。 当JVM调用GC时,任何人都可以提供详细信息吗?或者是否需要提供heap max size参数?
答案 0 :(得分:1)
我使用64位系统和64gb RAM来处理大数据。处理数据时,我没有提供任何堆最大大小参数。
64位JVM的默认堆大小是主内存的1/4或者大小写为16 GB。
我的程序不断消耗内存,而不是调用java GC。
如果GC没有运行,如果你没有调整它,无论最大尺寸如何,我都会非常惊讶。
要处理数据,只需要2GB内存。
除非您只使用大型数组和非常小的对象,否则您应该使用较小的GC集合。即你的伊甸园空间永远不会填满。
当JVM调用GC时,有人可以提供详细信息吗?
当达到当前的伊甸园大小时,它会执行次要GC。如果GC决定需要更多内存并且达到最大值,则会增加可用堆。
或者是否需要提供heap max size参数?
只有你希望它使用更少的内存(但这可能会更慢)
答案 1 :(得分:0)
如果要限制JVM使用的内存量,则必需以提供最大堆大小选项。如果不这样做,JVM将使用默认堆大小,这可能是可用RAM的一半(取决于您的JVM类型和版本)。
当JVM调用GC时,任何人都可以提供详细信息吗?
当JVM认为有必要时调用它。通常情况下,就是当Eden空间(创建大多数新对象的地方)太满时。如果你试图分配一个对于Eden空间而言太大的对象,并且需要分配对象的那里的终端空间太满,也会发生这种情况。实际决策取决于您的JVM使用的GC类型。 (它是不透明的;即未在任何已发布的文档中指定/记录。并且可能与您实际尝试解决的问题无关。)
GC没有最小化内存使用量作为优化性能的主要目标。相反,它会尝试优化最小GC暂停时间,或优化最大吞吐量。
因此,当GC运行时,JVM不愿意减小堆的大小。这是因为如果堆大小明显大于应用程序的可访问对象的工作集,则GC往往会更有效地运行。