类加载器--深入理解JVM内存结构,熟练GC垃圾回收机制,可以进行简单的JVM调优

本文详细阐述了Java类加载器的加载、连接(包括验证、准备和解析)、初始化过程,以及JDK默认提供的BootstrpLoader、ExtClassLoader和AppClassLoader三种类加载器的作用和职责。
摘要由CSDN通过智能技术生成

目录

类加载器的过程

1、加载

2、连接

3、初始化

类加载器的种类

类加载器的过程

1、加载

这个很简单,程序运行之前jvm会把编译完成的.class二进制文件加载到内存,供程序使用,用到的就是类加载器classLoader ,这里也可以看出java程序的运行并不是直接依靠底层的操作系统,而是基于jvm虚拟机。如果没有类加载器,java文件就只是磁盘中的一个普通文件

2、连接

连接是很重要的一步,过程比较复杂,分为三步 验证 》准备 》解析   

  验证:确保类加载的正确性。一般情况由javac编译的class文件是不会有问题的,但是可能有人的class文件是自己通过其他方式编译出来的,这就很有可能不符合jvm的编译规则,这一步就是要过滤掉这部分不合法文件 

  准备:为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,它自然会有一个初始值,比如int 类型的初始值就是0 ;boolean类型初始值为false;引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的 

  解析:把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。比如在方法A中使用方法B,

A(){B();}

这里的B()就是符号引用,初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,他就是直接引用。

3、初始化

为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程序编写者为变量分配的真正的初始值

System.out.println(System.getProperty("sun.boot.class.path")); //boot.class
System.out.println(System.getProperty("java.ext.dirs"));   //extClassLoader
System.out.println(System.getProperty("java.class.path"));//appClassLoader
类加载器的种类

JDK 默认提供了如下几种ClassLoader

1、BootstrpLoader        

BootstrpLoader是用C++语言写的,它是在Java虚拟机启动后初始化的

它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类

2、ExtClassLoader      ext下

Bootstrp loader加载完后加载ExtClassLoader,

并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

3、AppClassLoader     Java程序默认的类加载器

Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,

并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值