JavaDay02 类加载器、双亲委托机制、字节码验证、垃圾回收

JavaDay02

1. 描述类加载器的种类

(1)启动类加载器(Bootstrap ClassLoader)
Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用;这个类加载器负责放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中。
(2)扩展类加载器(Extensions ClassLoader)
这个类加载器负责JAVA_HOME的lib目录中的ext,或者java.ext.dirs系统变量所指定的路径中的所有类库。用户可以直接使用。
(3)应用程序类加载器 Application ClassLoader
应用类加载器是ClassLoader中getSystemClassLoader()方法的返回值。它负责用户路径(CLASSPATH)所指定的类库。用户可以直接使用。如果用户没有自己定义类加载器,默认使用这个。
(4)自定义类加载器 Customer ClassLoader
用户自己定义的类加载器。也就是自己去写一个继承java.lang.ClassLoader这个类。

2. 简述双亲委任机制

双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。
双亲委派模型工作流程:

  1. 当Application ClassLoader收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。
  2. 当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成。
  3. 如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。
  4. 如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。
  5. 如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。
  6. 如果均加载失败,就会抛出ClassNotFoundException异常。
    (1)也就是说,儿子收到一个加载请求,他不会自己先加载,先去找他爸爸,他爸收到之后也不会加载,先去找爷爷,爷爷就试一下,加载不出来的话就还给他爸,他爸再试一下,不行又还给他,他自己加载不出来才会抛出异常。
    (2)启动类加载器不是Java语言实现的,一般情况下不动它的路径,它负责了在JVM启动时把JRE环境中最重要的一些library加载到内存中,一旦出现问题,JVM就无法正常运行了。

3. 字节码验证的时候验证了什么?

一个class文件被加载到JVM内存之后,首先要经过字节码验证,字节码验证主要包含:
(1)当前的class文件的版本和JVM的版本是否兼容;
(2)检查当前代码是否会破坏系统的完整性;
(3)检查是否会出现堆栈溢出的情况;
(4)检查当前代码中的参数类型是否正确;
(5)检查当前代码中的类型转换操作是否正确。

4. Java代码编译运行的过程?

  1. 程序员编写好的代码 --> javac Hello.java:编译.java文件,生成.class文件(字节码文件);
  2. java Hello:运行.class文件,加载Hello这个类;把这个.class文件加载到内存中,可以通过网络,也可以是本地磁盘;
  3. 类加载器把.class文件加载到字节码校验器中,也就是进行字节码验证;
  4. 字节码文件一部分要让JVM进行解释,解释成计算机可以执行的代码;另一部分进行JIT(Just In Time)即时编译,JIT就是JVM把Java中的热点代码直接编译成计算机可以运行的代码,这样之后调用这个热点代码的时候,就计算机可以直接使用编译好的代码,提高了运行效率;
  5. 最后这些0/1代码被加载硬盘中被计算机执行。

5. 什么是垃圾回收机制?

Java代码中,开辟要使用的内存空间,使用new关键字即可完成。使用完之后,对内存的释放,在JVM中由垃圾回收器(GC,Garbage Collection)完成。不同类型的GC,会根据不同的算法,在程序员创建对象时,就监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式来确定哪些对象是“可达的”,哪些对象是“不可达的”,一旦GC确定了哪些对象是不可达的就会回收这些内存空间。虽然程序员可以手动执行System.gc()来通知GC执行,但是Java语言规范并不保证GC一定会执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值