jvm-类加载器

1.Java运行时什么时候进行类加载?
按需进行加载,用到就加载,不用不加载。(hotSopt)

2.jvm一个类的加载过程。
加载、链接(验证、准备、解析)、初始化、使用、卸载。

加载:将.calss字节码文件加载入内存,在内存中生成一个代表该类的java.lang.Class对象放入元空间,此阶段程序员可干预,可以自定义类加载器来实现类的加载。

验证:验证.class字节码文件是都符合安全约束,防止非法文件载入抛出错误。

准备:为类变量赋默认初始值,int = 0,long = 0L,boolean = false,引用对象赋值为null。

解析:将符号引用翻译为直接引用(了解即可,jvm自动实现,无法干预。)

初始化:给类对象赋真正的数据值,和其他变量。

使用:对类进行操作使用。

卸载:如果该对象的所有实例对象都已经被垃圾回收,其对应的类加载器ClassLoader也被回收,在任何地方都没有引用到该类,且也没有被反射访问。那么就可以将该类卸载,但jvm一般不会卸载类。

父子类的初始化顺序:
父类 静态变量
父类 静态代码块
子类 静态变量
子类 静态代码块
父类 变量
父类 代码块
父类 构造方法
子类 变量
子类 代码块
子类 构造方法
速记口诀:前四父子静变代,后六父子变代构。前四后六父为先,最后一句随便了。

3.什么是类加载器?
类加载器就是一段代码(程序)。用于通过全限定类名,获取该类的字节流。这一动作的代码就叫类加载器。

4.jvm有哪些类加载器?
BootStrap ClassLoader(启动类加载器)使用的c++语言实现的,是虚拟机的自身一部分。用于加载jre/lib rt.jar resource.jar charsets.jar。
Extention ClassLoader(拓展类加载器)用java实现,加载jre/lib/ext 下的核心文件库
Application ClassLoader(应用加载器也叫系统加载器),用于加载用户路径(classpath)上所有的类库

5.三层类加载器的关系是继承吗?
不是继承关系

6.双亲委派模型是什么意思,有什么好处?
双亲委派模型说的是 在类加载的时候 类加载器自上而下尝试加载,自下而上检查是否加载。他有三点好处
①避免类的重复加载
②保证了核心类库不会被修改,保证安全
③保证类的唯一性

7.可以打破双亲委派模型吗?
可以打破双委派模型,在自定义ClassLoader的时候,重写里面的loadClass方法就可以了,但是不建议打破。
8.如何定义一个自己的类加载器?
写一个类继承ClassLoader 重写里面的findClass方法,而findClass里面要做的事就是,解析字符串将其变为一个全限定类名。然后使用流操作进行读取字节码文件,再调用defineClass();进行返回。

9.class.forName 和 classLoader.loadClass 去加载类有什么区别。
forName得到的是已经初始化完成的
locdClass是还没有初始化的

10.什么是热加载和热部署?
热加载:是说不用重启服务器就能让更改的代码生效,他就是基于类加载器实现的。但这种方法不安全,不会用于正式的生产环境。
热部署:是说可以在不重启服务器的情况再重新部署这个项目,比如tomcat热部署,当我们修改了war包,tomcat就删除原来的war包 替换为新得war包。在这过程不用停掉服务器。
热加载是在运行时

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值