java小易——java类加载器

类加载器

类加载器负责加载所有的类,所有被载入内存中的类生成一个java.lang.Class实例对象。

ClassLoader分为4种:Jvm根类加载器(BootstarpClassLoader),Jvm扩展类加载器(extension ClassLoader),系统类加载器(SystemClassLoader),自定义类加载器(AppClassLoader)

=>Jvm根类加载器:它用来加载 Java 的核心类,是用原生代码来实现的,并不继承自 java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类)。

=>Jvm扩展类加载器:它负责加载JRE的扩展目录,lib/ext目录中的JAR包的类。

=>系统类加载器:它负责在JVM启动时加载来自Java命令的-classpath选项

=>自定义类加载器:继承官方提供的ClassLoader类的自定义,实现加载器class文件。

类加载机制:

JVM的类加载机制主要有如下3种。

全盘负责:所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。
**双亲委派:**在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成加载时,才自己去加载。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hwGUDHVf-1595772286364)(F:\A——java学习库\java笔记图片库\类加载机制.png)]

缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。这就是为什么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因。

加载过程:

1)加载过程:(类加载器做)

  • 先找到.class文件,
  • 再将.class文件转为byte[],
  • 将byte[]放在方法区中。
  • 一个类被编辑成了一个二进制的byte文件,使用流过程,读取到ClassLoader一般来说。是自己创建的一个ClassLoder读取了这个文件以后,由于里面的内容符合java类型的定义(同时符合定义的还有.jar文件),所以,ClassLoader可以找到这个文件中描述类格式的类信息。当ClassLoaer读取到类信息了以后,ClassLoader就知道了我要如何去拆分这个类了,里面有多少属性,常量,以及方法和方法的格式(参数个数,参数顺序,返回值类型,引用名称)

2)链接:将类型一个一个拆开打散重新翻译(运行时的翻译)保存到内存中

  1. 验证:通过类信息描述,来验证当前的JVM内存中所具有的元素,是不是可以支撑这个类型的创建,所有的方法只是一个流程,并不能真正的执行,所以JVM会将这个流程记录在方法区。

  2. 初始化:初始化static代码块,静态变量,静态方法,将它们放在元数据区,(1.8以前是在永久代,1.8开始后在元数据区),元数据区不存在溢出,当需要初始化内容的时候(static)会初始化,并将内容放在常量池中,对应的static方法会被保存在对应的方法区中。不初始化动态方法,但是会将内容分割开来,放在相对应的方法区里

    动可调静,静不可调动,静态是在初始化时加载的,动态是在使用过程 记载的

3)使用:分成创建对象并使用,和直接使用。如果创建对象并使用,那么这个方法就是一个动态的方法,那么方法的起始点是从栈起始的(所有方法的起始是,main 这个方法。也就是说 当前的线程中所具有的所有的方法属性都是因为main 这个方法被加载到栈帧中,然后调用了栈帧中的操作数过程,调用了其他方法,那么就会生成新的栈帧,就会先执行。得到结果之后,之前的栈帧在执行)。

4)回收:gc(垃圾回收机制):当你内存不够用或是手动触发了垃圾回收的时候,垃圾处理器就会将目前存在内存空间的这些对象回收。

4种引用回收过程,虚引用,强引用,弱引用和软引用,现在基本用的是强引用。

讨论弱引用和软引用,在特殊情况下,这两种会被gc所收回。

5)卸载

静态资源在JDK1.8之前与JDK1.8之后放在哪里?

​ 因为jdk1.8之前静态资源放入永久代(在jvm的内存),jdk1.8之后静态资源放入元数据区(在物理内存当中),一般不存在溢出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值