博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所理解的JVM(四):对象的创建、布局、访问和销毁
阅读量:5821 次
发布时间:2019-06-18

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

hot3.png

一、对象的创建过程

  1. 定位到方法区常量池的类,检查类是否已经被加载、验证、准备、解析。
  2. 检查类是否已经进行过初始化。
  3. 在内存中分配空间
  4. 设置对象的默认初始值(0,false,null)
  5. 执行<clint>()方法(类变量的赋值和静态代码块)
  6. 执行构造
  7. 在线程栈中设置对象引用

二、 对象在内存中的布局

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

  每一个堆中的对象在HosPost虚拟机中都有一个对象头(ObjectHeader),对象头里存储两部分信息:一部分是运行时对象自身的哈希码值(HashCode)、GC分代年龄(Generational GC Age)、锁标志位(占用2个bit的位置)等信息,另一部分是指向方法去中的类型信息的指针。如果是数组对象的话,还会有额外一部分用来存储数组长度。

  实例数据是程序代码中定义的各种类型的字段内容。

  对齐填充并不是必然存在的,仅仅在对象的大小不是8字节的整数倍时起占位符的作用。

三、对象的访问方式:1,句柄;2,直接指针

  句柄:java堆中划出一块空间单独存放句柄池,java栈中的reference指向句柄池中的某个句柄,句柄包含两部分信息:堆中实例对象地址和方法区中对象类型信息。

  直接指针:java栈中的reference指向java堆中的实例对象,每个实例对象上有一部分信息是用来指向该对象在方法区中的类型信息。

  句柄的优势:当对象发生改变时,reference的值不用变,只需要改变句柄的实例指针,reference自身不需要改变。

  直接指针的优势:节省了一次指针定位的开销,速度更快。

  HosPot虚拟机采用第二种方式。

四、对象完成使命后,等待GC进行垃圾回收。销毁对象即清理对象所占用的内存空间,会调用对象的finalize()方法。

注意

  1,在类进行初始化的时候,静态代码块与静态变量的赋值的顺序是按照程序员编写的顺序执行的;
  2,在创建对象的<clint>(),是按照程序员编写的代码块和成员变量的赋值的顺序执行的。

下面的例子,创建后的对象的属性a=22,类属性TEST_STATIC=11.

public static class TestStaticInit{        static{            TEST_STATIC = 1;        }        public static int TEST_STATIC = 11;        {            a = 2;        }        public int a = 22;    }

参考资料:

  1. 《深入理解Java虚拟机》

转载于:https://my.oschina.net/u/3466682/blog/1571525

你可能感兴趣的文章
Java中的volatile关键字
查看>>
五种开源协议(GPL,LGPL,BSD,MIT,Apache)
查看>>
1-4标签的语法
查看>>
Helloworld模块之内核makefile详解
查看>>
UITextView in iOS7 doesn&#39;t scroll
查看>>
Memcached
查看>>
Solr系列二:Solr与mmseg4j的整合
查看>>
WinSock2编程之打造完整的SOCKET池 (转)
查看>>
Oracle系列:记录Record
查看>>
亚信笔试题
查看>>
Eclipse选中变量名,相同变量都变色显示
查看>>
转: 如何选CDN:互联网大直播时代的CDN选择指南
查看>>
MySQL 基本命令
查看>>
OpenStack网络指导手册 -基本网络概念
查看>>
Nagios
查看>>
html5 的localstorage
查看>>
Android笔记——UI开发
查看>>
linux-文件系统基本概念
查看>>
git-【一】概述安装
查看>>
Maven插件maven-antrun-plugin的使用
查看>>