中国建设银行官网站,佛山做网站3lue,网站网上预定功能怎么做,外贸设计网站今天继续给大家分享JVM相关的知识#xff0c;欢迎互相沟通交流#xff01;
1、什么是类的加载和类的卸载
JVM虚拟机运行的文件是class文件#xff0c;它是由我们的Java程序编译后产生的文件。
类的加载#xff1a;JVM虚拟机将指定的class文件读取到内存里#xff0c;并… 今天继续给大家分享JVM相关的知识欢迎互相沟通交流
1、什么是类的加载和类的卸载
JVM虚拟机运行的文件是class文件它是由我们的Java程序编译后产生的文件。
类的加载JVM虚拟机将指定的class文件读取到内存里并解释运行该class文件里的Java程序的过程。
类的卸载将某个class文件的运行时数据从JVM虚拟机中移除的过程。
2、什么是class文件
class文件是一组以8个字节为基本单位的二进制流
各个数据项目严格按照顺序紧凑地排序在文件之中
中间没有添加任何分隔符如果当数据项需要占用8个以上字节位的时候按照高位在前的方式分割成若干个8个字节存储
数码class文件的解释运行时数据本质是C对象也叫做kclass对象这些运行时数据在JDK7之前放在永久代PermGenJDK8之后放在元空间Metaspace。
3、class类的生命周期
加载Loading、验证Verification、准备Preparation、解析Resolution、初始化Initialization、使用Using和卸载Unloading 4、类加载器的作用
类的加载指的是将类的.class文件中的二进制数据读入到内存中将其放在运行时数据区的方法区内然后在创建一个java.lang.Class对象用来封装类在方法区内的数据结构。
5、类加载器的种类 5.1、Bootstrap ClassLoader 启动类加载器
启动类加载器负责加载$JAVA_HOME中jre/lib/rt.jar里面所有的class由c实现不是classLoader子类 5.2、ExtensionClassLoader扩展类加载器
扩展类加载器由sun.misc.Launcher $ExtClassLoader实现负责加载JRE的扩展目录lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现父类加载器为null。
5.3、App ClassLoader应用类加载器
由sun.misc.Launcher $App-ClassLoader实现负记载classpath中指定的jar包以及目录中class 程序员一般会直接使用这个类加载器如果程序员没有定义自己的类加载器就作为应用程序的默认加载器。
5.4、User ClassLoader自定义类加载器
大家开发的时候其实绝大多数都是使用应用类加载器针对一些应用类加载器不能满足的情况下可以考虑使用自定义类加载器来满足实际开发的业务要求。
自定义类加载器场景
Tomcat每个WebApp有自己的ClassLoader,加载每个WebApp的ClassPath路径上的类一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader进行加载。
一些核心机密类库可以会把字节码加密这样加载类的时候就必须对字节码进行解密可以通过findClass读取URL中的字节码然后加密最后把字节数组交给defineClass()加载。
5.5、示例 public static void main(String[] args) {Test testnew Test();System.out.println(test.getClass().getClassLoader()); // 输出结果 sun.misc.Launcher$AppClassLoader18b4aac2System.out.println(test.getClass().getClassLoader().getParent()); //输出结果sun.misc.Launcher$ExtClassLoader10f87f48System.out.println(test.getClass().getClassLoader().getParent().getParent());//输出结果null 因为启动类加载器是 C/C 语言写的所以输出为 nullSystem.out.println();
}