Object o = new Object()在内存中占几个字节

简介: Object o = new Object()在内存中占几个字节

CAS:

Compare and Swap,即比较再交换。

jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。

CAS算法理解

对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做.

 

查看对象在内存中的布局:

引入依赖

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
        </dependency>

 

 

对象在内存中的布共分为四部分:

 

 

对象在内存中的布共分为四部分:

  1. Markword:主要存储锁的信息和GC的信息,占8个字节
  2. 类型指针class pointer :指向这个类在内存中的Class对象,占4个字节
  3. 实例数据 instance data : 这个类中实例对象所占的内存,如果int a 则占4个字节,如果时long b,则占8个字节
  4. 对齐padding:如果前边几个加起来的字节数不是8的整数倍,则填充补齐
    所以Object o = new Object();在内存中共占用8+4+0+4共16个字节

 

 

 

 

锁的升级:锁的信息记录在markword中.

  • Object o = new Object();在对象刚刚被new出来时,没有加任何锁.用markdown中最低三位代表锁状态,其中一位是偏向锁位,两位是锁标志位
  • 此时线程A访问该对象,因为A是第一个访问该对象的线程,此时没有其它线程竞争,o的markword的前54位指向了当前线程,此时为偏向锁.
  • 当线程A添加了偏向锁之后,线程B也来访问o对象,A,B两个线程竞争.这两个线程分别在各自的线程栈中生成一个Lock Record,以CAS的方式对o竞争加锁,假设A成功,则o的markword指向线程A的Lock Record,线程B处于自旋状态.此时o上添加的是轻量级锁也叫自旋锁,也叫无锁.
  • 当线程B自选次数超过10次,则向操作系统内核态申请重量级锁资源
目录
打赏
0
0
0
0
12
分享
相关文章
|
10天前
|
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
54 26
|
9月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
137 4
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
183 3
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
179 2
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
在实际开发中,什么时候应该使用 `new` 关键字,什么时候应该使用 `Object.create()` 方法?
【10月更文挑战第29天】`new` 关键字适用于创建具有特定类型和初始化逻辑的对象实例,以及实现基于原型链的继承;而 `Object.create()` 方法则适用于基于现有对象创建相似对象、避免构造函数的副作用、创建具有特定原型链的对象等场景。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象,以实现更高效、更灵活的代码结构。
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
172 1
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
111 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问