在 kubernetes 仪表板上,有一个 pod,其中内存使用情况(字节)显示为904.38Mi.
此 pod 包含使用-Xms512m -Xmx1024m, 和 kubernetes 部署文件 -> requests.memory = 512M,运行的 Java 应用程序limits.memory = 1.5G。
我已启用 gc 日志并在 pod 日志中看到这些:
[2020-04-29T15:41:32.051+0000] GC(1533) Phase 1: Mark live objects
[2020-04-29T15:41:32.133+0000] GC(1533) Phase 1: Mark live objects 81.782ms
[2020-04-29T15:41:32.133+0000] GC(1533) Phase 2: Compute new object addresses
[2020-04-29T15:41:32.145+0000] GC(1533) Phase 2: Compute new object addresses 11.235ms
[2020-04-29T15:41:32.145+0000] GC(1533) Phase 3: Adjust pointers
[2020-04-29T15:41:32.199+0000] GC(1533) Phase 3: Adjust pointers 54.559ms
[2020-04-29T15:41:32.199+0000] GC(1533) Phase 4: …Run Code Online (Sandbox Code Playgroud) java garbage-collection memory-management kubernetes kubernetes-metrics
喜欢读一些答案后,这个和JEP-346,我已经意识到,G1确实释放内存返回给操作系统。
然而,它是否将内存释放回操作系统,甚至到了当前内存使用量可能低于初始堆内存的程度(即在此 JEP 之前,在我的情况下为 JDK11)?
假设我有一个 Java 11 VM在RAM上运行Xms并Xmx设置为,但是我只消耗大约. G1 会向操作系统释放足够的内存吗?5GB8GB1GB
我没有在任何地方找到任何文件说 G1 仅限于释放Xms记住阈值。
我在生产中观察到这一点,MemAvailable 一直减少到一个点,然后在 GC 之后,它在 8GB 的盒子上跃升至接近 30-35%。所以我假设它正在释放内存,这就是 MemAvailable 跳回的原因。
另外,向操作系统释放内存到底是什么意思,它是调用 free/unmap 吗?