目录
创建对象的过程

**1.类加载检查:**在一个对象被创建时,jvm会检查这个对象的类是否被加载加载过,如果没有被加载过则需要加载一次类之后,才能进行后面的步骤
2.分配内存: 进行类加载检查通过过后,jvm会为新对象分配一个从类加载过程中知道的合适的内存,把一块相应的内存从java堆里分出来
3.初始化零值: 在分配内存后,jvm会给内存空间初始化零值(不包括对象头),保证了对象的实例字段一开始不用赋值也能使用
**4.必要设置:**初始化过后虚拟机JVM会对对象进行必要设置,比如设置对象头,锁一类的属性
**5.执行init构造函数:**经过init构造函数后才能把对象从初始化的零值改成我们想要的内容
对象的生命周期
创建:在new之后,JVM为对象分配内存,初始化,设置对象头等操作,完成实例化
调用:对象被引用访问其属性,方法
销毁:当对象不再被引用,垃圾回收机制会自动回收对象所占空间,释放空间销毁对象
类加载器有哪些?
类加载器:把xxx.class加载进入JVM使其成为能被JVM识别的 java.lang.Class 对象。

启动类加载器 (Bootstrap Class Loader):最顶层的加载器,负责加载Java的底层类如JVM中的java.util.*,由于Java层没有直接的ClassLoader 对象(通过 getClassLoader() 获取时返回 null)。
扩展类加载器/平台类加载器
扩展类加载器(Java8及以前) Extension Class Loader: 负责加载 jre/lib/ext 或由 java.ext.dirs 系统属性指定目录下的 jar 包和类库。
替换为平台类加载器(Java9及以后) Platform Class Loader: jre/lib/ext 目录和 java.ext.dirs 属性都已被移除。平台类加载器负责加载 JDK 中一些除核心模块外的平台类(如 java.sql、java.xml 等)。
在 Java 层面,它的 parent 字段实际为 null,但在委派逻辑上仍会先交给 Bootstrap ClassLoader 处理。
**应用程序类加载器(Application ClassLoader):**负责加载代码的类,可以通过ClassLoader.getSystemClassLoader()获取,其父加载器是Platform Class Loader (Java8后),之前是Extention Class Loader
自定义类加载器(Custom Class Loader):开发者可以根据需求定制类的加载方式,比如从网络加载 class 文件、数据库、甚至是加密的文件中加载类等。自定义类加载器可以用来扩展 Java 应用程序的灵活性和安全性,是 Java 动态性的一个重要体现。
双亲委派模型
有了上述这些加载器关系,就形成了双亲委派模型,核心思想就是当加载器收到一个类加载请求时,不会自己先去加载,而是先给父类加载器完成,只有当父类加载器完成不了时才会给本身加载每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。