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

man*_*hnt 9 java memory monitoring profiling jvm

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

Cra*_*lus 11

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

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

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

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

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

  • 该死的,我想写下这个......好吧,类似的东西:D. (2认同)