Java进程占用越来越多的内存

Gee*_*eek 0 java linux memory-leaks memory-management process

所有,

我有一个Java内存进程,随着时间的推移开始占用越来越多的内存.为了在堆空间使用上设置一个Cap,我将-Xmx选项设置为512M.在一段时间内,进程内存使用率慢慢达到2GB.

我使用MAT和YOURKIT等各种工具分析了可能的内存泄漏代码,发现Java代码中没有这样的泄漏.该代码还使用了一个看起来无泄漏的Native Native功能.

我有以下问题:

  1. 是否有可能导致Java Process可以使用的总内存上限?
  2. 除了堆之外,JVM的其他内存使用是什么?
  3. Linux是否适用于Windows的"工作集"内存模型,其中进入后台的进程会释放它的内存.
  4. 即使在使用512M的-Xmx选项后,如果堆使用量增加,JVM也不会抛出"Out of memory".这让我怀疑除了Heap空间以外的其他东西泄漏了内存.从内存转储看来,堆内存似乎没有增加.

谢谢你的回答.

use*_*011 5

你是如何测量内存使用量的?

通常有3种内存使用方式:

  • VIRT - 虚拟内存大小(KiB)任务使用的虚拟内存总量.它包括所有代码,数据和共享库以及已换出的页面和已映射但未使用的页面.
  • RES - 驻留内存大小(KiB)任务使用的非交换物理内存.
  • SHR - 共享内存大小(KiB)它只反映可能与其他进程共享的内存.

虚拟内存大小可能会比您使用-Xmx指定的更大(几GB),但这不会造成任何伤害.RES加SHR是你应该看的.

除了堆之外,还有另一类不受-Xmx(permgen)影响的内存使用.但通常上限为几MB.您可能需要阅读HotSpot GC调整指南.