剖析一下自己的简历第二条
剖析一下自己的简历第二条
- 背景
- 前置说明
- 可能会被问到的问题
背景
剖析一下自己简历, 增加对一些专业知识的掌握. 我的简历第二条是这样写的: “2. 熟悉JVM、JMM,包括内存模型,垃圾回收机制,了解其基本调优技巧并具备线上调优经验。”.
前置说明
大概是为了面试, 有些知识点是按照自己当前的认知和理解整理归纳的. 可能不太对, 但是愿意慢慢去优化和完善自己的知识体系.
可能会被问到的问题
- JVM 的基本结构是什么?
- 回答:JVM 主要由以下几个部分组成:
- 类加载器子系统:负责加载、链接和初始化类。
- 运行时数据区:包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。
- 执行引擎:解释器、即时编译器(JIT 编译器)、垃圾回收器等。
- 本地接口:与底层操作系统交互的部分。
- 本地方法库:提供给 JVM 调用的本地方法。
- 回答:JVM 主要由以下几个部分组成:
- 什么是 Java 内存模型(JMM)?
- 回答:Java 内存模型定义了多线程程序中变量的访问规则,确保了不同线程之间内存操作的一致性。JMM 通过以下机制实现:
- 原子性:保证某些操作是不可分割的。
- 可见性:一个线程对共享变量的修改能够被其他线程看到。
- 有序性:禁止指令重排序,确保程序按照预期的顺序执行。
- 回答:Java 内存模型定义了多线程程序中变量的访问规则,确保了不同线程之间内存操作的一致性。JMM 通过以下机制实现:
- ** 垃圾回收器常用的算法有哪些? **
- 标记-清除(Mark-Sweep):标记出所有需要回收的对象,然后清除这些对象。
- 复制(Copying):将存活对象从一个区域复制到另一个区域,然后清空原区域。
- 标记-整理(Mark-Compact):标记出所有需要回收的对象,然后将存活对象移动到一端,清空另一端。
- 分代收集(Generational Collection):将堆分成新生代和老年代,分别使用不同的收集算法。
- **哪些对象可以是GCRoot对象? **
也就是找到那些一定不是垃圾的对象
- 虚拟机栈中的局部变量: 栈针中局部变量表中引用的对象是当前方法正在使用的对象, 一定不是垃圾对象.
- 方法区中的类静态属性: 这个是类的属性, 只要类不被卸载, 我们就认为这个对象一定不是垃圾对象.
- 方法区中的常量: 这个是在方法区的常量池中, 也是一直存活的对象, 所以也被认为是GCRoot对象.
…
还有很多我这里记不住了, 可以自行百度, 回答几个就可以了, 面试而已…
为了加深印象, 这个还是自己画一个图吧:
- **常见的垃圾回收器都有哪些? **
- 小内存应用:Serial 收集器
- 多核 CPU 和高吞吐量:Parallel 收集器
- 低延迟:CMS(Concurrent Mark Sweep) 或 G1 收集器
- 极低延迟和大内存:ZGC 或 Shenandoah 收集器
- 测试和基准测试:Epsilon 收集器
这里记一下读音吧: - Serial 的发音是:['sɪr.i.əl]
- Parallel 的发音是:['pær.ə.lel]
这里找一个图留一个印象吧:
// TODO 后续可以研究学习一下:
- **JVM常用的命令和工具有哪些? **
jstack
:主要用于生成线程转储,帮助诊断线程相关的问题,如死锁、长时间运行的任务等。jmap
:主要用于生成堆转储文件和显示堆中对象的统计信息,帮助分析内存使用情况。jconsole
:提供图形界面,用于实时监控 JVM 的各种指标,如内存使用情况、线程状态、类加载信息等。
Arthas
Eclipse MAT (Memory Analyzer Tool)
// TODO 后续有时间可以尝试使用一下