JVM篇

作者: 南蛮小白 | 来源:发表于2018-04-07 16:31 被阅读0次

    一、java内存区域的组成

    程序计数器,线程私有,用来存储线程执行到哪条字节码指令;

    栈,线程私有,存储局部变量,方法出口,操作数栈,动态链接等;

    堆,线程共有,垃圾回收的主要区域,存储对象实例;

    本地栈,跟栈相似,区别在于执行的是本地的方法;

    方法区,线程共有,存放静态变量,类信息,常量,1.8之前,属永久代,1.8之后,用元空间代替;

    运行时常量,方法区一部分,存放字面量以及乳引用。

    二、对象的创建

    指针碰撞法:内存工整,通过挪动指针来增加内存;

    空闲列表法;内存不工整,维护列表记录哪些内存是可用的。

    三、对象分配的线程安全

    CAS+失败重试

    通过TLAB(本地线程分配缓冲)预分配内存,每个线程划分不同区域的内存,只有当TLAB用尽了,才同步锁定。-XX:+/-UseTLAB参数设定

    四、对象内存布局

    对象头+实例数据+对齐填充

    五、对象访问

    直接访问,对象引用直接指向堆得对象实例地址,优点:快;缺点:GC之后,堆的实例地址发生改变,需修改引用。HotSpot默认;

    句柄访问,对象引用指向堆的句柄池,缺点:多了一次指针定位;优点,不需修改对象引用。

    六、对象的回收

    引用计数法

    可达性算法分析

    七、GC回收算法

    标记-清除;标记,清除,产生碎片内存,有大对象时,容易引发fullGC

    复制算法;新生代的常用算法,分为2个Survivor、1个Eden(1:1:8默认)

    标记-整理;标记,整理

    八、垃圾收集器

    Serial;简单、高效;但单线程。新生代:复制算法;

    Parnew;Serial的多线程版本。新生代:复制算法;

    Parallel Scavenge;吞吐量优先。新生代:复制算法;

    Serial Old;搭配Parallel Scavenge;CMS备用方案。老年代:标记-整理。

    Parallel Old;Parallel Scavenge老年代。

    CMS:初始标记→并发标记(NO STW)→重新标记→并发清除(NO STW)。老年代:标记-清除。

    G1:

    相关文章

      网友评论

          本文标题:JVM篇

          本文链接:https://www.haomeiwen.com/subject/bveyhftx.html