文档章节

java对象结构

g
 gucheng_en
发布于 2017/04/25 19:19
字数 504
阅读 17
收藏 0

java对象在内存中占用字节 以64位为例
对象在内存中的结构

其中对象头包括:markword (_mark) 和class对象指针(_klass)

1.markword:占用8个字节 用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等

2.class对象指针:占用8个字节 如果开启指针压缩的话则占用4个字节 即对象指定的是那个实例对象

所以一个对象如果未声明任何属性的话 占用的内存为  16字节  或   12字节(开启指针压缩)
开启指针压缩方式  -XX:+UseCompressedOops  默认是开启的;  

实际数据对象(instance data):占用的是对象指针大小  8个字节  开启指针压缩的话 就占用4个字节

补齐填充(padding) :对齐8个字节,即 对象头 + 对象实例数据 的大小要是8 的倍数;

比如一个对象 A
public class A  {
    private Long i = 1L;
   private String s1;
    /* private String s2;
    private String s3;
    private String s4;*/

}

此时占用的内存大小为: 12(markWord->8 class对象指针->4) + 4(对象地址) + 4(对象地址) = 24 bytes ;仔细的你肯定发现这不是等于20嘛  是的;因为有对齐补充 即地址的总和是 8的倍数;所以这里是24; 
若未开启对象指针压缩: 16 + 8 + 8 = 32;

验证方式:

public class MemoryTest {

    public static void main(String[] args) {
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<A>  list = new ArrayList<>();
       /* Instrumentation inst = new InstrumentationImpl();*/
        for(int  i = 0 ; i < 10000000 ; i++){
            A a = new A();
//            a.setI(1);
            list.add(a);
        }
        try {
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

model

public class A implements Serializable {
    private Long i = 1L;
   private String s1;
    /* private String s2;
    private String s3;
    private String s4;*/


}

运行代码:

使用java小工具: jmap -histo ${pid}

查看对象大小如:

 

所以在java中  Integer 和int 占用的内存分别是多少呢?

Integer  : 16个字节  ; int 占 4个字节;

static属性是不占堆内存的;

 

 

© 著作权归作者所有

g
粉丝 1
博文 12
码字总数 6402
作品 0
闸北
程序员
私信 提问
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
2018/08/29
0
0
探究ThreadLocal原理(基于Java8)

线程封闭 避免并发最简单的方法就是线程封闭。 即把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。 使用ThreadLocal是实现线程...

芥末无疆
2018/02/10
0
0
JVM系列第8讲:JVM 垃圾回收机制

在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由《Java 虚拟机规范》指定的,每个 Java 虚拟机可能都有不同的实现。其实涉及到 Java 虚拟机的内存,就不得不谈到 Ja...

陈树义
2018/11/21
0
0
JVM系列第6讲:Java 虚拟机内存结构

看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了。那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了。在这个...

陈树义
2018/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象编程

1、类和对象 类是对象的蓝图和模板,而对象是实例;即对象是具体的实例,类是一个抽象的模板 当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定...

huijue
今天
8
0
redis异常解决 :idea启动本地redis出现 jedis.exceptions.JedisDataException: NOAUTH Authentication required

第一次安装在本地redis服务,试试跑项目,结果却出现nested exception is redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required错误,真是让人头疼 先检查一...

青慕
今天
10
0
Spring 之 IoC 源码分析 (基于注解方式)

一、 IoC 理论 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。 二、IoC方式 Spring为IoC提供了2种方式,一种是基于xml...

星爵22
今天
25
0
Docker安装PostgresSql

Docker安装PostgresSql 拉取docker镜像 # docker pull postgres:10.1010.10: Pulling from library/postgres9fc222b64b0a: Pull complete 38296355136d: Pull complete 2809e135bbdb: Pu......

Tree
今天
8
0
内容垂直居中

方法一: 采用上下 padding 形式,将内容放置在垂直居中 .line { padding: 2% 0; text-align: center; height: 5px;} <div class="line"> 内容垂直居中</div> 方法二: 采......

低至一折起
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部