这里的真实上下文是 elasticsearch,但我很好奇更普遍的情况(minecraft / jetty / 等)。当操作系统进程的系统内存不足时,您可以通过检查交换来查看此行为。如果一个框没有交换,那么它就不需要更多内存(我相信这几乎总是正确的)。
如果 JVM 的值太低,操作系统会看到什么-Xmx
?JVM 会花时间管理内部页面吗?这会被视为 CPU 等待/加载吗?或者唯一可以确定的方法是使用 Java 感知工具进入 JVM 并进行更精确的观察?
答案1
由于 Java 是 JVM,因此它负责内部内存操作。操作系统为 Java 分配一个 -Xmx 内存块,仅此而已。jstat 之类的工具可以查看 JVM 内部并告诉您在 GC 开销上花费了多少时间,NewRelic 之类的 Java 代理也可以做到这一点。
您还可以设置 -verbose:gc 来让 JVM 记录 GC 行为。
如果缺少任何这些工具,Java 进程中内存不足的问题通常表现为使用大量 CPU 的进程——JVM 不断地进行垃圾收集,这会占用大量 CPU 资源。