JVM-堆

堆

堆内存溢出 OutOfMemoryError: Java heap space

堆空间有三个需要关注的值:used total max

1、used

used:指当前已使用的堆内存

2、total

total:指虚拟机已经分配的可用堆内存

3、max

max:指虚拟机可以分配的最大堆内存

问题:是不是used=max=total时候内存溢出?

不是,堆内存溢出判断条件比较复杂,在下一章 垃圾回收 详细介绍


如果不设置任何的虚拟机参数,max默认是系统内存的1/4,total默认是系统内存的1/64。
在实际应用中一般都需要设置total和max的值。

要修改堆的大小,可以使用虚拟机参数-Xmx(max最大值)和-Xms(初始的total)。
语法:-Xmx值 -Xms值
单位:字节(默认,必须是1024的倍数)、k或者K(KB)、m或者M(MB)、g或者G(GB)
限制:Xmx必须大于2MB,Xms必须大于1MB

问题:为什么arthas中显示的heap堆大小与设置的值不一样呢?

arthas中的heap堆内存使用了JMX技术中内存获取方式,这种方式与垃圾回
收器有关,计算的是可以分配对象的内存,而不是整个内存。


Java服务端程序开发时,建议将-Xmx和-Xms设置为相同的值,这样在程序启动之后可使用的总内存就是最大内存,
而无需向java虚拟机再次申请,减少了申请并分配内存时间上的开销,同时也不会出现内存过剩之后堆收缩的情况。