java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java类加载

Java中什么是类加载及类加载的过程

作者:SevenCoder

Java类加载是JVM将类文件加载至内存,分加载、连接(验证/准备/解析)和初始化三阶段,本文给大家介绍Java中什么是类加载及类加载的过程,感兴趣的朋友一起看看吧

类加载指的是把类加载到 JVM 中。把二进制流存储到内存中,之后经过一番解析、处理转化成可用的 class 类

二进制流可以来源于 class 文件,或通过字节码工具生成的字节码或来自于网络。只要符合格式的二进制流,JVM 来者不拒。

虚拟机遇到⼀条 new 指令时,⾸先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。类加载过程包括了加载、连接、初始化三个阶段,其中连接还可以分为验证、准备、解析

加载

将二进制流读入内存中,生成一个 Class 对象

在加载阶段,虚拟机需要完成以下三件事情:

这个阶段既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载

验证

确保Class文件的字节流中包含的信息符合JVM规范,保证在运行后不会危害虚拟机自身的安全。即安全性检查,主要包括四种验证:

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

准备

准备阶段是正式为static 变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。

static变量在分配空间和赋值是在两个阶段完成的。分配空间在准备阶段完成,赋值在初始化阶段完成。也就是说这里给类变量设置初始值,设置的是数据类型默认的零值(如0、0L、null、false等)

解析

将常量池内的符号引用替换为直接引用的过程。符号引用用于描述目标,直接引用直接指向目标的地址。

初始化

初始化阶段会执行cinit方法来为 类变量static变量 赋上定义的值并执行类中的静态代码块;这里的赋值才是代码里面的赋值,准备阶段只是设置初始值占个坑。

在Java中对类变量进行初始值设定有两种方式:

何时进行类加载?

JVM初始化步骤?

初始化发生的时机?

概括得说,类初始化是【懒惰的】,只有当对类的主动使用的时候才会导致类的初始化

不会导致类初始化的情况?

cinit方法如果执行失败了怎么办,这个类还能用吗?

分配内存

在类加载后,接下来虚拟机将为新⽣对象分配内存。

分配在哪?

主要就是根据JVM的分配机制:对象优先分配Eden

TLAB:线程本地分配缓冲区,为每⼀个线程预先在 Eden 区分配⼀块⼉私有的缓存区域,JVM 在给线程中的对象分配内存时,⾸先在 TLAB 分配,当对象⼤于 TLAB 中的剩余内存或 TLAB 的内存已⽤尽时(或者未开启TLAB),再采⽤上述的 CAS 进⾏内存分配。默认情况TLAB仅占每个Eden区域的1%。它的主要目的是在多线程并发环境下需要进行内存分配的时候,减少线程之间对于内存分配区域的竞争,加速内存分配的速度。

为什么要CAS分配内存?

多个并发执行的线程需要创建对象、申请分配内存的时候,有可能在 Java 堆的同一个位置申请,这时就需要对拟分配的内存区域进行加锁或者采用 CAS 等操作,保证这个区域只能分配给一个线程。

JVM对象分配内存如何保证线程安全

在JVM中,为对象分配内存的过程需要确保线程安全,因为在多线程环境下,多个线程可能会同时尝试创建对象。为了保证内存分配的线程安全性,JVM采用了以下几种机制和技术:

结合:TLAB一般对年轻代的内存分配进行优化,更加局部化的内存管理有助于线程安全。
通过运用这些机制,JVM能够在多线程环境下高效而安全地进行内存分配,并最大限度地减少同步操作带来的性能损耗。这样设计不仅提升了性能,也保证了对象内存分配的安全性和一致性。

说说对象分配规则

在Java中,对象分配规则是关于如何为新对象分配内存的一套规则,以确保内存的有效使用和对象的正确初始化。以下是关于对象分配的主要规则:

这些规则确保了对象在创建时的正确初始化和内存管理。对于程序员来说,最重要的是编写好构造函数以确保对象在创建后具有合适的初始状态,并且不忘记在不再需要对象时将引用置为null,以便垃圾回收器能够回收不再使用的对象。

何时进行类卸载?

类的卸载条件很多,需要满足以下三个条件,并且满足了也不一定会被卸载:

可以通过 -Xnoclassgc 参数来控制是否对类进行卸载。

Java虚拟机将结束生命周期的几种情况?(什么情况会导致JVM退出)

到此这篇关于Java中什么是类加载?类加载的过程?的文章就介绍到这了,更多相关Java类加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文