hotspot虚拟机中,对象在内存中的布局可以分为3块区域:对象头(12字节)、实例数据和对齐填充
对象头包括两部分信息:
markword :哈希码、GC分代年龄、锁状态标志
类型指针:指向类元数据,如果对象是Java数组,还会存储数组长度Java堆参数 -Xms -Xmx
方法区大小设置 -XXPermSize -XX:MaxPermSize
-Xmn设置年轻代大小
- 类加载:把class文件加载到内存,并对数据校验、转换解析和初始化,转换成可以被虚拟机直接使用的java类型
类加载过程: - 加载,
- 连接(验证 准备(为类变量分配内存并设置初始值) 解析(符号引用替换为直接引用))
- 初始化:执行类构造器<clinit>()方法的过程,<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生,按照源文件中定义顺序初始化,且虚拟机会保证类的<clinit>()方法在多线程环境中被正确的加锁、同步
类初始化的时机:new 一个对象,读取或者设置一个类的静态字段,调用类的静态方法
java反射调用,初始化一个类的时候如果发现父类还没初始化会先触发父类初始化
虚拟机启动的时候会初始化包含main()方法的主类类加载器:实现这个动作的代码块,通过一个类的全限定名来获取描述此类的二进制字节流
启动类加载器
扩展类加载器
应用程序类加载器
双亲委派模型:如果一个类加载器收到类加载请求,首先不会自己尝试加载这个类,而是把这个请求委托给父类加载器去完成,当父类加载器反馈无法完成时,子加载器才会尝试自己去加载
Object o = new Object()过程
(1)申请一块内存,且字段赋值默认值
(2)构造方式初始化内存
(3)引用变量和对象关联
- 对象分配过程

image.png