JVM垃圾收集机制流程

     本来想一次性将java虚拟机上的垃圾回收机制弄懂的,看了几篇关于这方面的文章之后发现,要想把这一方面的知识全部弄清楚还需要深入研究吖!下面就先将JVM垃圾回收的机制大致的说一下吧!

     不知道大家是否还记得java中栈和堆的概念,栈是java程序运行时用的,它可以展示性的存放一些临时变量,堆就是用来存放数据的,栈中的变量指向堆地址中的数据,首先让我们全面看一下JVM的结构框架图吧:

    
JVM垃圾收集机制流程
      上篇博客里面写到了类加载器,现在来讲讲堆吧!正因为java中将栈和堆的概念分开了,才会出现垃圾回收的机制,因为每次创建一个新的对象就要在对中开辟一块内存将其储存起来!

      java中垃圾收集简称GC(garbage collection),JVM中的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,是由于有内存的限制,JVM中才实现由垃圾回收所管理的堆

   堆空间又划分三个代,年轻代、年老代、永久代,这个是按照不同的对象按照不同的生命周期来划分的,从字面上就可以看出,年轻代存放的对象的生命周期最短,年老代存放的对象的生命周期比较长,永久代存放的对象的生命周期是最长的,像什么静态(static)对象等。年轻代由分为eden和两个survivor区间,两个survivor的大小是一样的。如图所示

  
JVM垃圾收集机制流程
 JVM垃圾回收机制大致是这样的

  1、创建一个对象在eden中进行内存分配

  2、当eden内存不够的时候,就会进行垃圾回收,触发minorGC(有的称scavenger GC)机制,在eden和一个survivor区间进行垃圾回收

  3、在进行minorGC的时候,是将eden和一个survivor中还存活的对象放在另一个空的survivor中,再清空之前的eden和survivor,这两个survivor必须保证有一个为空

  4、当完成第3步之后,后面加进来的新的对象将这个survivor占满了的时候,再将survivor中的对象copying到old generation区段

  5、当old generation也满了的时候,再进行全面的垃圾回收(full GC),即将young generation、old generation和permanent generation进行清理

 

将JVM垃圾回收机制的流程之后,我们主要是要对其进行优化,因为

垃圾收集的一大缺陷是:它的开销影响程序性能,为了提高垃圾收集的效率,其关键要素是minorGC和fullGC阶段,同时还有堆中各个部分的大小也影响着垃圾收集的效率,换句话说,垃圾收集机制的核心就是算法和JVM各参数的设置,目前我还在研究当中。。。

<!--EndFragment-->