java虚拟机的自动内存管理机制(一)

1.java虚拟机运行时数据区

    

      a.程序计数器:

        是当前线程所执行的字节码的行号指示器.如果是执行虚拟机字节码,则记录的是指令的地址

        如果执行的是Native方法,计数器为空(Undefined).

        计数器是线程私有的

      b.java虚拟机栈:

        线程私有的

        生命周期和线程相同,每个方法执行的时候会创建栈帧,用于储存局部变量,操作数栈,动态链接等,一个方法

        从调用到执行完毕的过程,就是一个栈帧在虚拟机栈中入栈到出栈的过程

        当前的大部分虚拟机都可以动态扩展栈内存

      c.本地方法栈:

        和虚拟机栈的作用相似,只不过是java虚拟机栈执行java方法,本地方法栈执行Native方法.

        在HotSpot虚拟机中,没有本地方法栈,虚拟机栈实现其功能

      d.java堆:

        大多数应用来说,是java虚拟机管理内存最大的一块.被所有线程共享的内存区域,用于存放对象实例和数组

      e.方法区:

        线程共享的区域,用来存储被虚拟机加载的类信息,常量,静态变量,运行时常量池等

2.判断对象的存活:

      a.引用计数器,难以解决相互引用的问题,很少用

      b.可达性分析算法.对象到GC roots没有引用链相连接,即在图上不可达.为可回收对象.

              进行可达性分析时,即GC时必须停顿所有Java线程(Stop The World)

3.垃圾收集算法:  

        a.标记-清除算法.分两个阶段,线标记需回收的对象,,然后统一回收标记对象.存在,空间碎片的问题

        b.复制算法:将内存划分为相等的两块,每次只使用一块,当一块用完了,将存活的对象复制到另一块内存

              把剩余的清理掉.缺点,有效内存减少为原来的一半

              一般用来回收新生代.

        c.标记-整理算法:标记-清理算法的改进,标记完,将存活的对象向一端移动,清理边界外的内存,一般用于老年代回收

        d.分代收集算法:按存活的时间,将对象划分为新生代和老年代.分别采用不同的收集算法

4.垃圾收集器:

      Serial收集器:单线程.复制算法.Client模式下默认的新生代收集器,优点,简单高效,无线程切换

          (在启动JVM时,如果不指定.JVM会自动判断,启动Client模式还是Server模式.Server模式启动慢,但运行起            来后,性能远好于Client模式.java -version查看JVM运行的模式)

      ParNew收集器:复制算法.Serial收集器的多线程版本,在Server模式下,首选的新生代收集器.

      Parallel Scavenge收集器,是新生代收集器,复制算法实现,并行的多线程收集器,关注吞吐量  

      Serial Old收集器:单线程.Serial收集器的老年代版本

      Parallel Old收集器:Parallel Scavenge收集器的老年代收集器版本

      CMS收集器:获取最短停顿时间为目标的收集器.(并发收集,低停顿).基于标记-清除算法

      G1收集器:

       特点:

        a.并行与并发

        b.分代收集

        c.空间整合(基于标记-整理算法实现)

        d.可预测的停顿(可以设置最大停顿时间)

        

      

原文地址:https://www.cnblogs.com/2nao/p/6495538.html