虚拟机:Java HotSpot(TM) 64-Bit Server VM (25.221-b11, mixed mode)

对象的内存以字节为单位,必须是8的倍数,它的构成由3部分组成:对象头+实例数据+对齐内存。对象头主要包括对象的运行行元数据,比较哈希码、GC分代年龄、锁状态标志还有类型指针,类型指针指向类元数据,表明该对象所属类型。实例数据包括自身数据和所有父级数据,所有父级占内存大小都是8的倍数,没有就需要补齐。类型指针一般为4字节,在关闭压缩普通对象指针时(-XX:+UseCompressedOops)为8字节,UseCompressedOops默认是开启的,只有虚拟机内存达到32G以上,4个字节已经无法满足寻址需求时,才需要关闭该参数。

普通对象头除类型指针外的大小为8字节,在开启压缩总大小为12字节,不开启压缩总大小为16字节;数组对象头在开启压缩时是16字节,不开启压缩为24字节。

各种类型大小如下:

对象类型 字节  
boolean 1  
byte 1  
short 2  
char 2  
int 4  
float 4  
long 8  
double 8  
引用类型 开启指针压缩为4,不开启为8  
普通对象头 开启指针压缩为12,不开启为8  
数据对象头 开启指针压缩为16,不开启为24  

例1:

public class Persion {
int id;
}

开启压缩普通对象指针时,对象大小:(8+4)+4+0=16字节,补齐0字节

关闭压缩普通对象指针时,对象大小:(8+8)+4+4=24字节,补齐4字节

例2:

public class Persion {
int id;
String name;
int age;
Date birthday;
}

开启压缩普通对象指针时,对象大小:(8+4)+(4+4+4+4)+4=32字节,补齐了4字节。

关闭压缩普通对象指针时,对象大小:(8+8)+(4+8+4+8)+0=40字节,补齐了0字节

例3:

public class Persion {
int id;
String name;
int age;
Date birthday;
boolean school;
} public class Student extends Persion {
int b;
}

开启压缩普通对象指针时:

Person对象的大小为:(8+4)+(4+4+4+4+1)+7=32字节,补齐了7字节。

Student对象的大小为:(8+4)+(4+(4+4+4+4+1+7)) +0=40字节,Person对象补齐了7字节。

关闭压缩普通对象指针时:

Person对象的大小为:(8+8)+(4+8+4+8+1)+7=48字节,补齐7字节

Student对象的大小为:(8+8)+(4+(4+8+4+8+1+7))+4=56字节,Person对象补齐了7字节,Student补齐4字节。

例4:

class MyList {
Persion[] elementData = new Persion[10];
}

开启压缩普通对象指针时:

MyList对象大小:(8+4)+4+0=16字节,补齐了0字节

new Person[10]数组对象大小:16+4*10+0=56字节,补齐了0字节

关闭压缩普通对象指针时:

MyList对象大小:(8+8)+8+0=24字节,补齐了0字节

new Person[10]数组对象大小:24+8*10+0=104字节,补齐了0字节

例5:

@SuppressWarnings("serial")
class MyArrayList extends ArrayList<Persion> { }

AarryList和它父级只有3个非静态成员变量(size为整数、elementData为数组引用,在ArrayList类中,modCount为整数在AbstractList类中),静态变量内存在堆的另外部分,不在对象内。

开启压缩普通对象指针时:

MyArrayList对象大小:(8+4)+(0+(4+4+(4+4)))+4=32字节,AbstractList做了一次补齐,整体做了一次补齐。(与下图结果不符,后面抽时间在看看)

关闭压缩普通对象指针时:

MyArrayList对象大小:(8+8)+(0+(4+8+(4+4)+4))+0=40字节,AbstractList做了一次补齐,ArrayList做了一次补齐

Java一个对象占用多少字节的更多相关文章

  1. java.lang.instrument: 一个Java对象占用多少字节?

    一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)   1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年 ...

  2. java 一个对象多少大,占用多少内存

    1.instrumentation这种方法还是靠谱的 一个对象占用多少字节? 2.sizeof库 <!-- https://mvnrepository.com/artifact/com.carr ...

  3. Java各种类型占用的字节数

    Java 占用字节数 转自:http://www.blogjava.net/stevenjohn/archive/2013/10/18/405416.html 数据类型 大小(二进制位数) 范围 默认 ...

  4. 为什么JVM要用到压缩指针?Java对象要求8字节的整数倍?

    前言 前两天在一个帖子中看到一道面试题: 堆内存超过32G时,为什么压缩指针失效? 之前没有了解过这方面的知识,于是开始google起来,但当我翻看了不下一页的帖子,我都仍然没有搞懂,因为好多答案给我 ...

  5. 获取JAVA对象占用的内存大小

    介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...

  6. Java基本数据类型及字节

    1.基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型又可以分为整数类型byte.short.int. ...

  7. linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  8. 编码占用的字节数 1 byte 8 bit 1 sh 1 bit 中文字符编码 2. 字符与编码在程序中的实现 变长编码 Unicode UTF-8 转换 在网络上传输 保存到磁盘上 bytes

    小结: 1.UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等: 2 服务器->网页 utf-8 ...

  9. Java将文件转为字节数组

    Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...

随机推荐

  1. Asp.net MVC企业级开发(01)---Autofac

    1.1 控制反转 在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统的业务逻辑.同时,对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础.但是 ...

  2. loadrunner:Action.c(4): Error -27796: Failed to connect to server "10.8.251.101:10086": [10060] Connection timed out

    Action.c(4): Error -27796: Failed to connect to server "10.8.251.101:10086": [10060] Conne ...

  3. 完整且易读的最新版小程序登录态和检验注册过没的app.js写法

    目录 0.可参考的官方页面 1.流程 2.app.js代码 3.java后台怎么通过code获取openId 0.可参考的官方页面 获取登录凭证:https://developers.weixin.q ...

  4. shell脚本遇到问题"$'\r': command not found"

    shell脚本写得一切正常,但是一执行就报错: line: XXX "$'\r': command not found" 问题原因:文件格式问题(虽然在window和linux上选 ...

  5. pyTorch 基于以resnet50为backbone的PSPNet 训练VOC2012数据集

    代码链接:https://github.com/ggyyzm/pytorch_segmentation 使用PSPNet作为主干分类网络 1.将VOC2012数据集下载并解压到data/VOCtrai ...

  6. NetScaler的常用配置

    CITRIX NETSCALER常用功能有:LB,CS,GSLB,SSL LB实现的功能是服务器负载均衡,CS实现基于七层(域名,IP等)的负载均衡,GSLB实现的功能是全局负载均衡,SSL实现的功能 ...

  7. Spring中@Autowired、@Resource和@Inject注解的使用和区别

    在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理. 下面介绍 ...

  8. 火车头data下任务文件夹的SpiderResult.db3文件用什么软件打开

    火车头采集器默认是用sqlite数据库来保存数据的,新建一个采集,打开data/任务/发现有一个SpiderResult.db3文件,.db3是sqlite的存储文件后缀,那么要如何查看这些文件呢?用 ...

  9. tomcat 多实例部署

    tomcat 配置多个实例 参考文档 聊聊 Tomcat 的单机多实例 https://www.cnblogs.com/mafly/p/tomcat.html 极客学院 Tomcat 8 权威指南 h ...

  10. l获取list 的长度,EL表达式获取list的长度,EL表达式获取list大小

    在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...