深入Java虚拟机JVM类加载学习笔记
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及解决实际开发中的问题至关重要。 **1.1 类加载器分类** 类加载器可以分为以下几种类型: - **启动类加载器(Bootstrap ClassLoader)**:这是系统级别的类加载器,负责加载`rt.jar`等核心类库。 - **扩展类加载器(Extension ClassLoader)**:该类加载器负责加载`<JAVA_HOME>/lib/ext`目录下的类库,或者被`java.ext.dirs`系统变量所指定的路径中的所有类库。 - **应用类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(ClassPath)所指定的类。 **1.2 双亲委派模型** Java类加载器采用双亲委派模型,其流程如下: 1. 如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把请求委托给父类加载器完成。 2. 父类加载器如果无法完成加载,则会返回给子类加载器,由子类加载器尝试加载。 3. 这种机制可以确保公共类的唯一性,比如`java.lang.String`类只会有一个定义。 **1.3 自定义类加载器** 开发者也可以通过继承`java.lang.ClassLoader`类来实现自定义类加载器,从而实现特定需求下的类加载策略。 #### 二、垃圾回收(GC)机制 在Java中,垃圾回收(GC)是一种自动内存管理机制,用于自动回收不再使用的对象占用的内存空间。 **2.1 垃圾回收算法** 常见的垃圾回收算法包括: - **标记-清除算法(Mark-Sweep)**:首先标记出所有需要回收的对象,在标记完成后统一回收这些对象。 - **复制算法(Copying)**:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。 - **标记-整理算法(Mark-Compact)**:在标记阶段完成之后,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 **2.2 分代收集理论** Java的堆内存可以划分为新生代(Young Generation)和老年代(Old Generation),新生代又进一步细分为Eden区和两个Survivor区(S0/S1)。 - **年轻代GC**: 主要针对的是短生命周期的对象进行回收。 - **老年代GC**: 主要处理的是长生命周期的对象。 - **混合GC**: 同时涉及年轻代和部分老年代的回收。 **2.3 垃圾回收器** 不同的垃圾回收器具有不同的特性,适用于不同的场景: - **Serial Collector**: 单线程的垃圾回收器,适用于单核处理器。 - **Parallel Collector**: 多线程的垃圾回收器,适用于多核处理器,主要目标是提高吞吐量。 - **Concurrent Mark Sweep (CMS) Collector**: 并发标记清除算法,主要目标是尽可能地避免GC停顿时间过长。 - **G1 Collector**: 一种并行与并发的垃圾收集器,目标是在控制GC停顿时间的前提下提供高吞吐量。 #### 三、类加载过程详解 类加载的过程主要包括以下几个步骤: **3.1 加载** 在这个阶段,JVM根据类的全限定名读取对应的二进制数据流,并将其转换为JVM内部表示的`Class`对象。 **3.2 验证** 验证阶段是为了确保类文件的字节流包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 **3.3 准备** 准备阶段为类的静态变量分配内存,并设置类变量的初始值。 **3.4 解析** 解析阶段是将常量池内的符号引用替换为直接引用的过程。 **3.5 初始化** 初始化阶段是执行类构造器`<clinit>()`方法的过程。类的初始化阶段会执行类变量的初始化代码。 #### 四、实战案例分析 以下是一个简单的示例,展示了类加载器的使用情况。 ```java package test01; public class Singleton { public static Singleton singleton = new Singleton(); public static int a; public static int b = 0; private Singleton() { super(); a++; b++; } public static Singleton GetInstance() { return singleton; } } public class MyTest { public static void main(String[] args) { Singleton mysingleton = Singleton.GetInstance(); System.out.println(mysingleton.a); System.out.println(mysingleton.b); } } ``` 在这个例子中,`Singleton`类使用了静态成员变量和静态初始化器来实现单例模式。当`MyTest`类运行时,JVM会先加载`Singleton`类,并初始化其静态成员变量。由于`Singleton`类中的静态变量`singleton`已经提前实例化,因此调用`GetInstance()`方法可以直接返回已创建的实例。 通过以上内容的学习,我们可以更深入地理解Java虚拟机的类加载机制和垃圾回收机制,这对于优化Java应用程序的性能以及排查相关问题都是非常有帮助的。
- 粉丝: 25
- 资源: 128
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助