一、Java堆
Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都存放在其中,并且Java堆完全是自动化管理的,通过垃圾回收机制,垃圾对象会自动清理,不需要显示地释放。 根据垃圾回收机制不同,Java堆有可能拥有不同的结构。最为常见的就是将整个Java堆分为新生代和老年代。其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年代对象。新生代分为Eden区,s0区、s1区,s0和s1区也被称为from和to区域,他们是两块大小相等并且可以互换角色的空间。
当GC发送的时候,如果首先清理的是s0区,把不用的对象清理,把在使用的复制到s1区;如果再次清理的是s1区,同样的原理。
绝大多数情况下,对象首先是分配在Eden区,再一次新生代回收后,如果对象还存活,则会进入s0或者s1区。之后每经过一次新生代回收,如果对象存活则它的年就加1,当对象达到一定的年龄后,则进入老年代。
二、垃圾回收算法:复制算法:其核心思想就是将内存分为两快,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中去。之后去清楚之前正在使用的内存块中所有的对象,反复去交换两个内存中的角色,完成垃圾收集。
(Java中新生代的from和to空间就是使用这个算法)。 标记压缩算法:在标记清除法基础之上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清(Java中老年代使用的就是标记压缩算法)。 三、相关参数的详细配置