1、class的生命周期?
A、Loading【加载】
B、Linking【连接】:其中连接又包含了验证,准备,解析三个阶段
验证(Verification):校验装载的class文件是否符合JVM规范
准备(Preparation):将class文件的静态变量赋默认值
解析(Resolution):将类、方法、属性等符号引用解析为直接引用。对class文件常量池中各种符号引用进行解析,转成指针,偏移量等内存地址的直接引用
C、Initialization【初始化】:调用类初始化代码,给静态成员变量赋初始值
D、Using【使用】
E、Unloading【卸载】
2、请解释一下对象的创建过程?
A、class loading【加载】
B、class linking【连接:verification,preparation,Resolution】
C、class initializing【初始化】
D、申请对象内存
E、成员变量赋默认值
F、调用构造方法<init> -->成员变量顺序赋初始值,执行构造方法语句
3、对象在内存中的存储布局?
普通对象:
对象头:markword 8个字节
ClassPointer:用来说明对象属于哪个class,为4个字节
实例数据:成员变量,即对象中各个实例字段的数据
padding的对齐:8的倍数,因为是按块来读
数组对象:
对象头:markword 8个字节共计64位
ClassPointer:用来说明对象属于哪个class,为4个字节
数组长度:4字节
数组数据:
padding的对齐:8的倍数,因为是按块来读
4、对象头具体包含什么?
对象头用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等
5、GC年龄最大为15?
因为对象头*采用4个bit位来保存年龄,4个bit位能表示的最大数就是15
6、对象怎么定位?
T t = new T(); 指 t 是如何找到 T 的
句柄池:t 指向两个指针,一个指向T.class,一个指向真正的对象
直接指针:t 直接指向真正的对象,然后再继续指向T.class
7、对象怎么分配?
首先尝试在栈上进行对象分配【垃圾回收时不需要垃圾回收器回收,直接弹出即可】
如果对象太大则放入老年代,等FGC进行回收
当多个线程同时New 对象时则存储在Eden区,然后会执行GC,GC年龄到了则进入老年代,年龄不到则会重复GC的过程。
8、Object o = new Object在内存中占用多少字节?
对象头:8字节
classpointer :4字节【由于java默认使用了calssPointer压缩】
padding: 4字节
共计:8+4+4=16字节 如果没开启classpointer默认压缩,markword 8字节,classpointer 8字节,padding 0字节 也是16字节