java常见集合容器的扩容增量
2026/5/12 5:13:34
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
JVM(Java Virtual Machine),中文叫Java虚拟机,是运行Java程序的“发动机”。
你写的.java文件,经过编译变成.class字节码文件后,并不是直接在操作系统上跑的,而是交给 JVM 来执行。
🧠 类比理解:
如果把 Java 程序比作一辆汽车,那么 JVM 就是这辆车的引擎。
不管你是 Windows、Mac 还是 Linux,只要装了对应系统的 JVM,你的 Java 程序就能跑——这就是“一次编写,到处运行”的秘密!
假设你用 C++ 写一个程序,在 Windows 上编译后生成.exe,这个程序在 Mac 上根本跑不了,除非重新编译。而 Java 只要编译一次成.class,任何有 JVM 的地方都能运行。
| 组件 | 作用 |
|---|---|
| 类加载器(ClassLoader) | 把.class文件加载进内存 |
| 运行时数据区(Runtime Data Areas) | 存放程序运行时的各种数据(堆、栈、方法区等) |
| 执行引擎(Execution Engine) | 执行字节码,包含解释器和 JIT 编译器 |
| 本地方法接口(JNI) | 调用 C/C++ 等本地代码 |
💡 初学者重点理解:堆(Heap)存对象,栈(Stack)存方法调用和局部变量。
你在开发一个 Spring Boot 后台服务,用户量突然暴增,系统变慢甚至 OOM(内存溢出)。你想知道:
这时候,你就需要和 JVM “对话”了!
// pom.xml 已包含 spring-boot-starter-web@RestController public class JvmDemoController { // 模拟内存泄漏:不断往 List 里加对象,且不释放 private static List<String> memoryHog = new ArrayList<>(); @GetMapping("/leak") public String causeMemoryLeak() { for (int i = 0; i < 100_000; i++) { memoryHog.add("This is a test string to consume memory - " + UUID.randomUUID().toString()); } return "Added 100,000 strings to memory!"; } @GetMapping("/memory") public Map<String, Object> getMemoryInfo() { Runtime runtime = Runtime.getRuntime(); long totalMemory = runtime.totalMemory(); // JVM 总内存 long freeMemory = runtime.freeMemory(); // 空闲内存 long usedMemory = totalMemory - freeMemory; // 已用内存 Map<String, Object> info = new HashMap<>(); info.put("totalMemoryMB", totalMemory / (1024 * 1024)); info.put("freeMemoryMB", freeMemory / (1024 * 1024)); info.put("usedMemoryMB", usedMemory / (1024 * 1024)); info.put("listSize", memoryHog.size()); return info; } }http://localhost:8080/memory查看当前内存使用http://localhost:8080/leak模拟内存增长/memory,你会发现usedMemory 不断上升,且不会下降→ 这就是典型的内存泄漏!// ❌ 反例:静态集合持有大量对象引用,导致 GC 无法回收 public class BadExample { private static List<Object> cache = new ArrayList<>(); // 危险! public void addToCache(Object obj) { cache.add(obj); // 一直加,从不清理! } }⚠️ 问题:
cache是静态的,生命周期和 JVM 一样长。即使业务不再需要这些对象,GC 也无法回收,最终导致OutOfMemoryError。
java -Xms512m -Xmx2g -XX:+UseG1GC -jar myapp.jar-Xms:初始堆大小-Xmx:最大堆大小-XX:+UseG1GC:使用 G1 垃圾回收器(适合大内存应用)| 关键点 | 说明 |
|---|---|
| JVM 是什么 | Java 程序的运行环境,负责执行字节码 |
| 为什么重要 | 实现跨平台、自动内存管理、安全隔离 |
| 开发者要关注什么 | 堆内存、GC 行为、内存泄漏 |
| Spring Boot 中怎么用 | 通过Runtime获取内存信息,结合监控工具排查问题 |
💬记住一句话:
“写 Java 的人,不懂 JVM,就像开车的人不懂引擎。”
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!