JVM面试题总结

1.JVM类加载机制?双亲委派模型?自定义类加载器?

 类加载机制

类加载子系统负责查找并加载二进制class文件,保证导入类的正确性以及帮助解析符号引用,并提取其中类信息以某种数据结构存储在方法区中,在堆内存中创建一个Class对象的过程。

细节上又可分加载、连接(验证、准备、解析)、初始化:

1) 加载 -- 查找并装载类型的二进制数据

2) 连接 -- 执行验证,准备,以及解析(可选),如下三个步骤

        验证 -- 确保被导入类型的正确性

        准备 -- 为类变量分配内存,并将其初始化为默认值;

        解析 -- 把类型中的符号引用转换为直接引用

3) 初始化 -- 把类变量初始化为正确初始值

static属性初始化时机?

图解JVM类加载机制与类加载过程_Hopefully Sky的博客-CSDN博客_jvm加载类的过程图

类加载器

JVM定义的类加载器按照层次,分为以下三种:

启动类加载器(Bootstrap ClassLoader):

该类加载器是JVM使用C/C++底层代码实现的加载器,用以加载JVM运行时所需要的系统类(在{JRE_HOME}/lib目录),当JVM系统启动的时候,引导类加载器会将其加载到 JVM内存的方法区中。

扩展类加载器(Extension ClassLoader)

用于加载Java的扩展类(一般会放在 {JRE_HOME}/lib/ext/ 目录),用来提供除了系统类之外的额外功能。拓展类加载器是整个JVM加载器的Java代码可以访问到的类加载器的最顶端,即是超级父加载器,拓展类加载器是没有父类加载器的。

应用程序类加载器(Application ClassLoader)

该类加载器是用于加载用户代码,是用户代码的入口。

双亲委派模型

当系统类加载器收到类加载请求时,首先不是尝试自己去加载,而是把请求委派给父类加载器,依次向上询问。只有当父加载器在范围内找不到指定类时,则从上到下依次尝试是否能加载当前类,直到加载成功。

自定义类加载器

因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。(自定义迷你tomcat时加载绝对路径的class)

过程:

新建一个类继承java.lang.ClassLoader,重写findClass方法;

读取文件的字节数组,将class字节码数组转换为Class类的实例;

调用loadClass方法即可。

code/Minicat/src/main/java/utils/WebClassLoader.java · ddg/第二阶段模块一 - Gitee.com

2.Java内存区域和内存模型?二者的区别?​

运行时数据区

《Java虚拟机规范》:Java虚拟机所管理的内存包括:堆、方法区、虚拟机栈、本地方法栈、程序计数器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值