一 字节码:
Java bytecode 由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。
实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试操作。
根据指令的性质,主要分为四个大类:
- 栈操作指令,包括与局部变量交互的指令
- 程序流程控制指令
- 对象操作指令,包括方法调用指令
- 算术运算以及类型转换指令
二 类加载器
-
加载(Loading):找 Class 文件
-
验证(Verification):验证格式、依赖
-
准备(Preparation):静态字段、方法表
-
解析(Resolution):符号解析为引用
-
初始化(Initialization):构造器、静态变
量赋值、静态代码块 -
使用(Using)
-
卸载(Unloading)
-
三类加载器: -
启动类加载器(BootstrapClassLoader)
-
扩展类加载器(ExtClassLoader)
-
应用类加载器(AppClassLoader)
加载器特点:
双亲委托 负责依赖 缓存加载
三 JVM 内存结构
面试题: -
什么是JVM?
1.1 请问JDK与JVM有什么区别?
1.2 你认识哪些JVM厂商?
1.3 OracleJDK与OpenJDK有什么区别?
1.4 开发中使用哪个版本的JDK?生产环境呢? 为什么这么选? -
什么是Java字节码?
2.1 字节码文件中包含哪些内容?
2.2 什么是常量?
2.3 你怎么理解常量池? -
JVM的运行时数据区有哪些?
3.1 什么是堆内存?
3.2 堆内存包括哪些部分?
3.3 什么是非堆内存? -
什么是内存溢出?
4.1 什么是内存泄漏?
4.2 两者有什么关系? -
给定一个具体的类,请分析对象的内存占用
5.1 怎么计算出来的?
5.2 对象头中包含哪些部分? -
常用的JVM启动参数有哪些?
6.1 设置堆内存XMX应该考虑哪些因素?
6.2 假设物理内存是8G,设置多大堆内存比较合适?
6.3 Xmx 设置的值与JVM进程所占用的内存有什么关系?
6.4 怎样开启GC日志?
6.5 请指定使用G1垃圾收集器来启动Hello程序 -
Java8默认使用的垃圾收集器是什么?
7.1 Java11的默认垃圾收集器是什么?
7.2 常见的垃圾收集器有哪些?
7.3 什么是串行垃圾收集?
7.4 什么是并行垃圾收集?
7.5 什么是并发垃圾收集器?
7.6 什么是增量式垃圾收集?
7.7 什么是年轻代?
7.8 什么是GC停顿(GC pause)?
7.9 GC停顿与STW停顿有什么区别? -
如果CPU使用率突然飙升,你会怎么排查?
8.1 如果系统响应变慢,你会怎么排查?
8.2 系统性能一般怎么衡量? -
使用过哪些JVM相关的工具?
9.1 查看JVM进程号的命令是什么?
9.2 怎么查看剩余内存?
9.3 查看线程栈的工具是什么?
9.4 用什么工具来获取堆内存转储?
9.5 内存Dump时有哪些注意事项?
9.6 使用JMAP转储堆内存大致的参数怎么处理?
9.7 为什么转储文件以 .hprof 结尾?
9.8 内存Dump完成之后,用什么工具来分析?
9.9 如果忘记了使用什么参数你一般怎么处理? -
开发性问题:你碰到过哪些JVM问题?
书籍推荐:
《深入理解Java虚拟机:JVM高级特性与最佳实践》周志明
《自己动手写Java虚拟机》
《实战Java虚拟机:JVM故障诊断与性能优化》
《揭秘Java虚拟机 JVM设计原理与实现》
回复 书名即可获得