当前位置: 首页 > news >正文

JVM学习笔记:对象的内存布局和访问定位

  对象内存布局:

  对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据和对齐填充。

  一、对象头包括两部分信息:

  第一部分用户存储对象自身的运行时数据、如哈希码、GC分代年龄、线程持有的锁、偏向线程ID,偏向时间戳等,官方称它为”Mark Word“

  第二部分用于存放类型指针,虚拟机可以通过这个指针来确定这个对象是哪个类的实例。另外,对象如果是一个java数组,那再对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通java对象的元数据确定java对象的大小,但是从数组的元数据中却无法确定数组的大小

  二、实例数据:

  实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的名称类型的字段内容。无论是从父类继承下来的,还是从子类中定义的,都需要记录下来。这部分的存储顺序会受到虚拟机分配参数和字段在java源码中定义顺序的影响。

  三、对齐填充:

  对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。虚拟机的自动内存管理系统要求对象起始地址必须是8个字节的整数倍,因此党实例数据部分没有对齐时,就需要通过对齐填充来补全。

  备注:对象头正好是8字节的倍数,所以不会影响是否对齐填充。

  对象的访问定位:

  java程序需要通过栈上的reference(引用)数据来操作堆上的具体对象。对象的访问方式是取决于虚拟机实现决定的,目前主要的访问方式有使用句柄直接指针两种。

1)句柄访问:

  句柄访问最大的好处是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针。

2)直接访问:

  使用直接指针访问方式最大的好处就是速度更快,它节省了一次指针定位的开销,由于对象的访问在java中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本。

  

  

  

  

  

转载于:https://www.cnblogs.com/TigerAustin/p/10559167.html

相关文章:

  • 图像质量评估-锐度
  • NKOJ4241 蚯蚓 (【NOIP2016 DAY2】)
  • spring IOC bean中注入bean
  • 【OpenJ_Bailian - 4110】圣诞老人的礼物-Santa Clau’s Gifts (贪心)
  • centos7通过yum安装docker
  • 【Beta】Scrum meeting 2
  • 在Windows下搭建Gitlab服务器
  • mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复
  • Docker是什么?可以用Docker做什么?
  • 《坐热板凳》第九次团队作业:Beta冲刺与验收准备(补交:实验十二 第八次团队作业:软件测试与ALPHA冲刺)...
  • 14-使用Vue来实现JQuery的动画效果
  • MP4V2 移植 (基于imx6 平台)
  • python学习之模块--模块(二)
  • Java数据结构和算法(七)--AVL树
  • linux 获取系统时间 strftime函数格式化时间为24/12小时制
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • CentOS7 安装JDK
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git初体验
  • Java IO学习笔记一
  • Java多态
  • jquery ajax学习笔记
  • js对象的深浅拷贝
  • Laravel 实践之路: 数据库迁移与数据填充
  • Lsb图片隐写
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React-Native - 收藏集 - 掘金
  • SpiderData 2019年2月25日 DApp数据排行榜
  • tweak 支持第三方库
  • Yeoman_Bower_Grunt
  • 程序员该如何有效的找工作?
  • 分布式任务队列Celery
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何解决微信端直接跳WAP端
  • Android开发者必备:推荐一款助力开发的开源APP
  • const的用法,特别是用在函数前面与后面的区别
  • puppet连载22:define用法
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​油烟净化器电源安全,保障健康餐饮生活
  • $.proxy和$.extend
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C#)获取字符编码的类
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)基于IDEA的JAVA基础12
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .java 9 找不到符号_java找不到符号
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 命令行参数包含应用程序路径吗?
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!