
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了Java虚拟机的内存区域类型等内容,而本文我们就再来学习一下,Java虚拟机对象的概念与用法。
1、对象的创建
对于内存不规整的情况,容易发生指针碰撞
对于内存规整的情况,容易产生空闲列表
2、对象内存布局
对象头(MarkWord):存储对象自身的运行时数据,如哈希码,GC分带年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。
数据长度在32位和64位虚拟机中分别为32bit和64bit。另外一部分是类型指针,即对象指向它的类元数据的指针。
实例数据:真正的有效信息,定义的各种类型字段的内容,父类继承的也会记录。
对齐填充:不是必然存在的,HotSpot要求对象起始地址(对象大小)必须是8的倍数,对象头部分刚好是1倍或2倍,因此当实例数据部分没对齐时,就需要自动填充来补齐。
3、对象是否存活
引用计数法:给对象添加一个引用计数器,有一个引用加1,引用失效时减1,计数器为0则对象不再被使用。缺点无法解决循环引用的问题。
可达性分析法:通过一系列的“GCRoots”的对象作为起始点,往下搜索,当一个对象到达GCRoots没有任何引用链相连,则对象不可用,可回收。
GCRoots:
虚拟机栈(栈针中的本地变量表)中引用的对象
方法区中的类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(Native方法)引用的对象
4、对象的生或死
在可达性分析算法中的不可达对象,也不是非死不可,宣告一个对象的死亡,至少要经过两次标记过程,没有引用链的对象,
会进行一次标记并且筛选,筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者虚拟机已经执行过,
则视为没必要执行。finalize()只会被系统调用一次。对象有可能在finalize方法中被拯救。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。