JVM常考面试题

本文深入探讨Java对象的创建过程,包括类加载的详细步骤,从字节流到运行时数据结构的转换。同时,介绍了对象在内存中的布局,包括对象头、实例数据和对齐填充。此外,阐述了垃圾收集的两种主要方法——引用计数法和可达性分析,以及GCRoots在判断对象是否为垃圾中的作用。通过对Java内存管理的理解,有助于优化程序性能。
摘要由CSDN通过智能技术生成

创建一个对象的过程

首先检查该对象及父类是否有被类加载器加载(类型引用),如果没有先加载。第二步 分配内存空间,再初始化变量赋零值,第三步创建对象头(哈希码、GC 信息、锁信息、类元信息) 第四步初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

对象的内存布局

对象头,实例数据,对其填充
对象头有mark_down(哈希码,GC、锁、类元信息),类型指针即对象指向他的类元数据指针
HotSpot 虚拟机要求对象的起始地址必须是8的整数倍,因此需要对齐填充

如何判断对象为垃圾

引用计数法,可达性分析
每次引用加1,引用失效减1但是无法解决引用循环
GCroot 根对象作为起始节点根据引用关系向下搜索。没有搜索到的对象作为垃圾对象。根对象可以为栈的引用对象和静态变量引用对象和常量的引用对象。

类加载过程

加载,1.通过全类名获取类的二进制字节流.
2.将类的静态存储结构转化为方法区的运行时数据结构。
3.在内存中生成类的Class对象,作为方法区数据的入口)
验证,文件格式,字节码,符号引用等验证正确性
准备,为类变量分配内存设置0值
解析,将符号引用转化为直接引用
初始化 方法 为静态变量赋值初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值