JVM与内存管理:你的代码是跑在内存里,还是在玩过山车?

举报
喵手 发表于 2025/09/24 21:22:10 2025/09/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

说句实话,第一次听到 “JVM” 这个词的时候,我以为它是个很炫酷的 IDE 插件😂。后来才知道,它才是 Java 的灵魂大Boss,所有 Java 程序都得乖乖听它调度。你写的每一行 new、每一个变量,其实都躲不过 JVM 的安排。

那么问题来了:JVM 是怎么分配内存?垃圾回收机制到底是“勤劳的小蜜蜂”还是“偶尔罢工的老黄牛”?堆和栈有什么区别?今天就让我们带着好奇和一点点“怨气”(谁没被 OOM 搞崩溃过呢🙃),好好聊聊 JVM 与内存管理。


1. JVM架构与垃圾回收(GC)机制

JVM大体架构

JVM 可以粗暴理解为四个大模块:

  1. 类加载器(ClassLoader):负责把 .class 文件丢进内存。
  2. 运行时数据区(Runtime Data Area):这是“内存大本营”,包括堆、栈、方法区等等。
  3. 执行引擎(Execution Engine):负责把字节码翻译成机器指令。
  4. 本地接口(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 !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。