JVM内存:为什么任务管理器上的内存与JProbe(或JConsole工具)不同

我遇到的问题是我的应用程序使用的内存只有100MB,之后它减少了50MB,但是在Window Task Manager上显示150MB并且始终保持或增加但不减少,我们如何减少任务管理器上的内存(私有工作集)?

你在JConsole (或其他监视工具)中看到的是java内存使用的模式。

JVM的内存通常分为这些区域(您还可以在监视工具中看到)。

  1. 用于Java对象的堆内存
  2. 非堆内存,这是java存储加载的类和元数据以及JVM代码的地方
  3. 本机内存,它是为dll和Java本机代码(非常低级别)保留的内存的一部分。 有时你可以在这个区域获得一个OOM,同时你有足够的堆内存(因为当你增加Max Heap大小时,它会减少可用的本机内存)。

Windows任务管理器没有显示。 它显示了应用程序使用的整个内存(堆+非堆+本机部分)。

还要注意,通常是从OS请求更多内存的进程,即使实际应用程序“释放”内存,它也会保留这些内存。 这些内存页面已映射为进程的地址空间的一部分。 因此,在您的任务管理器中,您不会看到内存减少的模式,但这并不表示您的应用程序存在内存泄漏。
因此,您无法减少从任务管理器看到的内存,但是您从监视工具看到的内存应该在某个时候减少,否则可能表示内存泄漏