JVM——类加载器

常见的JVM虚拟机?

  1. sun公司的HotSpot

  1. BEA公司的JRockit

  1. IBM公司的J9

Java代码编译执行过程?

  1. 源码编译:通过Java源码编译器把代码编译成JVM字节码(.class文件)。

  1. 类加载:通过类加载器完成JVM类的加载。

  1. 类执行:字节码被装入内存,进入 JVM 虚拟机,被解释器解释执行。

Java运行时一个类是什么时候被加载的?

HotSpot虚拟机采用的是按需加载,在用到这个类时去加载。

JVM一个类的加载过程?

  1. 加载:把类的class二进制字节流读进来,在内存中生成一个代表这个类的java.long.Class对象放入元空间。

  1. 验证:

  1. 准备:类静态变量赋默认初始值,int为0,long为0L,boolean为false,引用类型赋null。类静态常量赋实际值

  1. 解析:

  1. 初始化:在准备的时候会给变量赋初始值,而在初始化的时候会给变量赋真实值。静态变量在此时赋真实值,静态代码块也会执行。而普通变量是在创建对象时赋值,构造器和普通代码块也是在此时执行。

  1. 使用:

  1. 卸载:

JVM有哪些类加载器?

站在Java虚拟机的角度看有两种

  • 启动类加载器(Bootstrap ClassLoader),使用C++语言实现,是虚拟机自身的一部分。

  • 其他类加载器:使用Java语言开发,独立于虚拟机外部,并且都继承自抽象类ClassLoader

站在Java开发者的角度,有三层类加载器

  • BootstrapClassLoader

  • ExtClassLoader

  • AppClassLoader

JVM不同类加载器加载哪些文件?

启动类加载器(BootstrapClassLoader)

  • jre\lib\rt.jar、resouces.jar、charsets.jar

  • 被-Xbootclasspath参数所指定的类库

扩展类加载器(ExtClassLoader)

  • jre\lib\ext

  • 被java.long.ext系统变量所指定的路径中的所有类库

应用程序类加载器(AppClassLoader)

  • 用户类路径(classpath)上所有的类库。即我们自己写的。

什么是双亲委派模型?

如果一个类加载器收到了类加载的请求,它首先自己不会去加载这个类,而是把这个请求委派给上层的加载器去完成,每一层的类加载器都是如此,因此所有的类加载请求都会委派到最上层的类加载器中,然后从最上层开始加载,当该层无法加载这个类是,他就会告诉下一层类加载器,让其尝试加载。

双亲委派模型的优点?

  • 确保安全,避免Java核心库被修改。

  • 避免重复加载,保证类的唯一性。

如何打破JVM的双亲委派模型?

自定义一个类加载器(继承classLoader类即可),重写其中的loadClass方法,使其不再进行双亲委派。

ClassLoader类中的loadClass()、findClass()、defineClass()的区别?

  • loadClass():主要进行类加载的方法,默认的双亲委机制型就在这个方法中。

  • findClass():根据名称或位置加载.class字节码。

  • defineClass():把字节码转化为java.long.Class。

加载一个类用Class.forName和ClassLoader.loaderClass有什么区别?

Class.forName:得到的类是已经初始化的。

ClassLoader.loaderClass:得到的类还没有初始化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值