Java和PHP应用程序的GC和内存行为?

问题描述 投票:0回答:1

此问题与请求需要的内存比分配给Pod的内存更多时的垃圾回收行为有关。如果GC无法释放内存,它将继续连续运行GC还是将其丢弃的记忆。

[一个pod包含基于Java的应用程序,另一个包含基于PHP的应用程序。如果是Java,则xmx的值与为pod限制指定的值相同。

java php garbage-collection
1个回答
1
投票

我只能谈论Java GC。

如果GC无法释放内存,它将在有规律的间隔后继续连续运行GC或将其耗尽。

取决于JVM选项。

JVM从堆的初始大小开始,并将根据需要扩展。但是,它只会将堆扩展到固定的最大大小。当JVM从选项(-xmx)或默认堆大小规则启动时,将确定最大大小。启动后无法更改。

随着使用的堆空间接近极限,GC可能会越来越频繁地出现。现代JVM上的默认行为是监视执行垃圾收集所花费的%时间。如果它超过了(可配置的)阈值,那么您将获得一个OOME并带有一条有关已超出GC开销阈值的消息。即使有足够的空间可以“爬行”更长的时间,也会发生这种情况。

您可以关闭“ GC开销限制”之类的东西,但这是不可取的。

如果JVM的堆空间不足,[[after会进行完整的垃圾回收,那么JVM也会抛出一个OOME。

最后,如果JVM试图增加堆,并且OS拒绝为其提供请求的内存,它将抛出OOME。这可能是因为:

    操作系统已用完RAM
  • 操作系统已用完交换空间
  • 该进程已超过ulimit,或
  • 进程组(容器)已超出容器限制。
  • JVM仅略微意识到其环境中的可用内存。在裸机OS或虚拟机管理程序下的VM上,默认堆大小取决于RAM的数量。在裸机OS上,这是物理RAM。在VM上,它将是……来宾OS视为其物理内存的任何东西。

    使用Kubernetes,应用程序可用的内存可能会受到cgroup或类似对象的进一步限制。我了解最近的Java版本进行了一些调整,使其更适合在容器中运行。我认为这意味着他们可以在计算默认堆大小时使用cgroup内存限制,而不是物理内存大小。

  • © www.soinside.com 2019 - 2024. All rights reserved.