对象的创建
虚拟机在遇到一条new指令时,首先去检查这条指令的参数能否在常量池中定位到一个类的符号引用,并检查该类是否被加载过。如果没有,先执行类加载的过程。
类加载检查完成之后,接下来虚拟机为新生对象分配内存。对象所需要的内存大小在类加载完成之后就可以完全确定,为对象分配内存的任务等同于把一块大小确定的内存从Java堆中划分出来。假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲空间那边挪动一段与对象大小相等的距离。
除了如何划分可用空间之外,还有另一个需要考虑到的问题是对象创建是十分频繁的行为,即使是仅仅修改一个指针指向的位置,在并发情况下也不是线程安全的。解决这个问题有两种方案。第一中是:实际上虚拟机采用CAS配上失败重试的方式保证操作的原子性。第二种是为每个线程在Java堆中预先分配一快内存,称为本地线程分配缓冲。
内存分配完成之后,虚拟机需要将分配到的内存空间都初始化为零。这步操作保证了对象的实例字段在Java代码中可以不赋予初值就可以直接使用。
接下来,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象的哈希码,对象的GC分代年龄信息。这些信息存放在对象的对象头中。
在上面工作完成之后,从虚拟机的角度来看,一个新的对象已经产生了,但是,从Java程序的角度来看,对象创建才刚刚开始-----<init>方法还没有执行,所有的字段还都是零。所以,一般来说,执行new方法之后,就会紧接着执行<init>方法,把对象按照程序员的一员进行初始化,这样一个真正可以使用的对象才算完全产生出来。
分享到:
相关推荐
资源描述: 1.HotSpot虚拟机对象探秘-xmind脑图pdf 2.资源内容:HotSpot虚拟机对象探秘 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开
对象的创建加载:先去检测new指令能否再常量池中定位到一个类的符号引用,如果未被加载、解析、初始化过 执行相应的类加载过程分配内存: 为对象分配空间时采用指针碰
【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序
JDK7底层C++源码及hotspot虚拟机源码
包含参数如下: 1. 内存管理参数 2. 及时编译参数 3. 类型加载参数 4. 多线程相关参数‘ 5. 性能参数 6. 调试参数
JDK10(JDK10底层C++源码及hotspot虚拟机源码)
JDK9源码(底层C++源码及hotspot虚拟机源码)
JDK6底层C++源码及hotspot虚拟机源码
JVM详细的知识点总结,思维导图 1.类加载器子系统 2.Hotspot的内存详情 3.HotSpot虚拟机对象探秘 4.垃圾收集器
Java_HotSpot虚拟机的内存管理.pdf
JVM,JVM内存结构、HotSpot 虚拟机对象探秘、垃圾收集策略与算法、HotSpot 垃圾收集器、内存分配与回收策略、JVM 性能调优、类文件结构。。
编译好的dll文件,hotspot虚拟机插件,反汇编jit编译代码
2.3 HotSpot虚拟机对象探秘 2.3.1 对象的创建 2.3.2 对象的内存布局 2.3.3 对象的访问定位 2.4 实战:OutOfMemoryError异常 2.4.1 Java堆溢出 2.4.2 虚拟机栈和本地方法栈溢出 2.4.3 方法区和运行时常量池...
NULL 博文链接:https://caoxudong818.iteye.com/blog/1214133
HotSpot正是目前世界上java虚拟机的最好的实现。 HotSpot的基础代码是许多人辛勤劳动的结晶,这个过程迄今已持续了超过10年的时间(当然时间长并不意味着一定好,一半一半吧)。所以到现在为止,他的体积是很大的。...
本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...
HotSpot虚拟机的概况文档 *每一个java对象都是一个潜在的monitor(监视器) >synchronized 关键字 *所有现代JVM虚拟机都包含light-weight锁 >避免关联一个系统互斥信号量或者每个对象的条件变量(heavy-weight...
关于java虚拟机的详细解析,从内存分析到垃圾回收算法,hotspot虚拟机回收机制的详细分析,欢迎下载!
JVM 内存区域JVM 内存区域JVM 运行时内存划分程序计数器Java虚拟机栈本地方法栈方法区运行时常量池直接内存HotSpot 虚拟机对象揭秘对象的创建对象