JVM堆内存
jvm堆内存主要分为新生代和老年代,当垃圾收集器触发GC的时候会对堆内存长时间没用的对象分代进行回收,新生代和老年代内存占比为1:2。
新生代
新生代主要分为Eden区,s1,s0三个区域,分别内存占比8:1:1。
1.Eden区
当新创建一个对象,这个对象首先会到Eden区,如果Eden区放满了,会产生一次young GC 这次GC会把Eden区没有用到的对象回收掉,并把可用对象复制到Survival 区,并记录这些对象一次GC年龄。
2.s0,s1
当Eden区内存满了后,GC收集器会触发复制算法,将Eden区的存活对象复制到s0或者s1,s0和s1始终保持有一个空的区域,当s1或s0其中一个满了,也会触发一次GC并把可用对象赋值到另一个空区域,当GC到一定次数后依然存活的对象会进入老年代。
老年代
当经过多次GC的对象年龄达到一个阈值而没有被回收或者比较大的对象,会直接进入老年代,当老年代内存满了,会触发full GC这个时候会清理整个堆内存未被使用的对象,GC时老年代采用的是标记整理算法。
Xmx和Xms
Xms 用来指定初始堆内存,默认占系统内存1/64,java应用启动后jvm会向操作系统申请内存,在申请的内存到达Xms之前,所有申请的内存不用了会还给操作系统,当申请的内存达到Xms,那么Xms之前的内存只会清空不会还给操作系统,而申请超过初始内存小于最大内存这些内存也会归还给操作系统,如果程序启动默认就会申请很多内存,建议把Xmx和Xms设置成一样。
Xmx 用来指定最大堆大小,默认占系统内存1/4,当申请的内存超过最大堆内存就会造成堆OutOfMemoryError,导致程序直接挂掉。