繁体   English   中英

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

[英]When java GC call on 64 bit system if max heap size not specified

我正在使用带有 64GB RAM 的 64 位系统来处理大数据。 在处理数据时,我没有提供任何堆最大大小参数。 我的程序不断消耗内存,它没有调用 java GC。 处理数据只需要 2GB 内存。 任何人都可以在 JVM 调用 GC 时提供详细信息吗? 还是必须提供堆最大大小参数?

我正在使用带有 64GB RAM 的 64 位系统来处理大数据。 在处理数据时,我没有提供任何堆最大大小参数。

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

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

如果 GC 没有运行,如果您根本不调整它而不管最大大小,我会感到非常惊讶。

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

你应该有次要的 GC 收集,除非你只使用大数组和很少的小对象。 即您的伊甸园空间永远不会填满。

任何人都可以在 JVM 调用 GC 时提供详细信息吗?

当达到当前 eden 大小时,它会执行次要 GC。 如果 GC 决定需要更多内存并且尚未达到最大值,它将增加可用堆。

还是必须提供堆最大大小参数?

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

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

任何人都可以在 JVM 调用 GC 时提供详细信息吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM