java面试准备8

什么是类装载的执行过程

类加载主要分为五个步骤:
加载:根据类路径(ClassPath)找到对象的class文件然后导入。
验证:检查加载的class文件的正确性。
准备:给类中的静态变量分配内存空间。
解析:虚拟机将常量池中的符号引用替换成直接引用的过程,符号引用就可以理解为一个标识,而直接引用直接指向内存中的地址。
初始化:对静态变量和静态代码块执行初始化操作。

JVM里面的classLoader,为什么会有多种

启动类加载器:负责加载JRE的核心类库,例如jre目标下的rt.jar,charsets.jar等。
扩展类加载器:负责加载jre扩展目录里面的jar包
系统类加载器:负责加载ClassPath路径下的类包
用户自定义类加载器:负责加载用户自定义路径下的类包

什么是双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去执行,这样所有的加载请求都会被传送到顶层的启动类加载器去执行,只有父加载器无法完成加载请求(它的搜索范围中没有找到所需要的类)时,子加载器才会去尝试加载类。

好处:沙箱安全机制:自己写的String.class不会被加载,这样便可以防止核心API库被随意篡改,避免类的重复加载,当父加载器已经加载了该类时,就没有必要子加载器再加载一遍。

User user = new User()做了什么操作,申请了哪些内存?

(1)new User()创建了一个User对象,内存分配在堆中
(2)User user创建了一个引用,内存分配在栈上
(3)=将User对象地址赋值给引用

垃圾回收动作何时执行

(1)当年轻代内存满时,会引发一次普通GC,该GC收回年轻代。需要强调的是,年轻代满了是指Eden区满了,Survivor满了不会引发GC,只会将对象转移到老年代。
(2)当老年代满了会引发Full GC,Full GC会同时回收年轻代、老年代。
(3)当永久代满了后也会引发Full GC,会导致Class、Method元信息的卸载。

什么时候会抛出Out Of Memory Exception?

并不是内存被消耗完时才抛出:
(1)JVM98%的时间都花费在内存收回
(2)每次回收的内存小与2%
满足这两个条件就会抛出OutOfMemoryException,这将会给系统留一个微小的间隙来做一些Down之前的操作,比如手动打印Heap Dump;

类加载器基本概念

类加载器(class loader)用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序经过编译器编译之后就被转换成Java字节码(.class文件)。类加载器负责读取java字节代码,并转换成java.lang.class的一个实例。每个这样的实例都能用来表示一个java类。通过此实例的new Instance()就能创建出该类的一个对象。

java.lang.classLoader类介绍

java.lang.classLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义一个java类,即java.lang.Class类的一个实例,除此之外,ClassLoader还负责加载Java应用所需要的资源,如图像文件和配置文件等。

类加载器的代理模式

类加载器在尝试自己去查找某个类的字节代码并且定义它时,会先代理给其父加载器,由父类加载器先去尝试加载这个类,依次类推。Java虚拟机判断两个类是否相同:不仅要看类的全限定类名是否相同,还要看加载此类的类加载器是否一样。只有两者完全相同时,才会认为两个类是相同的。即便是同样的字节码,被不同的类加载器加载后得到的类,也是不同的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值