探究java对象头】的更多相关文章

探究java对象头 研究java对象头,我这里先截取Hotspot中关于对象头的描述,本文研究基于64-bit HotSpot VM 文件路径 openjdk-jdk8u-jdk8u\hotspot\src\share\vm\oops\markOop.hpp // 32 bits: // -------- // hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) // JavaThread*:23 epoch:2 a…
为什么要学习Java对象头 学习Java对象头主要是为了解synchronized底层原理,synchronized锁升级过程,Java并发编程等. JAVA对象头 由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能,这些标记字段组成了对象头. 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding). 也就是说 JA…
在前面的文章<青铜4:synchronized用法初体验>中,我们已经提到锁的概念,并指出synchronized是锁机制的一种实现.可是,这么说未免太过抽象,你可能无法直观地理解锁究竟是什么?所以,本文会粗略地介绍synchronized背后的一些基本原理,让你对Java中的锁有个粗略但直观的印象. 本文将分两个部分,首先你要从Mark Word中认识锁,因为对象锁的信息存在于Mark Word中,其次通过JOL工具实际体验Mark Word的变化. 一.从Mark Word认识锁 我们知道…
一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. synchronized结论: 1.java5.0之前,协调线程间对共享对象的访问的机制只有synchronized和volatile,但是内置锁在功能上存在一些局限性,jdk5增加了Lock以及ReentrantLock. 2.java5.0,增加了一种新的机制:显式锁ReentrantLock,注意它…
Java对象头的组成 Java对象的对象头由 mark word 和  klass pointer 两部分组成, mark word存储了同步状态.标识.hashcode.GC状态等等. klass pointer存储对象的类型指针,该指针指向它的类元数据 值得注意的是,如果应用的对象过多,使用64位的指针将浪费大量内存.64位的JVM比32位的JVM多耗费50%的内存. 我们现在使用的64位 JVM会默认使用选项 +UseCompressedOops 开启指针压缩,将指针压缩至32位.    …
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |--------------------------------------------------------------------------------------------------------------| | Object Header ( bits) | |-------------------------------------------…
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充. 对象头 对象头包括两部分:Mark Word 和 类型指针. Mark Word Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等等,占用内存大小与虚拟机位长一致.…
#为了防止自己忘记,先记着,之前我一直以为<深入理解JAVA虚拟机>写错了来着. 一. JAVA对象 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding). 也就是说  JAVA对象 = 对象头 + 实例数据 + 对象填充 二. 对象头 对象头由两部分组成,一部分用于存储自身的运行时数据,称之为 Mark Word,另外一部分是类型指针,及对象指向它的类元数据的指针. 对象头 = Mark…
认真学习过java的同学应该都知道,java对象由三个部分组成:对象头,实例数据,对齐填充,这三大部分扛起了java的大旗对象,实例数据其实就是我们对象中的数据,对齐填充是由于为了规则分配内存空间,java对象大小一定是8字节的整数倍,但是我们也不能让程序员来控制吧,所以当不够8位时,会自动填充至8的整数倍,对象头记录了hash值,gc年龄,锁状态(偏向锁还会记录线程id),gc状态等等,它还保存了对象的class指针,可谓是核心中的核心,有兴趣的同学可以去看一下关于我写的对象的一些介绍:htt…
概览 对象头 存放:关于堆对象的布局.类型.GC状态.同步状态和标识哈希码的基本信息.Java对象和vm内部对象都有一个共同的对象头格式. (后面做详细介绍) 实例数据 存放:类的数据信息,父类的信息,对象字段属性信息. 如果对象有属性字段,则这里会有数据信息.如果对象无属性字段,则这里就不会有数据. 根据字段类型的不同占不同的字节,例如boolean类型占1个字节,int类型占4个字节等等: 对齐填充 存放:为了字节对齐,填充的数据,不是必须的. 默认情况下,Java虚拟机堆中对象的起始地址需…
对象由多部分构成的,对象头,属性字段.补齐区域等.所谓补齐区域是指如果对象总大小不是4字节的整数倍,会填充上一段内存地址使之成为整数倍. 后面两个很好理解,今天我主要想总结一下对象头: 对象头这部分在对象的最前端,包含两部分或者三部分:Mark Words.Klass Words,如果对象是一个数组,那么还可能包含第三部分:数组的长度. Klass Word里面存的是一个地址,占32位或64位,是一个指向当前对象所属于的类的地址,可以通过这个地址获取到它的元数据信息. Mark Word需要重点…
详见: http://www.cnblogs.com/pureEve/p/6421273.html…
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法.至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小. 不过有一点不同的是,这篇文章使用命令行传入JVM参数来指定代理,这里我通过Eclipse设置JVM参数: 后面的是我打的agent.jar的具体路径.剩下的就…
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理.分代GC.OOP-Klass模型等内容.最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容. 背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000…
[ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.0.0</version> </dependency> 然后直接java代码即…
[Java对象解析]不得不了解的对象头 一个Java对象到底占用多大内存? JVM源码分析之java对象头实现 java对象在内存中的结构(转帖) 一个Java对象到底占多大内存? 在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢? 要知道一个对象的大小,那么必须需要知道对象在虚拟机中的结构是怎样的,来看看Hotspot中对象在内存中的结构: 从上面的这张图里面可…
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法.至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小. 不过有一点不同的是,这篇文章使用命令行传入JVM参数来指定代理,这里我通过Eclipse设置JVM参数: 后面的是我打的agent.jar的具体路径.剩下的就…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 感觉什么都不会,从哪开始呀! 这是最近我总能被问到的问题,也确实是.一个初入编程职场的新人,或是一个想重新努力学习的老司机,这也不会,那也不会,总会犯愁从哪开始. 讲道理,毕竟 Java 涉及的知识太多了,要学应该是学会学习的能力,而不是去背题.背答案,拾人牙慧是不会有太多收益的. 学习的过程要找对方法,遇到问题时最好能自己想想,你有哪些方式学会这些知识.是不感觉即使让你去百度搜,…
上一篇文章中我们从HotSpot的源码入手,介绍了Java的对象模型.这一篇文章在上一篇文章的基础上再来介绍一下Java的对象头.主要介绍一下对象头的作用,结构以及他和锁的关系. Java对象模型回顾与勘误 在上一篇文章中,关于对象头的部分描述有误,我已经在我博客的文章中就行修正 .这里再重新表述一下. 每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类.当我们在Java代码中,使用new创建一个对象的时候,J…
java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了java虚拟机数据的存储区域后,再来探究一下对象是如何产生的? 对象是如何创建的? 对于使用者来说,创建对象仅仅只是new一个对象而已.但对于虚拟机来说,却是一系列的过程. 1.检查对象所属类是否进行过类加载 虚拟机在遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,…
前言 并发编程式Java基础,同时也是Java最难的一部分,因为与底层操作系统和硬件息息相关,并且程序难以调试.本系列就从synchronized原理开始,逐步深入,领会并发编程之美. 正文 基础稍微好点的同学应该都知道,Java中获取锁有两种方式,一种是使用synchronized关键字,另外一种就是使用Lock接口的实现类.前者就是Java原生的方式,但在优化以前(JDK1.6)性能都不如Lock,因为在优化之前一旦使用synchronized就会发生系统调用进入内核态,所以性能很差,也因此…
这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 数组对象结构是 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对…
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV…
Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有不同的分配调用层次. 下面就以bytecodeInterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程: 一.快速分配 1.实例的创建首先需要知道该类型是否被加载和正确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调用is_un…
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程,在类的加载检查通过后,接下来java虚拟机会为新生对象会在堆中划分出一定的内存.对象所需内存大小在类加载完成后即可完全确定. 假设,java堆中的内存是绝对规整的,分配内存仅仅是把指针指向空闲空间那边挪动一段与对象大小相等的距离,叫"指针碰撞",如果java堆中的内存不是规整的,…
1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization).串行化的主要任务是写出对象实例变量的数值.如果变量是另一对象的引用,则引用的对象也要串行化.这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象.对象的对象.对象的…
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.re…
通常来说Hotspot jvm的对内存中的对象由以下几个部分组成 一个对象头,包含了一些整理工作所需信息 原始类型字段,不同类型大小各异(表1) 引用字段,占据4个字节(byte) 填充,在对象的末尾会有几个“浪费”了的字段,这样做是为了确保每个对象的开始地址都是字节的倍数.从而减少指向对象的指针的位数. Java 类型 字节数 boolean 1 byte char 2 short int 4 float long 8 double boolean类型占一个字节而不是一位 整理工作所需信息 包…
转载: 如何精确地测量java对象的大小-底层instrument API 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识,如何测量对象大小,ja…
在网上搜到了一篇博客讲的非常好,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashS…