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

Java和PHP应用程序的GC和内存行为?,java,php,garbage-collection,Java,Php,Garbage Collection,这个问题是关于当请求需要的内存超过分配给Pod的内存时的垃圾收集行为。如果GC不能释放内存,它将继续连续运行GC还是抛出 记忆 一个pod包含基于java的应用程序,另一个包含基于PHP的应用程序。在java的情况下,xmx值与给定的pod limit相同。我只能谈论java GC。(PHP的GC行为将有所不同。) 如果GC不能释放内存,它会在定期间隔后继续运行GC,还是会抛出内存 这取决于JVM选项 JVM从堆的初始大小开始,并根据需要进行扩展。但是,它只会将堆扩展到固定的最大大小。当JVM从

这个问题是关于当请求需要的内存超过分配给Pod的内存时的垃圾收集行为。如果GC不能释放内存,它将继续连续运行GC还是抛出 记忆


一个pod包含基于java的应用程序,另一个包含基于PHP的应用程序。在java的情况下,xmx值与给定的pod limit相同。

我只能谈论java GC。(PHP的GC行为将有所不同。)

如果GC不能释放内存,它会在定期间隔后继续运行GC,还是会抛出内存

这取决于JVM选项

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

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

您可以关闭GC开销限制,但这是不可取的

如果JVM在完成完整的垃圾收集后没有足够的堆空间,它也会抛出OOME

最后,如果JVM试图增加堆,而操作系统拒绝为其提供所需的内存,它将抛出OOME。这可能是因为:

  • 操作系统内存不足
  • 操作系统已用完交换空间
  • 进程已超过
    ulimit
    ,或
  • 进程组(容器)已超过容器限制
JVM对其环境中可用的内存只有少量的了解。在裸机操作系统或虚拟机监控程序下的VM上,默认堆大小取决于RAM的数量。在裸机操作系统上,这就是物理RAM。在虚拟机上,它将是。。。来宾操作系统所看到的物理内存


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

您在这里问了很多问题。你应该限制自己只有一个。@StephenC当然。我已将其修改为两个相关的问题2!=一个。将kubernetes重启问题作为一个单独的问题提问。另外,Java和PHP垃圾收集是不同的。不要破坏您的问题。如果您(再次)改变了主意,只想问PHP,请问一个新问题。改变你的问题,使现有的答案脱离主题,对于已经花时间回答的人来说是粗鲁的。我已经收回了你的问题。请不要再这样做。
如果JVM在完成完整的垃圾收集后没有足够的堆空间,JVM也会抛出OOME
这里有一个问题。假设xmx定义了2GB内存,其中使用了1990 MB。第一个请求来了,它要求20 MB的内存,GC无法释放,它将通过内存不足异常。java进程是否会停止接受新的后续请求?所以接下来的第二个请求来了,它只需要5MB内存,它能满足请求吗?