说一下 jvm 的主要组成部分?及其作用?
- 类加载器:负责用来把字节码文件加载进虚拟中
- 运行时数据区:数据的存储位置
- 执行引擎:将字节码转化为机器语言
- 本地库接口:转换的过程需要其他语言的参与
说一下 jvm 运行时数据区
- 堆:存放对象
- 栈:方法以栈帧的形式在栈中执行
- 程序计数器:指向当前运行的指令位置
- 方法区:存放类的元信息
- 本地方法栈:执行其他语言方法的位置
说一下堆栈的区别
堆:存放的是对象,只能通过GC回收掉,多个线程共用一个堆。
栈:存放的是局部基本类型的变量,方法执行完毕栈帧空间释放,局部变量也随之释放,每个线程对应一个栈。
队列和栈是什么?有什么区别?
队列和栈都是与存放数据的数据结构
队列是Queue,先进先出原则。
栈是Stack,后进先出原则。
什么是双亲委派模型
先说一下classLoader是什么,四种classLoader 引导类、扩展类、应用类、自定义类,简单说一下他们加载的范围。
classLoader加载类会先交给父加载器执行,有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。
说一下类加载的执行过程
- 加载:加载类,放到方法区,生成Class实例对象
合称为链接阶段
- 验证:检查字节码文件是否合理
- 准备:静态变量开辟空间,默认赋值
- 解析:将符号引用转换为直接引用。
- 初始化:静态变量赋值
怎么判断对象是否可以被回收
扯一下可达性分析算法和引用计数算法(缺点:循环引用)
没有被GCRoot标记,没有被任何对象所引用
java 中都有哪些引用类型
强引用:只要该对象被强引用就不会被回收
软引用:当GC完后还需要释放空间,就会回收软引用引用的对象
弱引用:每次GC的时候被弱引用引用的对象都会被回收
虚引用:不是很理解,暂时理解为没有被引用。
说一下 jvm 有哪些垃圾回收算法?
标记-清除
复制算法
标记-整理
分代算法:年轻代老年代
再简单分析一下就完事了。
说一下 jvm 有哪些垃圾回收器
Serial、Serial OLd、parNew、CMS、Parallel、Parallel Old-G1
一组一组的记,简单说一下单线程、多线程、吞吐量、使用的回收算法、重点说一下CMS和G1即可。
详细介绍一下 CMS 垃圾回收器
停顿时间优先,初步标记-并发标记-重新标记-回收。标记-清除算法。
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
参考上面的回答
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
简述分代垃圾回收器是怎么工作的?
估计能扯个10分钟
年轻代-老年代 2:1,年轻代 8-1-1,年轻代 From-To,怎么从年轻代-老年代,Minor GC,Major GC,Full GC。
常用的 jvm 调优的参数都有哪些?
-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
内存泄漏与内存溢出
内存泄露:对象无法得到及时的回收,持续占用内存空间,从而造成内存空间的浪费。
内存泄露:内存泄漏到一定的程度就会导致内存溢出,但是内存溢出也有可能是大对象导致的。