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次,则向操作系统内核态申请重量级锁资源
相关文章
|
26天前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
1月前
|
存储 C语言 C++
【C/C++】动态内存管理( C++:new,delete)
C++的`new`和`delete`用于动态内存管理,分配和释放内存。`new`分配内存并调用构造函数,`delete`释放内存并调用析构函数。`new[]`和`delete[]`分别用于数组分配和释放。不正确匹配可能导致内存泄漏。内置类型分配时不初始化,自定义类型则调用构造/析构。`operator new`和`operator delete`是系统底层的内存管理函数,封装了`malloc`和`free`。定位`new`允许在已分配内存上构造对象,常用于内存池。智能指针等现代C++特性能进一步帮助管理内存。
|
2月前
|
C++
C/C++内存管理(2):`new`和`delete`的实现原理
C/C++内存管理(2):`new`和`delete`的实现原理
|
2月前
|
安全 C++ 开发者
C++一分钟之-动态内存管理:new与delete
【6月更文挑战第19天】在C++中,`new`和`delete`用于动态内存管理,分配和释放堆内存。不正确使用可能导致内存泄漏和悬挂指针。要避免这些问题,确保每次`new`都有匹配的`delete`,释放内存后设指针为`nullptr`。使用`delete[]`释放数组,避免重复释放。智能指针如`std::unique_ptr`可自动管理内存,减少手动管理的风险。通过实例展示了如何使用智能指针进行安全的内存操作。
31 4
|
2月前
|
安全 Java C语言
编程语言的动态内存管理 new 和 delete malloc和free
编程语言的动态内存管理 new 和 delete malloc和free
22 0
|
3月前
|
编译器 C语言 C++
【内存分布管理】new与malloc以及delede与delete[]的区别
【内存分布管理】new与malloc以及delede与delete[]的区别
|
3月前
|
编译器 程序员 C语言
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(下)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
33 0
|
1月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
105 14
|
20天前
|
存储 固态存储 芯片
计算机中内存与存储
【7月更文挑战第28天】
25 1
|
1天前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。