博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java虚拟机学习(二)java对象的创建及访问定位
阅读量:6253 次
发布时间:2019-06-22

本文共 1446 字,大约阅读时间需要 4 分钟。

hot3.png

java对象的创建过程:

  1. 对象的创建开始

    虚拟机遇到new 关键字的时候,首先去常量池中寻找有没有这个类的符号引用,并且检查该引用的类是否已经被加载,解析,和初始化过,如果没有则会先执行该类的加载过程, 在通过检查后,虚拟机为该新生对象分配内存。

  2. 分配内存

    为对象分配内存有俩种方式: 

    一种分配方式是“指针碰撞",在内存规整的时候,已使用的内存在一侧,未使用的内存在一侧时,中间为指示器指针,这个时候的内存分配就是把指示器指针向未使用的区域移动至创建的对象大小相等的距离。

    另一种分配方式是“空闲列表”,当内存不规整时,虚拟机必须在不连续的内存空间寻找一块适合对象大小的内存区域,并使用一个列表去维护创建的每一个区域,并更新列表上的记录。

    选择那种分配方式是由堆内存是否规整决定,又由所采用的gc是否带有压缩整理功能决定。

    当面临并发时时,有可能存在,虚拟机给对象A分配内存时指针还未来得及改变,这个时候同时又有B对象使用指针来分配内存解决这个问题的两种式:

    一种是对分配内存空间的操作进行同步处理 ,虚拟机采用的CAS(见http://www.blogjava.net/xylz/archive/2010/07/04/325206.html) 和失败重试的方式保证更新操作的原子性,另一种是把内存分配的动作按照线程划分在不同的空间进行,即每一个线程都在java堆中预先分配一小块内存。又称本地线程分配缓冲(Thread Local Allocation Buffer,简称TLAB)。 TLAB用完时分配新的TLAB  时需要同步锁定操作。虚拟机设置使用TLAB,可以通过-XX:+/UseTLAB参数设定。

  3. 初始化对象内存空间

    内存分配完成之后,虚拟机对该对象分到的内存空间初始化为零值(除了对象头),如果使用了TLAB ,这一工作也可以提前至TLAB分配时进行。 初始化零值这一步也是为什么对象刚创建就可以使用的原因。

  4. 对象设置

    虚拟机对对象进行设置,比如对象是那个类的实例,对象的哈希值,gc分带年龄等,这些信息都存在对象的头之中。之后就是执行<init>方法,到此类创建结束。

java对象的内存布局

    对象在内存中分三块区域, 对象头,实例数据,对齐填充。

    java对象头部分俩个部分:一部分是用来存对象本身的运行时数据,比如:哈希code, gc分带年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳

    另一部分是类型的指针,指向类元数据,虚拟机通过这个指针确定它属于那个类的实例,查找对象的元数据信息,并不一定需要经过对象本身。

    实例数据部分是对象真正存储的有效信息,也是代码中所定义的类型的字段内容,无论是父类还是子类的都需要记录。

    对齐填充不是必然存在的,它只是起占位符的作用,HotSpot VM的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,如果不是则需要通过对齐填充来补全。

对象的访问定位:

  一种是通过句柄访问,reference中存储的是句柄地址,这种方式首先需要在java堆中划分一块内存作为句柄池,这种方法的好处是,当对象指针发生改变比如:对象被移动,这个时候reference本身不需要改变。

    另一种是直接指针访问,reference直接指向java堆中的类对象地址。对象访问在java虚拟机中很频繁,所以第一种方法会造成一定的开销成本。

 

转载于:https://my.oschina.net/u/272065/blog/506903

你可能感兴趣的文章
java 窗口最小化_Java使窗口最小化为图标
查看>>
hessian java php_hessian在PHP中的使用
查看>>
虚幻4能用java吗_如果用虚幻四引擎开发我的世界而非java 它会比现在取得更好的成绩吗?...
查看>>
JAVA常见告警怎么解决_JAVA 线上故障排查全套路
查看>>
java协程和线程_Kotlin中的线程和协程之间的区别
查看>>
微信开放平台授权java_解决微信等开放平台授权域名只能配置一个的问题
查看>>
mysql 去除a标签_CSS去除手机移动端链接标签a点击所带的背景颜色样式
查看>>
datagrid排序 java_easyUI 自定义排序datagrid
查看>>
sine之舞 java_JAVA程序实例:Sine之舞的游戏之Java版
查看>>
java实现建权授权_JAVA项目实现授权 (一)-Go语言中文社区
查看>>
java h5服务器推送事件_服务器推送事件的详细介绍
查看>>
python图像转字符画_Python 实现图片转字符画(动图也能转)
查看>>
php hash 解密,emlog使用PHP5.5自带password_hash()函数
查看>>
php让提交表单的数据保留,php基础教程--表单验证(必填、提交后数据保留)
查看>>
java类可选,类层次结构中的Java可选接口
查看>>
php 二维数组分页效率,PHP二维数组分页排序分页_PHP数组分页
查看>>
php网站开发开题报告,基于PHP的网上租车租赁网站设计与实现开题报告
查看>>
用matlab怎样表示褶积,信号的时域表示以及卷积运算(MATLAB)
查看>>
mysql 命令 字符集,MySQL字符集的设置
查看>>
php登录半透明,WordPress透明OAuth 1.0使用PHP登录
查看>>