Java虚拟机为我们申请一块地址---->并初始化内容----->将对象的开始地址作为指针返回给o,也就是o引用了(new Object())
图3
CMS(Concurrent Mark Sweep):GC标记清除算法的标识(初始标记>>并发标记>>重新标记>>并发清除如图)
图4
A:Markword jvm设计成 8byte 也就是 64bit(64位)
B:type point 指针类型为4byte (32个字节,这个主要是又jvm配置而来的)
C:instance field 成员变量的大小分为基本类型和引用类型
c1:引用类型:4byte
c2:基本类型int--->4byte,float--->4byte ,char---->2byte,
double---->8byte,boolean--->1byte(后面会进行内部对其,填充一个1byte)
D:padding = 8 - (markword+type point+instance field)% 8+markword+type point+instance field
图5
图6
(标记复制算法)
标记复制算法针对大对象来说复制的成本太高效率太低,所以大对象会分配的老年区,而老年区使用的是标记清除算法
图7(标记清除算法)
标记清除算法不需要复制对象只是将标记需要清除的对象清除,这样就解决了大对象GC成本高的问题。那为什么新生代,老年代不使用同一种算法?
注:新生代存放很多小对象,如果使用标记清除算法,GC的时候会产生很多的内存碎片(也就是找不到一整块连续的内存空间)碎片太严重后续如果需要申请一整块,但是又找不到就出问题了。
a:TLAB(Thread Local Allocation Buffer)线程本地分配缓冲区,叫做Eden快分区,意思就是jvm给每个线程在堆里面的新生代划分一块专属于线程的内存区域,在这个区域里面只有属于他的线程能够使用,这样的话,当线程需要创建对象,使用内存的时候不需要和别的线程竞争,能够快速分配到。
b:Eden慢分区也就是多个线程共用的区域,这块区域存在线程竞争分配效率会比TLAB低
原文:https://www.cnblogs.com/laogonggong/p/14588233.html