• 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.可预测的停顿(可以设置最大停顿时间)

            

          

  • 相关阅读:
    TP3.2框架,实现空模块、空控制器、空操作的页面404替换||同步实现apache报错404页面替换
    调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)
    JQuery实现的 checkbox 全选;<select>下拉框功能
    使用PHP做移动端 api接口开发方法(适用于TP框架)
    Eclipse jvm启动参数在哪设置
    对 META标签 的一点点了解
    Java反射在整个程序运行中的位置
    Java 为什么要使用反射(通俗易懂的举例)
    粗略介绍Java AQS的实现原理
    Java并发包中线程池的种类和特点介绍
  • 原文地址:https://www.cnblogs.com/2nao/p/6495538.html
Copyright © 2020-2023  润新知