为什么jvm 提交的内存比实际进程占用的内存更大

时间:2022-05-24 12:12:47

RSS:常驻内存集,为进程分配的内存大小,包括共享库的内存,不包括进入交换分区的内存,这里RSS就是实际进程占用的内存。

used Heap: jvm中活动对象占用的内存,当used 接近committed的时候,heap就会grow up,-Xmx设置了Commit上限。

Commited: 表示可供java虚拟机使用的内存量,提交的内存可能会随时间的推移而变化(增加或者减少)。JVM可能会向OS释放内存,同时已提交的内存可能小于Init,已提交的内存将始终大于或等于Used Heap(ORACLE 官方文档中可以看到)。init是启动时后JVM向OS申请的内存,max是能够使用的最大边界值。注意这里说的都是虚拟内存,所以理论上整个操作系统commited的内存为物理内存加上交换空间的大小,换句话说如果commited超过物理内存的话,多余的部分就会被换出到磁盘。这也就是为什么jvm提交的内存可能会比实际进程占用的内存更大的原因。

JDK 1.8中默认的GC收集器为Parallel GC,这个GC收集器在GC之后不会将内存返还给OS,所以GC之后进程内存占用不会降低。

 为什么jvm 提交的内存比实际进程占用的内存更大

图片复制自:http://www.importnew.com/14486.html

未使用区:对于普通进程来说,这个区域被可用于堆和栈空间的申请及释放,每次堆内存分配都会使用这个区域,因此大小变动频繁;对于JVM进程来说,调整堆大小及线程栈时会使用该区域,而堆大小一般较少调整,因此大小相对稳定。操作系统会动态调整这个区域的大小,并且这个区域通常并没有被分配实际的物理内存,只是允许进程在这个区域申请堆或栈空间,在真正使用的时候就会与磁盘交换变为物理内存占用。