- 博客(5)
- 收藏
- 关注
原创 synchronized加锁流程 从偏向锁到重量级锁
加锁流程图对象头介绍Java对象的内存布局分为三个部分:对象头、实例数据和对其填充。其中对象头又分为两部分使用64bits:用于存储对象自身运行时的数据——Mark Word(32bits)和类型指针,即指向它的类型元数据的指针——Klass Word(32bits)。使用synchronized进行对象锁的同步控制需要用到对象头中的Mark Word,从偏向锁膨胀到重量级锁的过程中,每一步都涉及了Mark Word的改变。初始(没有成为锁的时候)Mark Word会使用25bits记录has..
2020-07-02 11:44:35
1171
1
原创 ReentrantLock非公平锁加锁流程以及源码解读
1、类图2、NonfairSync结构3、流程图4、重要方法源码解读lock()final void lock() { //尝试用cas将state设置为1,设置成功则将exclusiveOwnerThread指向当前线程 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else //cas设置state失败,说明
2020-07-01 12:44:19
238
原创 垃圾回收过程
确认对象死亡 1、引用计数法(主流虚拟机不使用该算法) 在对象中创建一个引用计数器,每当对象被引用的时候,引用计数器加1,每当对象失去引用时,引用计数器减1。当引用计数器数值为0时,该对象则视为死亡。该算法虽然简单高效,但是有一个致命的缺陷–当两个对象互相引用的时候,这两个对象的引用同时置空,他们的引用也不会为0,因为他们之间存在互相引用。代码如下://该情况下无法被使用引用计数器的虚拟机...
2020-03-16 14:42:09
157
原创 对象创建时的内存分配、内存布局及对象定位
1、对象创建时内存分配 1.1、对象所属类的加载检测 虚拟机遇到字节码new指令时,会检测该类是否已经被加载、解析和初始化。如果没有则进行相关的加载操作。 1.2、内存分配 该阶段相当于在堆内存中划分出一块大小确定的内存。内存的分配方式和垃圾回收器的实现方式有关,取决于垃圾回收器是否具备空间压缩整理能力。分配方式有: 1.2.1、指针碰撞:堆内存如果是绝对规整的,即...
2020-03-03 14:46:12
367
原创 Java虚拟机内存区域及可能发生的内存相关异常
1、运行时数据区域 1.1、程序计数器 该区域只占用内存的很小一块,该区域是线程私有的。即每个线程都有一块属于自己的程序计数器。该区域的作用相当于一个代码执行的指示器,字节码解释器在工作的时候通过改变该数值来选取下一条要执行的字节码,是程序控制...
2020-02-28 17:09:26
145
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人