1. JVM 由哪些区域构成?
- 由类加载器和运行时数据区构成;运行时数据区又分为线程私有和线程共享两大区域,线程私有的包括程序计数器、虚拟机栈和本地方法栈,线程共享的包括堆和方法区。
2. 类加载器的作用是什么?
- 加载 class 文件,生成类的结构信息,将其存放在方法区。
3. 类加载器有哪些种类以及它们之间的关系是什么?
- Bootstrap ClassLoader,加载 lib 下面的类;Extension ClassLoader,加载扩展类,即 jre/ext 下面的类;Application ClassLoader,加载用户编写的类;还可以继承 ClassLoader 类自定义类加载器。Application ClassLoader 是 Extension ClassLoader 的子类,Extension ClassLoader 又是 Bootstrap ClassLoader 的子类。
4. 什么是双亲委派机制?
- 简单地说就是要加载类时先找自己的父类去进行加载。比如要加载 A.class,首先 Application ClassLoader 会先找自己的父类,即 Extension ClassLoader,Extension ClassLoader 又会先找自己的父类,即 Bootstrap ClassLoader,它没加载到,再告诉 Extension ClassLoader,它又没加载到,才轮到 Application ClassLoader 去加载。这就是双亲委派机制,可以保证优先加载 JDK 自己的类。
5. 类的加载过程是怎样的?
- 加载:将 class 文件加载进内存;
- 验证:验证 class 文件的正确性;
- 准备:给类中的静态变量分配空间;
- 解析:将 class 常量池中的符号引用替换成直接引用;
- 初始化:对静态变量和静态代码块进行初始化。
6. 说说你对栈内存的认识?
- 栈内存是线程私有的一块区域,分为虚拟机栈和本地方法栈。基本类型的变量、对象的引用变量和实例方法都是在栈中分配的。栈的内存地址是连续的,不存在垃圾回收。本地方法栈和虚拟机栈差不多,只不过本地方法栈是为本地方法服务的。
7. 程序计数器的作用是什么?
- 记录程序执行的位置,程序调用别的方法、循环、递归的时候,下一次要回到哪儿执行,就靠程序计数器记录。
8. 方法区是物理上的划分吗?
- 方法区是用来存储类加载器生成的类的结构信息的,它是逻辑上的划分,是一种规范,并不是具体的实现。jdk1.7 对方法区的实现叫做永久代,它存在于堆内存中;jdk1.8 对方法区的实现叫元空间,它共用物理内存。
9. 你对堆内存了解多少?
- 堆是 JVM 中最大的一块区域,存放数组以及对象。它又分为新生代、老年代,内存占比是 1:2 。新生代又分为伊甸园区、from 区和 to 区,这三块区域内存占比为 8:1:1 。对象在新生代的伊甸园区出生,经历了若干次垃圾回收达到了年龄的对象就会存放到老年代。
网友评论