java普通对象的内存分配

java 普通对象,内存分配, 。数组类型 会多个数组长度表示,占用的长度是系统位宽

 组成部分:头+实例数据+填充(保证整体字节数量是8的倍数)

对象头:包含两部分: markword+ 类型指针(确定对象是哪个类的实例,不一定都有,看虚拟机实现)

1,对象头

   1.1markword:   32位系统  4个字节;  64位系统:8字节。

   此部分,数据结构不固定,根据加锁情况,存储内容会变化。

   32位系统:25bit+4bit(分代年龄)+2bit(锁标识)+1bit(固定0)     

    分代年龄:垃圾回收,进入老年代判断使用。4bit决定 取值范围0-15。年轻代每回收一次+1

        不是都到15了才进入。大对象,动态分代年龄(当Survivor区 相同年龄 的所有对象 合计大于Survivor空间的一半,年龄大于或等于该平均年龄值的对象,可直接进入老年代 )

  说明: Survivor 。一级分类:年轻代+old。年轻代:eden+Survivor,Survivor:from+to(复制算法 设计如此,垃圾回收时用来交换)。

比列一般情况:eden(1/3*0.8)+from(1/3*0.1)+to(1/3*0.1)+old(2/3)

     锁标识:无锁,偏向锁,轻量级,重量级

 1.2类型指针kclass
       32位系统:4个字节。64位系统:不开启指针压缩8字节,开启后时4个字节。

2,实例数据

      基本类型: boolean, byte 1. short. char 2  int float 4 double,long 8

     引用类型: 32位系统:4个字节。64位,不开启指针压缩是8字节,开启后时4个字节。

    总结,实例数据部分, 基本类型,32位和64位系统 内存分配长度一样。1,2,4,8

    引用类型,32位系统,32位。64位,不开启压缩是64位,开启是32位

3,填充部分:0-7 字节

说明,指针压缩参数:jdk1.6 update14开始,64系统 jvm支持指针压缩。启用指针压缩-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops

oop(ordinary object pointer)  对象指针的意思。

面试题:

 Object obj =new Object();    内存占用。

单说 对象内存分配,不考虑引用obj,根据前面讲解分析,32位系统 8个字节。64位系统16个字节。

参考:

 https://www.iteye.com/blog/icyfenix-1145044

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值