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

本文详细解析了JVM内存模型中的RSS、usedHeap、Committed等概念,阐述了它们与进程内存占用的关系,以及JDK1.8中ParallelGC收集器的特点。通过对比虚拟内存与实际进程占用内存,解释了为何JVM提交的内存可能大于实际进程占用的原因。

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之后进程内存占用不会降低。

 

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

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

转载于:https://www.cnblogs.com/ynx01/p/10876460.html

### 调整JVM内存大小的最佳实践 #### 一、理解JVM内存模型主要部分 Java虚拟机(JVM)内存被划分成几个不同用途的数据区域,主要包括堆(heap)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)以及虚拟机栈(Virtual Machine Stack)[^3]。 对于调整JVM内存而言,最常涉及的是堆内存永久代/元空间。其中: - **堆**用于存储对象实例,在多线程环境中共享; - **永久代/元空间**(Metaspace),自Java8之后取代了永久代,主要用于存放类的元数据。 #### 二、基于应用需求调整JVM内存(Xmx/Xms) 当一个容器内部署单个JVM实例时,可以根据服务器资源状况设置合理的初始(-Xms)与最大(-Xmx)堆大小;而在某些特殊场景下——比如在同一容器里启动多个JVM进程或是混合使用多种编程语言开发的应用,则需依据具体的业务逻辑合理规划各个JVM之间的`Xmx`(最大堆容量)分配比例[^1]。 为了达到最优性能表现,建议遵循如下原则: - 初始堆大小应尽可能接近预期的最大值,减少动态扩展带来的开销。 - 设置适当的最大堆尺寸以防止频繁触发GC事件影响响应时间。 ```bash java -Xms512m -Xmx4g MyApplication ``` 上述命令表示启动名为MyApplication的应用程序,并为其指定最小512MB、最高可达4GB的堆空间。 #### 三、配置永久代/元空间(MetaspaceSize/MaxMetaspaceSize) 针对永久代或元空间,同样存在类似的参数用来控制其占用量。特别是从Java7升级至更高版本后,默认情况下不再支持直接设定PermGen而是转而采用更灵活高效的Metaspace替代方案。因此,可以通过下面的方式来进行相应调节: ```bash java -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m MyApp ``` 这里设置了初次加载所需的最小元空间为96兆字节(`MetaspaceSize`),并设定了上限不超过256兆字节(`MaxMetaspaceSize`)。 值得注意的是,如果应用程序中涉及到大量第三方库或者反射操作较多的情况,可能需要增加此数值来避免因缺少足够的元数据存储而导致OOM错误的发生。 通过以上方式可以有效地根据实际应用场景的需求对JVM的各项重要参数做出恰当的选择,从而保障系统的稳定性高效运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值