zoukankan      html  css  js  c++  java
  • JAVA一个对象占用多少字节

    通过代码计算对象的大小

    工具JOL :Java Object Layout  java对象布局

    引入POM文件

            <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.10</version>
            </dependency>
    public class HelloJol {
        public static void main(String[] args) {
            Object o = new Object();
            String s = ClassLayout.parseInstance(o).toPrintable();
            System.out.println(s);
        }
    }

    打印结果

    前两行就是markWord 固定8个字节

    分析java对象的组成

    普通对象

    对象头:markword 8  (锁的标识位:标识对象的状态,GC标记:对象被回收了多少次 分代年龄)
    ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节(默认开启) 不开启为8字节 (对象属于哪个Class)
    实例数据 引用类型:-XX:+UseCompressedOops 为4字节(默认开启) 不开启为8字节 Oops Ordinary Object Pointers(成员变量的引用 比如下面的Object o)
    Padding对齐,8的倍数 (64位的机器 按块来读,一下子读16个字节)

    观察虚拟机配置命令 java -XX:+PrintCommandLineFlags -version

    数组对象

    对象头:markword 8
    ClassPointer指针同上
    数组长度:4字节
    数组数据
    对齐 8的倍数

    用例测试

    public class T03_SizeOfAnObject {
        public static void main(String[] args) {
            System.out.println(ObjectSizeAgent.sizeOf(new Object()));
            System.out.println(ObjectSizeAgent.sizeOf(new int[] {}));
            System.out.println(ObjectSizeAgent.sizeOf(new P()));
        }
    
        //一个Object占多少个字节
        // -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
        // Oops = ordinary object pointers
        private static class P {
                            //8 _markword
                            //4 _class pointer
            int id;         //4
            String name;    //4
            int age;        //4
    byte b1;        //1
            byte b2;        //1
    
            Object o;       //4
            byte b3;        //1
    
        }
    }

    打印结果:

    16 = 对象头8个 + ClassPointer指针 4个 +padding对齐 4个

    16 = 对象头8个 + ClassPointer指针 4个 +数组长度 4个 +padding对齐0个

    32 = 对象头8个 + ClassPointer指针 4个 + int id 4个 + name的引用四个 + int age 4个+1+1+4+1 + padding对齐

    对象头具体包括什么

    8个字节64位 看对象的状态分配64位。普通状态和锁定状态每一位完全不一样

    主要包括

    锁的标识位:标识对象的状态,

    GC标记:对象被回收了多少次 分代年龄

    参考JVM层面 Synchronized的实现

    当一个对象已经计算过identity hash code它就无法进入偏向锁状态

    对象是怎么定位的

    T t = new T()

    t是怎么找到堆内存中的T对象

    1.句柄池:

    2.直接指针(HotSpot的实现):

  • 相关阅读:
    cogs 775. 山海经
    [HZOI 2016][Tyvj 1729]文艺平衡树 这道题我真是哭了,调了一下午,一晚上
    几种平衡树
    bzoj1124 [POI2008]枪战Maf
    [Usaco2007 Open]Fliptile 翻格子游戏
    团队冲刺08
    团队冲刺07
    团队冲刺06
    团队冲刺05
    团队冲刺04
  • 原文地址:https://www.cnblogs.com/ssskkk/p/12814931.html
Copyright © 2011-2022 走看看