目录
一、运行时数据区
1、说一下JVM的主要组成部分及其作用?
2、说一下 JVM 运行时数据区 ?
3、说一下堆栈的区别
4、成员变量、局部变量、类变量分别存储在什么地方?
5、类常量池、运行时常量池、字符串常量池有什么区别?
6、JVM为什么使用元空间替换永久代
二、垃圾回收
1、GC是什么,为什么要GC?
2、Java 中都有哪些引用类型?
3、JVM如何判断一个对象是否可以被回收?
4、GC Root有哪些?
5、讲一下新生代、老年代、永久代的区别
6、JVM 分代年龄为什么是 15 ?可以是 25 吗?
7、Minor GC、Major GC、Full GC是什么
8、Minor GC过程
9、JVM 垃圾回收算法有哪些?
10、说一下 JVM 有哪些垃圾回收器?
11、JDK各版本默认垃圾收集器
12、G1垃圾收集器的特点
(1)并行和并发
(2)分代收集
(3)空间整合
(4)可预测的停顿时间模型
(5)缺点:
13、G1垃圾回收过程
14、JVM 中的三色标记法是什么?
15、说一下 CMS 垃圾回收器的工作原理
16、CMS收集器和G1收集器的区别
(1)使用范围不一样
(2)STW的时间
(3)垃圾碎片
(4)垃圾回收的过程不一样
17、如何选择垃圾收集器?
一、运行时数据区
1、说一下JVM的主要组成部分及其作用?
两个子系统:
-
类加载器:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area
-
执行引擎:执行classes中的指令
两个组件:
-
运行时数据区:这就是我们常说的JVM的内存
-
本地接口:与native libraries交互,是其它编程语言交互的接口
2、说一下 JVM 运行时数据区 ?
-
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成(为什么要线程计数器?因为线程是不具备记忆功能)。
-
Java 虚拟机栈(Java Virtual Machine Stacks):每个方法在执行的同时都会在Java 虚拟机栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息(栈帧就是Java虚拟机栈中的一个单位)。
-
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的(Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码)。
-
Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存。
-
方法区(Methed Area)