创建一个对象的过程
首先检查该对象及父类是否有被类加载器加载(类型引用),如果没有先加载。第二步 分配内存空间,再初始化变量赋零值,第三步创建对象头(哈希码、GC 信息、锁信息、类元信息) 第四步初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。
对象的内存布局
对象头,实例数据,对其填充
对象头有mark_down(哈希码,GC、锁、类元信息),类型指针即对象指向他的类元数据指针
HotSpot 虚拟机要求对象的起始地址必须是8的整数倍,因此需要对齐填充
如何判断对象为垃圾
引用计数法,可达性分析
每次引用加1,引用失效减1但是无法解决引用循环
GCroot 根对象作为起始节点根据引用关系向下搜索。没有搜索到的对象作为垃圾对象。根对象可以为栈的引用对象和静态变量引用对象和常量的引用对象。
类加载过程
加载,1.通过全类名获取类的二进制字节流.
2.将类的静态存储结构转化为方法区的运行时数据结构。
3.在内存中生成类的Class对象,作为方法区数据的入口)
验证,文件格式,字节码,符号引用等验证正确性
准备,为类变量分配内存设置0值
解析,将符号引用转化为直接引用
初始化 方法 为静态变量赋值初始化