JVM面试题(1)

本文详细介绍了Java虚拟机(JVM)的组成部分,包括类加载器、运行时数据区(如程序计数器、虚拟机栈、本地方法栈、堆和方法区),以及堆和栈的区别。此外,还探讨了双亲委派模型在类加载中的作用和类加载的执行过程。
摘要由CSDN通过智能技术生成

1.说一下jvm的主要组成部分,以及作用

类加载器(ClassLoader):将java代码转换成字节码

运行时数据区(Runtime Data Area):将字节码加载到内存中

执行引擎(Execution Engine):将字节码翻译成底层系统指令交由CPU执行

本地库接口(Native Interface):在CPU执行过程中被调用实现程序的功能

2.说一下jvm运行时数据区

程序计数器、虚拟机栈、本地方法栈、堆、方法区

不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的 区域分为以下 5 个部分:

1. 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解 析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳 转、异常处理、线 程恢复等基础功能,都需要依赖这个计数器来完成;

2. Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链 接、方法出 口等信息;

3. 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法 的,而本地方法栈是为虚拟机调用 Native 方法服务的;

4. Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象 实例都 在这里分配内存;

5. 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的 代码等数 据。

3.说一下堆和栈的区别

堆存储的是实体对象,而栈存储的是局部变量 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很多 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的 回收。 堆是线程共享的,栈是线程私有的。

4.说一下队列和栈

队列和栈都是被用来预存储数据的 队列允许先进先出检索元素,但也有例外的情况:Deque接口允许两端检索元素 栈和队列很相似,但它采用对元素先进后出进行检索

5.什么是双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加 载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中, 只有当父类加载器无法加载请求时,子类加载器才会去尝试加载,直到最后一个类加载器仍然无法加载 这个类就会抛出ClassNotFoundException异常。

(1)双亲委派机制有什么好处

避免重复加载 + 避免核心类篡改 好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的 重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因 素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过 双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直 接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

(2)什么是类加载器

对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立在jvm中的唯一性,每一个类加载 器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将class文件加载到jvm内存,然后 转化为class对象。

(3)类加载器的分类

启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载 Java_HOME/lib/ 目录中的或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类 库; 扩展类加载器(Extension ClassLoader),负责加载 \lib\ext 目录或 Java.ext.dirs 系统变 量指定的路径中的所有类库 应用程序类加载器(Application ClassLoader),负责加载用户类路径 (classpath) 上的指 定类库我们可以直接使用这个类加载器。一般情况下,如果我们没有自定义类加载器默认就是用这 个加载器。

6.说一下类加载的执行过程

共分为一下5个步骤:

1. 加载:根据查找路径找到相应的class文件然后导入

2. 检查:检查加载的class文件的正确性

3. 准备:给类中的静态变量分配内存空间

4. 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直 接引用直接指向内存中的地址

5. 初始化:对静态变量和静态代码块执行初始化工作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

射手座的程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值