关于 java 中的可用内存问题
最近看了《why 技术》的一篇文章《这个队列的思路是真的好,现在它是我简历上的亮点了。》。本来没什么问题,觉得这么好的东西不拿来用一用太可惜了。于是我就搞到了项目中,但是却发现一个问题,文中提到的:
1 | MemoryUsage heapMemoryUsage = MX_BEAN.getHeapMemoryUsage(); |
我发现availableMemory在一段时间内没什么变化。
我是这么测试的:
1 | public static void main(String[] args) throws InterruptedException { |
讲道理应该实时变化才对,后来我点进去了why哥留下的PR链接,发现这个PR在2022-06-06有一个提交:
备注信息为:”fix bug”,具体的修改为:
可以看到原来通过MemoryUsage获取可用内存变成了:
1 | Runtime.getRuntime().freeMemory() |
也就是说之前使用的getCommited()
获取的并不是可用内存,于是我看了下MemoryUsage
的源码(jdk8),哈哈哈😂,发现图示的很清楚:
真正的可用空间是committed - used
,于是我又做了下面的测试:
1 | public static void main(String[] args) throws InterruptedException { |
可以看到确实如此。
20220615更新
why哥给我回复了,这个问题大佬也讨论过https://github.com/apache/dubbo/pull/10021#issuecomment-1147464751
其中一个大佬说的可用内存应该是:
1 | MemoryUsage#getMax() - MemoryUsage#getUsed() |
然后我在 github 上回复了一下大佬,大佬给我的答复是: