你不知道的Java对象

什么是java对象

包括java的基础类型、自定义Class 定义的变量。

对象的创建过程

举个例子,Object o= new Object() 的创建过程是怎么样的呢?如下图所示。

  1. 首先,申请空间。
  2. 创建对象。
  3. 已创建对象地址指向变量。

举个例子,Object  o= new Object();

对象的结构

对象的结构一般分为三部分:

  1. Mark World。mark wold存储了对象的锁信息,偏向锁状态,分代代年龄,Hash Code等信息。**mark code的存储的信息根据锁的状态进行调整。**如下图所示。
    在这里插入图片描述
  2. 类型 指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
  3. 对齐部分。由于 HotSpot VM 的自动内存管理系统要求对象对象起始地址必须是8字节的整数倍,换句话说, 就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数( 1 倍 或者 2 倍), 因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

对象的内存怎么过程

如下图所示。创建对象时:

  1. 先判断栈空间能不能放入对象,如果可以直接放栈空间,用完直接出栈结束。
  2. 栈空间不够大的情况,再判Eden空间够不够大,如不够,直接放老年代,最后通过FGC 垃圾回收。
  3. Eden如果够大,再判断TLAB(线程本地缓存)是否够大,够大放TLAB,通过YGC垃圾回收。
  4. TLAB不够大,那就放Eden区,通过YGC垃圾回收。

PS:实际TLAB也是放在Eden区,只不过TLAB是线程专属的,性能更好,优先使用。

在这里插入图片描述

Java 对象,你Get到了吗?

大厂出题的频率非常高,动不动就来个追命7连问。。

本人能力有限,如有错误,请轻弹。。

发布了27 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/richyliu44/article/details/105305380