java 对象内存布局_Java--对象内存布局
在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部、实例数据、对齐填充。
一、对象头部Header的布局
Mark Word
Class 指针
在32位系统下,上面两部分各占4B;
在64位系统中,Mark Work占4B,class指针在开启指针压缩的时候占4B;为开启指针压缩的时候占8B.
1、Mark Word 存储对象自身的运行时数据信息,例如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID。
2、Class 指针,通过该指针确定该对象是哪个类的实例。
另外,如果该对象是一个数组,那么还将会有一个数据来记录数组的长度4B(32bit)/8B(64bit)。
二、数据部分
在该字段中,无论是从父类继承下来的还是该类自身的,都需要记录下来,而这部分的存储顺序受虚拟机的分配策略和定义的顺序的影响。
默认分配策略:long/double -> int/float -> short/char -> byte/boolean -> Reference
如果设置了-XX:FieldsAllocationStyle=0(默认是1),那么引用就会放在最前面:
Reference -> long/double -> int/float -> short/char -> byte/boolean
结论:分配策略总是按照宽度由大到小的顺序排列,相同宽度的放在一起。
在有继承关系的对象中,只有一个头部,父类的属性分配到该对象中,这样才能通过父类访问他的属性。如果开启CompactFields,那么,子类中较窄的变量就会插到父列的变量的空隙中。
[[注]] 静态属性所占的空间通常不计算到对象本身的空间中,以为他的引用是在方法区。
属性的对齐,例如byte占用一个字节的空间,那么就会填充3字节实现对齐。(32bit系统)
三、对齐填充
Java对象在内存中将以8字节对齐,也就是对象的总大小必须是8字节的整数倍。
java 对象内存布局_Java--对象内存布局相关推荐
- java对象的内存结构_Java对象在内存中的结构分析
问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...
- java对象内存模型_Java对象的内存模型
众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...
- java对象生命周期_Java对象生命周期和类生命周期
原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...
- java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。
前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...
- java内存泄漏和内存溢出_Java和内存泄漏
java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...
- java 对象池 实现_Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- java虚拟机内存监控_java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用...
将会打印出很多jvm运行时参数信息,由于比较长这里不再打印出来,可以自己试试,内容一目了然 Jstack(Stack Trace for Java):JVM堆栈跟踪工具 jstack用于打印出给定的j ...
- java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...
展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...
- java虚拟机内存告警_java虚拟机内存溢出各种场景总结
java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. ...
- java 内存 静态_java中内存分配以及static的用法(转)
JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...
最新文章
- linux命令(2)vmstat
- Bech32编码 (2)原理
- ios lua 增量更新,更新内部代码
- 文件压缩 Huffman编码 (java)
- 解决PL/SQL查询结果乱码的问题
- 20145324 《Java程序设计》第1周学习总结
- 用jsp编写一个猜26个小写英文字母的web小游戏
- 如何设计企业特色的数字化转型架构?
- android按钮延迟显示出来,android Toast显示延迟的优化方案
- 【matlab实现多种股票数据同列收盘价格分析走势图,以及涨跌幅变化曲线第二篇】
- 数据分析的终极目标-预测第1辑
- 2014婚纱照8大流行风格大揭密
- 什么是以太网,它在WiFi世界中的价值是什么?
- firewall 防火墙
- python对股票的基本面进行分析_python菜鸟学员如何获取沪深股票基本面数据
- CAD填充图案如何缩放
- tp5 批量更新多条记录_TP5数据库操作——更新
- 【KKT】∇f(x)+λ∇g(x)=0中λ的讨论
- Word中的空白页,怎么也删不掉?如何操作?
- python3半自动爬虫,获取风暴英雄官方壁纸