一、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:
网友评论