Java 和 PHP 应用程序的 GC 和内存行为?
GC and memory behaviour for Java and PHP app?
这个问题是关于当请求需要比分配给 Pod 的内存更多的内存时垃圾收集行为。如果GC无法释放内存,是继续运行GC还是throw out
的记忆。
一个 pod 包含基于 java 的应用程序,另一个包含基于 PHP 的应用程序。在 java 的情况下,xmx 值与给定的 pod 限制相同。
我只能说说JavaGC。 (PHP 的 GC 行为会有所不同。)
If GC is not able to free memory, will it continue to run GC continuously after regular interval or throw out of memory.
这取决于 JVM 选项。
JVM 以堆的初始大小开始,并会根据需要扩展它。但是,它只会将堆扩展到固定的最大大小。当 JVM 从选项 (-Xmx
) 或默认堆大小规则启动时,确定最大大小。启动后无法更改。
随着使用的堆space接近极限,GC可能会越来越频繁。现代 JVM 的默认行为是监视垃圾收集所花费的时间百分比。如果它超过了(可配置的)阈值,那么您将收到一个 OOME,其中包含有关已超过 GC 开销阈值的消息。即使 space 到 "limp along" 的时间足够长一点,也会发生这种情况。
您可以关闭 GC Overhead Limit 东西,但这是不可取的。
如果 JVM 没有足够的堆 space 进行完全垃圾收集后,它也会抛出 OOME。
最后,如果 JVM 试图增大堆并且 OS 拒绝提供它请求的内存,它会抛出 OOME。这可能是因为:
- OS 运行 内存不足
- OS 运行 交换 space
- 进程已超过
ulimit
,或
- 进程组(容器)已超出容器限制。
JVM 仅略微了解其环境中的可用内存。在裸机 OS 或管理程序下的 VM 上,默认堆大小取决于 RAM 的数量。在裸机 OS 上,这是物理 RAM。在 VM 上,它将是...来宾 OS 所看到的物理内存。
对于 Kubernetes,应用程序可用的内存可能会受到 cgroups 或类似工具的进一步限制。我知道最近的 Java 版本进行了调整,使它们更适合 运行 在容器中安装。我认为这意味着他们可以在计算默认堆大小时使用 cgroup 内存限制而不是物理内存大小。
这个问题是关于当请求需要比分配给 Pod 的内存更多的内存时垃圾收集行为。如果GC无法释放内存,是继续运行GC还是throw out 的记忆。
一个 pod 包含基于 java 的应用程序,另一个包含基于 PHP 的应用程序。在 java 的情况下,xmx 值与给定的 pod 限制相同。
我只能说说JavaGC。 (PHP 的 GC 行为会有所不同。)
If GC is not able to free memory, will it continue to run GC continuously after regular interval or throw out of memory.
这取决于 JVM 选项。
JVM 以堆的初始大小开始,并会根据需要扩展它。但是,它只会将堆扩展到固定的最大大小。当 JVM 从选项 (-Xmx
) 或默认堆大小规则启动时,确定最大大小。启动后无法更改。
随着使用的堆space接近极限,GC可能会越来越频繁。现代 JVM 的默认行为是监视垃圾收集所花费的时间百分比。如果它超过了(可配置的)阈值,那么您将收到一个 OOME,其中包含有关已超过 GC 开销阈值的消息。即使 space 到 "limp along" 的时间足够长一点,也会发生这种情况。
您可以关闭 GC Overhead Limit 东西,但这是不可取的。
如果 JVM 没有足够的堆 space 进行完全垃圾收集后,它也会抛出 OOME。
最后,如果 JVM 试图增大堆并且 OS 拒绝提供它请求的内存,它会抛出 OOME。这可能是因为:
- OS 运行 内存不足
- OS 运行 交换 space
- 进程已超过
ulimit
,或 - 进程组(容器)已超出容器限制。
JVM 仅略微了解其环境中的可用内存。在裸机 OS 或管理程序下的 VM 上,默认堆大小取决于 RAM 的数量。在裸机 OS 上,这是物理 RAM。在 VM 上,它将是...来宾 OS 所看到的物理内存。
对于 Kubernetes,应用程序可用的内存可能会受到 cgroups 或类似工具的进一步限制。我知道最近的 Java 版本进行了调整,使它们更适合 运行 在容器中安装。我认为这意味着他们可以在计算默认堆大小时使用 cgroup 内存限制而不是物理内存大小。