中国设计网站推荐,tk域名官方网站,石家庄网络平台推广,购物网站开发需求分析今天给大家分享JVM系列之双亲委派机制相关的知识。 1、Java类加载的过程
Java类的加载过程是动态的#xff0c;它不会一次性把程序所有的类全部加载后再运行#xff0c;而是先保障程序运行的基础类加载到JVM虚拟机当中#xff0c;其他的类#xff0c;一般是再需要的时候才…
今天给大家分享JVM系列之双亲委派机制相关的知识。 1、Java类加载的过程
Java类的加载过程是动态的它不会一次性把程序所有的类全部加载后再运行而是先保障程序运行的基础类加载到JVM虚拟机当中其他的类一般是再需要的时候才会去加载这样的运行机制也达到了节约内存的目的。
当JVM虚拟机加载某个class文件的时候采用的是双亲委派模式任务委派模式就是将请求交给父类去处理。
2、类装载的方式
隐式装载程序在运行过程中当碰到通过new 等方式生成对象时隐式调用类装载器加载对应的类到JVM中。
显式装载通过class.forName()等方法显式加载需要的类
3、双亲委派机制的概念
双亲委派机制是指当一个类加载器收到某个类加载请求时该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此它会先委托父类加载器在自己的搜索范围内找不到对应的类时该类加载器才会尝试自己去加载。
4、双亲委派模式的工作流程 Application ClassLoader 收到一个类加载请求时首先它自己不会先去尝试加载这个类而是先将这个加载请求委派给父类加载器Extension ClassLoader去加载。
如果Extension ClassLoader收到一个类加载请求时先将加载请求委派给父类加载器Bootstrap ClassLoader去完成。
如果Bootstrap ClassLoader加载失败(在JAVA_HOME\lib中未找到所需类)就会让Extension ClassLoader尝试加载如果加载成功了就不再让Extension ClassLoader加载过程结束。
如果Extension ClassLoader也加载失败就会使用Application ClassLoader加载如果加载成功了就不再让Application ClassLoader加载过程结束。
如果Application ClassLoader也加载失败就会使用自定义加载器去尝试加载。
如果所有的加载都失败了就会抛出ClassNotFoundException异常。
理解执行的情况都是由Bootstrap ClassLoader先加载失败了轮到Extension ClassLoader加载再失败了轮到Application ClassLoader最后轮到自定义加载器加载。一般情况下大家写的java程序都是Application ClassLoader进行加载的。
5、双亲委派模型的核心代码 protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) {// 首先检查这类是否已经被加载过了Class? c findLoadedClass(name);if (c null) {long t0 System.nanoTime();try {if (parent ! null) {//如果存在父类加载器则取找该类的父类加载器c parent.loadClass(name, false);} else {//返回由引导类加载器加载的类如果未找到则返回 null。c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 如果父类加载器抛出ClassNotFoundException异常// 则说明父类加载器无法完成加载请求}if (c null) {// 在父类加载器无法加载时// 再调用本身的findClass方法来进行加载long t1 System.nanoTime();c findClass(name);// 这是定义类加载器记录统计数据sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}6、双亲委派机制的作用
防止加载同一个class文件。通过委托的方式去询问父级是否已经加载过该class如果加载过了就不需要重新加载。从而保证了数据安全。
通过委托的方式保证Java核心class不被篡改即使被篡改也不会被加载即使被加载也不会是同一个class对象因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。