一篇文章说完Java的垃圾回收过程
新生代采用复制算法进行回收垃圾,过程如下: 1. 在MinorGC前会对老年区的剩余空间进行统计,如果剩余区域的和大于新生代的所有对象之和,则开始进行一次Minor GC
2. Minor GC采用复制算法进行垃圾回收,具体过程是把Eden区域的存活得对象拷贝到From区域,From区域的对象的年龄+1。From中的对象根据对象的年代决定是进入To,还是进入老年代。进入老年代的参数默认是年龄是15,可以通过-XX:MaxTenuringThreshold参数设置。
3. 清空Eden和from区域,把To和from空间进行交换,保证To区域为空区域。
4. 如果老年代剩余的内存空间小于新生代所有的对象,虚拟机会查看是否允许担保失败。
5. 如果允许,则虚拟机会继续检查可用空间是否大于历次晋升到老年代的平均水平,如果条件成立,则尝试进行一次MinorGC ,显然这样回收是有风险的, 如果晋升的对象空间大于老年代的剩余空间,则会触发一次Full GC 6. 虚拟机会查看不允许允许担保失败, 则会直接触发 Full GC