【JVM】【类加载器】【总结】

概念

  1. 加载class文件的字节内容,转换为虚拟机可识别的内容;
  2. 类的加载是动态的,即在运行时需要的时候才会被加载;
  3. 对于hotshot虚拟机,加载class文件字节流到方法区,同时在方法去创建一个class对象,这个对象作为类对象访问的入口;
  4. 类唯一性:同一个类只有被同一个类加载器加载了,这两个类才算相等;每一个类加载器,都有一个独立的类名称空间,彼此相互隔离,互补干涉;
  5. 当加载器需要加载一个类时候,先看自己类名称空间是否有该class对象,如果没有则加载,否则不会再加载;因此,如果不同的几个类加载器,去加载同一份CLASS文件,那么每个类加载器空间都有一份这样的class文件;
  6. 类加载器具体内容如双亲委派机制等都是在ClassLoader里面具体实现的。例如loadclass函数里面就是双亲委培具体实现,findclass实在loaderclass无法加载到时候在执行此函数。因此,我们如果想破坏双亲委派就可以重写loadclass函数。总之,只要在loaderclass里面返回class对象就可以。可以查看自己GitHub的codedemo关于加载器实现。

用途

实现原理:两相同

同一个类若被同一个类加载器加载过,则不加载,反之加载;因此,可使同一个类被多个不同加载器类实现各种扩展;

案例

  1. 功能测试:若业务系统对同一个功能开发多个版本jar文件,此时并行测试,可用多个不同类加载器去加载不同版本的jar(虽然里面的类名称、包名全部相同),然后利用反射,这样很容易的实现同一个类文件不同版本的并行测试;
  2. OSGI:eclipse插件就是给予这样实现。不同模块叫做bundle,每个bundler都有自己唯一的类加载器,彼此相互隔离;目前使用的较少。关于OSGI可以参考OSGI文章
  3. 热部署:不停止服务,动态替换目标文件。实现原理是,实时监控某一目标类文件,当文件发生修改的时候,新创建一个类加载器去加载他即可。虽然之前这个类已经被加载运行,如果此时用上次的类加载器去加载变化的类,因为,符合“两相同”原则,那么JVM就认为类已经被加载过了,就不会再去加载了,因此,创建新的类加载器对象,此时类空间内容是空的,就可以重新去加载这个类文件;从而实现热部署的功能;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值