我有一台 Linux 机器,正在其中运行 Java 应用程序。 我正在使用这些参数运行 jvm:-Xmx27231m -Xms27231m
但是当我查看 htop/top 时。 我对整个系统和具体流程的观察是,jvm 实际上没有保留我要求的 27GB 堆。 我看到的是 虚拟:32.8G 分辨率:15.3G SHR:16536
在我的所有其他 prod/qa/dev 机器中,RES 反射(reflect)了我要求 JVM 为我保留的堆大小的确切数量(可能多一点)。 然而,对于一台特定的机器来说,情况并非如此。 我不明白为什么会发生这种情况。
我将 Java Mission Control 附加到该进程,我看到 InitialHeapSize 和 MaxHeapSize 实际上具有正确的值,但类型不是 CommandLine,而是 Ergonomic。我实在不知道这意味着什么。
有人吗? 谢谢
最佳答案
JVM 不会提前预修改页面,以减少启动时间。不过,您可以使用此选项强制执行此操作。
-XX:+AlwaysPreTouch -Xmx27g -Xms27g
顺便说一句,这不会阻止 JVM 将不使用的内存释放回操作系统(尽管 JVM 很少这样做,据我所知),也不会将堆锁定到主内存中以防止交换。
However for one particular machine this is not the case.
很可能它没有正确的 Activity 导致内存被延迟使用。
关于java - JVM maxHeapSize 和 InitialHeapSize 未反射(reflect)在 htop 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47705422/