From 600d9663659216848b527891f1a939cb42b9a9e5 Mon Sep 17 00:00:00 2001 From: Wonder Date: Sun, 28 Sep 2025 20:34:55 +0800 Subject: [PATCH] =?UTF-8?q?=20=F0=9F=94=84Update:=20JVM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JVM/4. JIT.md | 12 ++++++++++ JVM/5. 命令行.md | 40 +++++++++++++++++++++++++++++++ JVM/6. OOM.md | 23 ++++++++++++++++++ JVM/7. 双亲委派模型.md | 7 ++++++ JVM/8. 类加载过程.md | 18 ++++++++++++++ JVM/9. 创建对象.md | 53 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 153 insertions(+) create mode 100644 JVM/4. JIT.md create mode 100644 JVM/5. 命令行.md create mode 100644 JVM/6. OOM.md create mode 100644 JVM/7. 双亲委派模型.md create mode 100644 JVM/8. 类加载过程.md create mode 100644 JVM/9. 创建对象.md diff --git a/JVM/4. JIT.md b/JVM/4. JIT.md new file mode 100644 index 0000000..da272d2 --- /dev/null +++ b/JVM/4. JIT.md @@ -0,0 +1,12 @@ +# JIT + +热点代码 -> 机器码 + +![JIT](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/jvm/jit-9a62fc02-1a6a-451e-bb2b-19fc086d5be0.png) + +- C1 + - `Client Complier` + - 局部简单可靠优化 +- C2 + - `Server Complier` + - 全局优化 \ No newline at end of file diff --git a/JVM/5. 命令行.md b/JVM/5. 命令行.md new file mode 100644 index 0000000..ba606c8 --- /dev/null +++ b/JVM/5. 命令行.md @@ -0,0 +1,40 @@ +# 命令行 + +## jps + +查看虚拟机进程 + +```sh +C:\Users\23117>jps -l +6048 org.jetbrains.jps.cmdline.Launcher +10372 sun.tools.jps.Jps +4228 cn.hezhaohui.app +9832 com.intellij.idea.Main +``` + +`jps -l` 命令列出的 Java 进程如下: + +- `6048` - `org.jetbrains.jps.cmdline.Launcher`(JetBrains 项目构建工具) +- `10372` - `sun.tools.jps.Jps`(`jps` 自身进程) +- `4228` - `cn.hezhaohui.app`(自定义 Java 应用程序) +- `9832` - `com.intellij.idea.Main`(IntelliJ IDEA 主程序) + +## jstats + +```sh +C:\Users\23117>jstat -class -t 14988 1000 2 +Timestamp Loaded Bytes Unloaded Bytes Time + 57.7 902 2124.9 0 0.0 0.03 + 58.7 902 2124.9 0 0.0 0.03 +``` + +`jstat -class -t 14988 1000 2` 的输出表示: + +- **Timestamp**:时间戳(单位为秒)。 +- **Loaded**:已加载的类数量(902 个)。 +- **Bytes**:已加载类的总字节数(2124.9 KB)。 +- **Unloaded**:已卸载的类数量(0 个)。 +- **Bytes**:已卸载类的总字节数(0.0 KB)。 +- **Time**:类加载/卸载所花费的时间(0.03 秒)。 + +此命令用于监控 Java 进程(PID 14988)的类加载统计信息,每秒输出一次,共输出 2 次。 \ No newline at end of file diff --git a/JVM/6. OOM.md b/JVM/6. OOM.md new file mode 100644 index 0000000..76e76d7 --- /dev/null +++ b/JVM/6. OOM.md @@ -0,0 +1,23 @@ +# OOM + +> OOM: Out of Memory +> 内存溢出:申请内存时, JVM 没有足够的内存空间 +> ML: Memory Leak +> 内存泄漏:申请了内存,但是没有释放,导致内存空间浪费 + + +- 合理设置堆内存大小 +- 内存分析工具排查问题 +- GC 日志分析 +- 控制缓存 + + +**容易出现 OOM 的业务场景** + +- 处理大量图片、文件、大数据集未及时释放 +- 内存泄漏,数据库连接未关闭、缓存未清理 +- 缓存没有限制大小 +- 线程数量过多 +- 无限递归 +- 强引用过多 +- 一次性处理大文件 \ No newline at end of file diff --git a/JVM/7. 双亲委派模型.md b/JVM/7. 双亲委派模型.md new file mode 100644 index 0000000..4ed110c --- /dev/null +++ b/JVM/7. 双亲委派模型.md @@ -0,0 +1,7 @@ +# 双亲委派模型 + +- 过程 + - 父类加载器先尝试加载 + - 父类加载器不能加载,则自己加载 +- 优点 + - 保证类的统一性和安全性,避免被重复佳作或者被篡改 \ No newline at end of file diff --git a/JVM/8. 类加载过程.md b/JVM/8. 类加载过程.md new file mode 100644 index 0000000..ef41c05 --- /dev/null +++ b/JVM/8. 类加载过程.md @@ -0,0 +1,18 @@ +# 类加载过程 + +1. 加载 + 1. 通过全类名获取定义此类的二进制字节流 + 2. 将字节流的静态存储结构转化为运行时数据结构 + 3. 在内存中生成 `Class` 对象,放入方法区中 +2. 验证 + 1. 文件格式验证 (魔数) + 2. 元数据验证 (符合规范) + 3. 字节码验证 (程序语义) + 4. 符号引用验证 (其他类、方法、字段是否存在) +3. 准备 + 1. 分配内存 + - 静态变量 +4. 解析 + 1. 将符号引用替换为直接引用 +5. 初始化 + diff --git a/JVM/9. 创建对象.md b/JVM/9. 创建对象.md new file mode 100644 index 0000000..d46c4cd --- /dev/null +++ b/JVM/9. 创建对象.md @@ -0,0 +1,53 @@ +# 创建对象 + +**初始化顺序** + +1. 父类静态变量/静态代码块 +2. 子类静态变量/静态代码块 +3. 父类变量/代码块 +4. 父类构造方法 +5. 子类变量/代码块 +6. 子类构造方法 + +```java +class Parent { + // 父类静态变量 + static { + System.out.println("1. 父类静态代码块"); + } + + // 父类实例变量 + { + System.out.println("3. 父类实例代码块"); + } + + // 父类构造方法 + Parent() { + System.out.println("4. 父类构造方法"); + } +} + +class Child extends Parent { + // 子类静态变量 + static { + System.out.println("2. 子类静态代码块"); + } + + // 子类实例变量 + { + System.out.println("5. 子类实例代码块"); + } + + // 子类构造方法 + Child() { + System.out.println("6. 子类构造方法"); + } +} + +public class Main { + public static void main(String[] args) { + new Child(); + } +} + +``` \ No newline at end of file