为什么80%的码农都做不了架构师?>>>   

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把 Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。   JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有 java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加 载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的 类),ApplicationClassLoader负责加载应用程序自身的类。   当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该 ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用 ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的 加载流程。   注: 学ClassLoader看OSGI

什么时候加载类?

   什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用ApplicationClassLoader加 载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这 个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。   Why use your own ClassLoader?   似乎JVM自身的ClassLoader已经足够了,为什么我们还需要创建自己的ClassLoader呢?   因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,如果编写你自己的ClassLoader,你可以做到:   1)在执行非置信代码之前,自动验证数字签名   2)动态地创建符合用户特定需要的定制化构建类   3)从特定的场所取得java class,例如数据库中   4) 等等   事实上当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息。   目前的应用服务器大都使用了ClassLoader技术,即使你不需要创建自己的ClassLoader,了解其原理也有助于更好地部署自己的应用。

类加载器的树状结构 & 委托代理模式

   当你决定创建你自己的ClassLoader时,需要继承java.lang.ClassLoader或者它的子类。在实例化每个 ClassLoader对象时,需要指定一个父对象;如果没有指定的话,系统自动指定 ClassLoader.getSystemClassLoader()为父对象。   所以当创建自己的Class Loader时,只需要重载findClass()这个方法。

卸载? 重载?

   当一个javaclass被加载到JVM之后,它有没有可能被卸载呢?我们知道Win32有FreeLibrary()函数,Posix有 dlclose()函数可以被调用来卸载指定的动态连接库,但是Java并没有提供一个UnloadClass()的方法来卸载指定的类。   在Java中,java class的卸载仅仅是一种对系统的优化,有助于减少应用对内存的占用。既然是一种优化方法,那么就完全是JVM自行决定如何实现,对Java开发人员来 说是完全透明的。   在什么时候一个java class/interface会被卸载呢?Sun公司的原话是这么说的:"class or interfacemay be unloaded if and only if its class loader is unreachable. Classesloaded by the bootstrap loader may not be unloaded."   事实上我们关心的不是如何卸载类的,我们关心的是如何更新已经被加载了的类从而更新应用的功能。JSP则是一个非常典型的例子,如果一个JSP文件被 更改了,应用服务器则需要把更改后的JSP重新编译,然后加载新生成的类来响应后继的请求。   其实一个已经加载的类是无法被更新的,如果你试图用同一个ClassLoader再次加载同一 个类,就会得到异常(java.lang.LinkageError: duplicate classdefinition),我们只能够重新创建一个新的ClassLoader实例来再次加载新类。至于原来已经加载的类,开发人员不必去管它, 因为它可能还有实例正在被使用,只要相关的实例都被内存回收了,那么JVM就会在适当的时候把不会再使用的类卸载。   使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.   典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.   大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。   当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个, 防止因为不同的类加载器, 导致类型转换异常(ClassCastException).

转载于:https://my.oschina.net/u/1778309/blog/298579

ClassLoader 初步相关推荐

  1. java中execution的作用_一文初步了解Java虚拟机

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...

  2. ClassLoader(二)- 加载过程

    本文源代码在Github. 本文仅为个人笔记,不应作为权威参考. 原文 在前一篇文章初步了解ClassLoader里提到了委托模型(又称双亲委派模型),解释了ClassLoader hierarchy ...

  3. Arthas 初探--安装初步适用

    作者 | agmtopy [Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿] 由于在项目中遇到一种情况,某段代码在进行单元测试和在 tomcat 容器中运行的性能相差数百倍,因此需要 ...

  4. [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib

    转载自http://www.iteye.com/topic/98178 一.Java ClassLoader 1,什么是ClassLoader  与 C 或 C++ 编写的程序不同,Java 程序并不 ...

  5. Java 反射 (Class、ClassLoader、Constructor、Method、Field)

    反射是Java中一个非常重要.非常强大的机制.曾看到一句话"反射是框架的灵魂",初学时不懂,等到学完框架之后才慢慢理解其意. 什么是反射?我们先通过几个类和示例来初步体会一下反射. ...

  6. 转载:使用 frida hook 插件化 apk ( classloader )

    使用 frida hook 插件化 apk:https://bbs.pediy.com/thread-258772.htm 最近拿到一个XX视频apk样本,里面有视频.直播和小说,没有VIP只能试看3 ...

  7. SkyWalking调研与初步实践

    APM和调用链跟踪 随着企业经营规模的扩大,以及对内快速诊断效率和对外SLA(服务品质协议,service-level agreement)的追求,对于业务系统的掌控度的要求越来越高,主要体现在: 对 ...

  8. TensorRT 7.2.1开发初步

    TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...

  9. SOC,System on-a-Chip技术初步

    SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...

最新文章

  1. canvas做一个简单气泡图
  2. 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程
  3. 查看Eclipse中的jar包的源代码:jd-gui.exe
  4. [vue] watch的属性用箭头函数定义结果会怎么样?
  5. 微信获取位置 转化为 高德地图 位置 地址
  6. 教师资格证综合素质思维导图
  7. CenterOS防火墙操作
  8. junetxtdb.class.php,PHP-site
  9. C# 使用同余代换简化多个大数相乘取模运算
  10. 【Git入门之十四】Git GUI
  11. 【静脉检测】基于matlab手指静脉图像检测【含Matlab源码 1654期】
  12. Ubuntu解决火狐浏览器无法同步书签的问题
  13. cryptojs php 互通_AES 加密解密 CryptoJS + php 方案
  14. CSA发布云控制矩阵3.0版
  15. 17岁韩寒在CCTV《对话》舌战群吊的视频
  16. 编制现金流量表3个步骤!
  17. Android 11版本号仍有甜点名称 只是不再公开:红丝绒蛋糕
  18. 无线网络性能测试 软件,WiFi性能测试
  19. 游戏产业链:游戏引擎
  20. 机器学习基础整理(第2章) - 模式分类

热门文章

  1. python 参数解析器_Python参数解析器,在h之前引发异常
  2. sparkstreaming监听hdfs目录如何终止_Spark笔试题:Spark Streaming 反压机制
  3. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...
  4. 二叉树的层序遍历 使用队列和不使用队列
  5. 【Linux】26.VScode安装、插件、快捷键等基本用法
  6. 【Socket网络编程】1.bind()和 INADDR_ANY 解析
  7. 从脸部识别到火星机器人,正在改变世界的计算机视觉
  8. Python-OpenCV 处理图像(八):图像二值化处理
  9. java中的工厂模式
  10. Python打开文件,将list、numpy数组内容写入txt文件中