首先要明确的是used < committed < max,单位是bytes;
其次,各个值的说明如下:
- init:JVM启动时从操作系统申请的初始内存,也即JVM参数中-Xms设置的值
- used: 实际使用的内存,包括未被垃圾回收期回收的不可达对象占用的内存,它可以比初始(init)内存小
- committed:操作系统层面为当前JVM进程保留的内存
- 可能等于或大于used内存;JVM可以从操作系统申请很多内存,但是不一定真正使用它,但是操作系统可以为java进程保留相关内存
- 可能小于init内存,因为JVM可以回收内存并将其归还给操作系统
- 如果JVM需要更多内存,它将尝试从操作系统申请,此时commited会变大
- 如果创建一个新对象,并且此时used < committed,这时JVM不需要直接从操作系统申请内存,而是直接使用已经申请好的committed内存,确保新对象能创建成功
- 如果创建一个新对象,并且总内存使用量已经操作committed值,JVM在创建对象前需要向操作系统申请额外的内存,并且不保证能申请成功,可能出现OOM
- max:JVM能从操作系统申请的最大内存
- 该值一般通过JVM参数-Xmx设置
- 操作系统可能不会为JVM申请这么多的内存,因为操作系统还要为其他进程保留一定的内存,此时可能会导致OOM