读书笔记jvm探秘之二: 对象创建
来源:互联网 发布:手机oa软件 编辑:程序博客网 时间:2024/05/19 17:26
对象如何被创建?
首先一句简单的NEW语句,比如:StringBuffer string = new StringBuffer("abcd!"); 假设这句话在主线程里(主方法线程),那么JVM会在常量池中定位这个类的引用符号,看看这个类在方法区中是否被加载,如果没有就去加载这个类,接下来,在堆中寻找是否有值为“abcd!”的StringBuffer类的实例,如果有就直接让虚拟机栈中的引用(这个引用就是string)指向这块区域,没有的话就要在堆中分配内存了,用以存储对象实例,如何分配内存呢?那就要看堆是怎么存储数据的了,如果堆是很零散的存放数据(这样会产生很多内存碎片),为了保证分配内存成功,不排除会移动堆中数据的可能,这些都通过一张“空闲列表”来记录;如果堆是很整齐的存放数据,那么只需移动分界指针就够了;貌似第一种存储方式是常用的。内存分配好了就需要初始化数据,JVM会默认把所有数据变成各个类型的默认值。最后才会用构造方法再赋一遍初值。如果对多线程理解较深的人,会发现如果不对内存分配进行一些设置会产生同步问题,这里不做记录。
对象的内存布局:
对象的内存布局可分为三块区域,对象头、实例数据、对齐填充。
对象头包括两部分,第一部分存储运行时数据、哈希吗、锁状态等必备数据,第二部分存放指向该类元数据(方法区中)的类型指针。
实例数据,对象实例中存储的有效信息,成员体的值。
对齐填充,这个没什么,只是由于JVM的某些规则所引起的。
对象的访问定位:
在虚拟机栈的栈顶帧中,会为方法中的每个对象创建一个引用,对象就是通过引用来定位到堆中的实例的,堆中不会有同一个类的相同实例数据,也就说如果两个对象的内容完全一样,那么他们的引用也是相等的(指向同一块内存),改变对象,有时候可能仅仅是改变引用的位置(当堆中存在改变后的实例时)
- 读书笔记jvm探秘之二: 对象创建
- jvm探秘二:对象的创建
- 读书笔记JVM探秘之三:Class文件
- JVM(二):HotSpot虚拟机对象探秘
- 读书笔记JVM探秘之四:类加载器
- 读书笔记JVM探秘之六:编译器的那些事儿
- JVM对象探秘
- Jvm对象探秘
- JVM学习笔记(二)HotSpot虚拟机对象探秘
- JVM读书笔记之对象访问
- JVM探秘之GC
- JVM学习笔记-对象探秘
- jvm 之 对象的创建
- jvm之对象的创建
- JVM之对象创建过程
- 读书笔记jvm探秘之一:内存概况
- jvm读书笔记之对象是否存活
- JVM之旅--GC探秘
- 2016这些Android技术会很火
- opencv使用日记之一:平台搭建Mat类以及图像的读取修改
- Java中23中设计模式
- 读书笔记jvm探秘之一:内存概况
- 通过使用Byte Buddy,便捷地创建Java Agent
- 读书笔记jvm探秘之二: 对象创建
- jvm探秘之三:GC初步
- spring入门之ContextLoadListener
- 快速排序算法(C)
- 二叉排序树第一版
- 关于C、内存、栈的一些杂谈
- 斯坦福大学机器学习公开课, 梯度下降算法,随机梯度下降算法,最小二乘拟合法总结以及证明
- 平衡二叉树+树的旋转
- 程序的性能优化之代码上的细节优化