java 对象的创建和对象的内存布局

来源:互联网 发布:tor 网络 编辑:程序博客网 时间:2024/05/16 12:00

由看到一篇3年前的xieyuooo 博客,我去学习了的java中对象的内存布局 现做个笔记

博客文如何精确地测量java对象的大小-底层instrument API   地址:http://blog.csdn.net/xieyuooo/article/details/7068216)


java普通对象的创建(不包括数组和class对象)

1.确定类有没有被加载解析和初始化

2.如果没有那必须先执行相应的类加载过程。

3.类加载检查通过后,虚拟机将为新生对象分配内存。(对象所需的内存大小在类加载完成后可以完全确定)

4.虚拟机将分配到的内存空间都初始化为零值(不包括对象头)

5.对对象头进行设置

%%%%% java虚拟机的工作已经结束了 %%%%

6.按照程序员意愿进行程序初始化


对象的内存布局

对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding).

对象头分为两个部分:Mark Word(哈希吗、GC分代年龄等等)

                                   类型指针(Sun HotSpot是属于通过直接指针访问)即对象指向它的类元数据的指针

                                   (虚拟机通过类型指针来确定这个对象是哪个类的实例)

                                   另外:如果对象是一个Java数组,对象头中还必须有一块用于记录数组长度的数据。

                                       对齐填充的意思是:对象的大小必须是8字节的整数倍


突然想起了一个jdk自带的工具 javap可以反编译,可以查看Java编译器生成的字节码

javap  A.class (反编译)

javap  -c  A.class (查看Java编译器生成的字节码)


参考文章:1. 如何精确地测量java对象的大小-底层instrument API

                 2. Java装箱和拆箱的基本概念及使用

                 3. 深入JVM---JVM命令---invokespecial

                 4. 深入理解java虚拟机 (书籍 周志明著)

0 0
原创粉丝点击