记录java jvm学习笔记(附带面试题)
一 字节码: 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设计原理与实现》
回复 书名即可获得
