前言
我们经常听说java垃圾回收机制,那么什么是垃圾回收呢,其实就是我们程序中创建一个对象来进行操作,在操作完以后不再用这个对象的时候,这个对象就成为了垃圾对象,今天就带大家来简单了解一下java中怎么进行垃圾回收。
JVM堆内存模型
垃圾回收机制详解
上述图片是jvm中的堆内存模型,下面我通过步骤讲解对象的生成到销毁与垃圾回收机制的关系。
第一步
我们新new的对象都放到eden区中,当我们的eden区被放满的时候我们进行一次轻量级的垃圾回收机制简称“轻GC”,这个时候我们将eden区中存活的对象复制到s0区中,然后将eden区清空。
第二步
由于第一步最后将eden区清空了,所以现在新new的对象又可以向eden区存放了,假如这个时候eden区又放满了,这个时候我们再进行一次轻量级垃圾回收机制,这个时候我们将eden区和s0区中存活的对象都全部放到s1区中,然后再将eden区和s0区都清空。
第三步
由于第二步将eden区和s0区都清空了,所以现在新new一个对象又可以向eden区存放了,如果再次将eden区放满了,我们就再次触发一次轻量级垃圾收集机制,将eden区和s1区的存活对象全部放到s0区中,就这样向下以此类推。
第四步
在每一次执行“轻GC”的时候,生存下来的对象会有一个年龄的+1,比如第一次轻GC的时候存活下来的对象标记为1岁,当第二次轻GC的时候上次存活的对象还活着,那么就给他+1岁,也就是2岁了,当第三次轻GC完成以后它还活着,那么它就是3岁了,以此类推,当对象到达15岁时,就会把这个对象复制到老年代区域中,然后将年轻代中该对象清空。
第五步
当对象到达老年代中以后轻GC已经无法再对该对象清理了,因为轻GC只能对年轻代中的对象进行清理,所以当对象到达老年代以后就可以“高枕无忧”了,但是按照以上步骤类推,老年代的对象会越来越多,最后老年代的区域满了,这个时候就要进行一次重量级的垃圾回收机制,就是将年轻代和老年代中所有的未存活对象全部清理掉。
提示
当发生重量级垃圾回收机制的时候会产生STW(Stop The World),意思就是程序短暂的停止,假如我们在双11的时候我们提前把商品加到购物车中,然后等到0点我们就点击付款,但是迟迟没有弹出付款的界面,这是因为产生了重量级垃圾回收机制所以程序短暂停止了,而我们经常说的JVM性能调优其实就是为了减少重量级垃圾回收机制的发生,在以后我的博客中我会详细讲解怎样进行JVM性能调优。