JVM与内存管理:你的代码是跑在内存里,还是在玩过山车?
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
说句实话,第一次听到 “JVM” 这个词的时候,我以为它是个很炫酷的 IDE 插件😂。后来才知道,它才是 Java 的灵魂大Boss,所有 Java 程序都得乖乖听它调度。你写的每一行 new
、每一个变量,其实都躲不过 JVM 的安排。
那么问题来了:JVM 是怎么分配内存?垃圾回收机制到底是“勤劳的小蜜蜂”还是“偶尔罢工的老黄牛”?堆和栈有什么区别?今天就让我们带着好奇和一点点“怨气”(谁没被 OOM 搞崩溃过呢🙃),好好聊聊 JVM 与内存管理。
1. JVM架构与垃圾回收(GC)机制
JVM大体架构
JVM 可以粗暴理解为四个大模块:
- 类加载器(ClassLoader):负责把
.class
文件丢进内存。 - 运行时数据区(Runtime Data Area):这是“内存大本营”,包括堆、栈、方法区等等。
- 执行引擎(Execution Engine):负责把字节码翻译成机器指令。
- 本地接口(Native Interface):万一 Java 搞不定,就找 C/C++ 大佬帮忙。
GC 机制
JVM 的“扫地阿姨”就是 GC(Garbage Collector)。它会定期来清理没人用的对象。
- 标记-清除:先打标签,再清垃圾。
- 复制算法:把存活对象搬到另一块区域,剩下的全扔掉。
- 标记-压缩:清完垃圾后,把活的对象挤在一起,避免内存碎片化。
👉 你以为 GC 很智能?其实它也有懒惰的时候。有些情况它忙不过来,导致 Stop The World(STW),整个程序像被按下了暂停键。你看着日志发呆:“咦,怎么卡了?”
2. 堆与栈的概念
栈(Stack)
- 存储:方法调用、局部变量。
- 生命周期:方法调用结束,内存就释放。
- 特点:快!但空间小。
public class StackDemo {
public static void main(String[] args) {
int x = 10; // 在栈上
int y = 20; // 在栈上
System.out.println(x + y);
}
}
堆(Heap)
- 存储:对象实例。
- 生命周期:只要引用还在,对象就不会被清理。
- 特点:空间大,但回收复杂。
public class HeapDemo {
public static void main(String[] args) {
String str = new String("Hello"); // 在堆上
System.out.println(str);
}
}
👉 一句话总结:栈管方法和变量,堆管对象和实例。
3. Java内存模型(JMM)
Java 内存模型(JMM)是规定线程如何看见共享变量的一套规则。要知道,在多线程环境下,CPU、缓存、内存之间的“顺序”可不是你想象的那样简单。
- 主内存:所有线程共享。
- 工作内存:每个线程私有,拷贝主内存的数据来用。
- volatile 关键字:保证变量对所有线程可见。
- happens-before 原则:如果 A happens-before B,那 A 的结果对 B 可见。
案例:
public class JMMDemo {
private volatile boolean flag = false;
public void writer() {
flag = true; // 写入主内存
}
public void reader() {
if (flag) { // 保证可见性
System.out.println("Flag is true!");
}
}
}
👉 如果不加 volatile
,可能会出现线程根本读不到最新的值,你还在那里疯狂调试怀疑人生🤯。
4. 垃圾回收器:Serial、Parallel、CMS、G1
Serial GC
- 单线程收集,适合单核机器。
- 缺点:STW 时间长。
Parallel GC
- 多线程收集,但还是会 STW。
- 优点:吞吐量大。
CMS(Concurrent Mark-Sweep)
- 并发收集,减少 STW 时间。
- 缺点:会产生内存碎片。
G1 GC(Garbage First)
- 分 Region 来管理堆,优先收集垃圾最多的区域。
- 特点:可预测停顿时间,适合大内存应用。
👉 选哪个 GC,要看你的业务特点:
- 小型应用 → Serial
- 吞吐量优先 → Parallel
- 响应时间优先 → CMS 或 G1
5. 性能调优与堆栈分析
光知道理论还不够,线上系统出问题时,你得真刀真枪调优。调 JVM 参数就像调辣度:加多了烧心,少了没味儿。
常用参数:
-Xmx
:最大堆内存-Xms
:初始堆内存-Xss
:栈大小-XX:+UseG1GC
:启用 G1 垃圾回收器
案例:
java -Xms512m -Xmx1024m -XX:+UseG1GC MyApp
堆栈分析工具:
jmap
:生成堆快照。jstack
:线程快照,定位死锁。VisualVM
/JProfiler
:可视化神器。
👉 有时候你会发现:并不是 GC 不行,而是你写的代码太“粘人”,对象死活不释放。调优之前,先检查是不是自己写的“渣代码”🤔。
结语:JVM 是你的朋友,还是噩梦?
JVM 的内存管理,说白了就是一场“谁来擦屁股”的游戏。堆和栈是舞台,GC 是清洁工,JMM 保证线程和变量不打架。不同的垃圾回收器是不同风格的清洁工,有的粗暴高效,有的细致温柔。
问题来了:下次你再遇到 OOM,是选择一股脑儿加内存,还是先问问自己:代码是不是自己写得太作了?😉
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)