为何多次调用Runtime.maxMemory()返回值会发生变化?
为何Runtime.maxMemory()的返回值会随时间变化?
我在调试代码中的OutOfMemoryError问题时,编写了一个打印内存统计信息(包括最大内存)的方法。多次调用该方法时,MAX内存的返回值却并不相同。
我在启动命令中设置了内存参数:... -Xmx=$SOME_VAR -Xms=$SOME_VAR
按此设置,Runtime.totalMemory()的输出应与Runtime.maxMemory()完全一致,但实际Runtime.maxMemory()的输出持续变化——多数情况下差异约0.5GB,有时与初始值的差异甚至接近3GB。
硬件并未增减内存,补充信息:系统内存32GB,$SOME_VAR取值约25GB,启动Java前系统空闲内存约29GB。运行以下代码可能打印出不同值:
for (int i = 0; i < 10; i++) { Thread.sleep(10_000); System.out.println(Runtime.getRuntime().maxMemory()); }
有时得到23.5GB,有时是24GB等。
环境信息
- Java版本:OpenJDK 1.8 392
- 操作系统:AWS RHEL Linux OS
- 硬件:AWS EC2 r5.xlarge实例
- 内存:32GB
- -Xmx:25GB(正测试不同取值)
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

