什么是java对象
包括java的基础类型、自定义Class 定义的变量。
对象的创建过程
举个例子,Object o= new Object() 的创建过程是怎么样的呢?如下图所示。
- 首先,申请空间。
- 创建对象。
- 已创建对象地址指向变量。
对象的结构
对象的结构一般分为三部分:
- Mark World。mark wold存储了对象的锁信息,偏向锁状态,分代代年龄,Hash Code等信息。**mark code的存储的信息根据锁的状态进行调整。**如下图所示。
- 类型 指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
- 对齐部分。由于 HotSpot VM 的自动内存管理系统要求对象对象起始地址必须是8字节的整数倍,换句话说, 就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数( 1 倍 或者 2 倍), 因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
对象的内存怎么过程
如下图所示。创建对象时:
- 先判断栈空间能不能放入对象,如果可以直接放栈空间,用完直接出栈结束。
- 栈空间不够大的情况,再判Eden空间够不够大,如不够,直接放老年代,最后通过FGC 垃圾回收。
- Eden如果够大,再判断TLAB(线程本地缓存)是否够大,够大放TLAB,通过YGC垃圾回收。
- TLAB不够大,那就放Eden区,通过YGC垃圾回收。
PS:实际TLAB也是放在Eden区,只不过TLAB是线程专属的,性能更好,优先使用。
Java 对象,你Get到了吗?
大厂出题的频率非常高,动不动就来个追命7连问。。
本人能力有限,如有错误,请轻弹。。