JVM面试题

本文详细解释了JVM中的类加载器结构(包括BootstrapClassLoader、ExtensionClassLoader、ApplicationClassLoader和自定义类加载器),介绍了类加载器的双亲委派策略,并剖析了JVM各个组成部分及其作用,如程序计数器、堆、栈、本地方法栈和方法区的存储功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JVM中常见的类加载器有哪些?

        1)、启动类加载器(Bootstrap ClassLoader):负责加载JVM自身需要的核心类,如java.lang包中的类。
        2)、扩展类加载器(Extension ClassLoader):负责加载JVM扩展目录下的JAR包中的类。
        3)、应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责加载应用程序类路径(classpath)上的类,在大多数情况下是开发者编写的类。
        4)、自定义类加载器:开发者可以根据自己的需求实现自定义的类加载器,以满足一些特殊的加载需求,例如从网络或数据库中加载类。

2.什么是类加载器的双亲委派策略

        1)、类加载器的双亲委派策略是Java虚拟机中用于确定哪个类加载器负责加载某个类的一种机制。根据这个策略,当一个类加载器需要加载一个类时,它会首先将这个任务委托给其父类加载器去完成。只有在父类加载器无法加载该类的情况下,才由当前类加载器自己来加载。

        2)、假如User.java 文件,需要运行,会先编译为User.class ,会让应用程序类加载器(Application ClassLoader)加载,先判断一下,以前的双亲是否加载过,先问扩展类加载器(Ext ClassLoader), 扩展类加载器 问 启动类加载器(BootStrap ClassLoader)是否加载过,如果加载过,直接使用已经存在的类,不会加载了,如果都没有加载过,应用程序类加载器才会加载,这个策略就是双亲委派策略。

3.JVM虚拟机有哪些部分组成,每一部分的作用是什么?

        1)、程序计数器

        程序计数器就是用来记录代码执行到那句话了,后面继续从这个位置开始执行。

        比如多线程A, 多线程B, A执行到35行,被B给夺走了,下一次A从第35行开始继续运行,这个数据就是程序计数器帮助A记忆的。

        2)、堆(堆管存储)

        堆是用来管理存储的。

        3)、栈(栈管调用)

        栈是管运行的,只有被调用了的方法才会进入栈里面,如果没有调用,所有的方法都不会在这个里面。

        4)、本地方法栈

        专门执行native 修饰的方法的,将来根据执行引擎,去执行native方法。专门运行native方法的东西,都压入这个本地方法栈。

        5)、(静态)方法区

         是一块用于存储类信息、常量、静态变量和编译器编译后的代码等数据的内存区域。独一份的东西都放入这个里面。     

        ①.存储类信息:方法区存储了每个类的结构信息,包括类的名称、父类、实现的接口、字段和方法等。这些类信息在程序运行时被加载到方法区,并被JVM用于动态解析和链接。

        ②.存储常量池:方法区还包含了一个运行时常量池,用于存储编译期生成的各种字面量和符号引用。常量池中保存了类、方法和字段的符号引用,以及字符串、数字和其他字面量常量的值。

        ③.存储静态变量:静态变量是属于类而不是对象的,它们在类加载的时候被初始化并存储在方法区中。静态变量可以被所有实例对象共享,因此它们的值会在整个程序执行过程中保持一致。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值