学会本篇,还怕没对象吗?
对象创建的流程 1、检查类加载检查,主要是此对象是否被加载过,检查对象是否有符号引用
2、分配内存在堆中给对象分配内存。分配内存有两种方式:指针碰撞和空闲列表。使用哪种方式主要取决于Java内存是否规整。指针碰撞适用于内存规整,空闲列表适用于内存不规整。
出个问题考考你:Java内存是否规整和什么有关
答案:垃圾回收算法,不清楚的可以去回顾一下jvm垃圾回收相关知识。
3、设置零值保证对象实例字段在不初始化时就可以直接使用可以得到字段的类型。
4、设置对象头详细可以查看对象头的作用。如:对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。我们都知道在锁升级时,对象头的状态也都是不一样的,这就很关键。
5、初始化从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始。对象根据我们写的程序进行init
类加载的流程 加载 类加载时主要完成这三件事- 通过全类名获取定义此类的二进制字节流
- 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
- 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
- 启动类加载器(bootstrap class loader)加载Java核心类
- 扩展类加载器(extensions class loader)加载JRE的扩展目录
- 系统类加载器(system class loader)加载当前应用 classpath下的类
原理:首先会把该请求委派给父类加载器处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。
简单来说,比如我们新建Object这个类,但我们在加载的时候只用到启动类加载器加载的Object,而不是系统类加载器加载的Object。
好处:防止核心API库被随意篡改;避免类的重复加载
链接 验证以上图片引用自javaGuide
准备在方法区准备类变量(被static修饰)的内存以及设置变量的初始值。
解析虚拟机将常量池内的符号引用替换为直接引用的过程
初始化执行clinit方法
类被GC的条件需同时满足:
- 无此类的实例
- 无此类的引用
- 此类的类加载器实例被回收
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)