jvm内存 大于 xmx
“嘿,你能来看看奇怪的东西吗?” 这就是我开始研究支持案例的方式,将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。
简而言之,一位工程师正在研究特定应用程序的过多内存使用情况,据他所知,该应用程序可以使用2G的堆。 但是无论出于什么原因,JVM工具本身似乎都没有决定该进程真正拥有多少内存。 例如, jconsole猜测总可用堆等于1,963M,而jvisualvm声称其等于2,048M。 那么哪个工具是正确的,为什么另一个却显示不同的信息呢?
确实确实很奇怪,尤其是看到通常的可疑对象都被淘汰了– JVM并没有采取任何明显的技巧,例如:
- -Xmx和-Xms相等,因此在运行时堆增加期间报告的数字不会更改
- 通过关闭自适应大小调整策略( -XX:-UseAdaptiveSizePolicy ),防止JVM动态调整内存池的大小
重现差异
理解问题的第一步是放大工具实现。 通过标准API访问可用的内存信息非常简单,如下所示:
System.out.println("Runtime.getRuntime().maxMemory()="+Runtime.getRuntime().maxMemory());
确实,这就是手头工具似乎正在使用的工具。 回答此类问题的第一步是拥有可