IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

jvm垃圾回收

淘宝数据平台与产品部官方博客 tbdata.org 2011-05-17 08:52:20 累计浏览 3,695 次
本机暂存

    在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation)。年轻代和年老代是存储动态产生的对象。永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收。我们这里讨论的垃圾回收主要是针对年轻代和年老代。具体如下图。

    原图已失效原图已失效

    年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命周期短的对象尽量留在年轻带。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的对象,比如缓存对象。具体jvm内存回收过程描述如下(可以结合上图):

    1、对象在Eden区完成内存分配

     2、当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收

     3、minorGC时,Eden不能被回收的对象被放入到空的survivor(Eden肯定会被清空),另一个survivor里不能被GC回收的对象也会被放入这个survivor,始终保证一个survivor是空的

     4、当做第3步的时候,如果发现survivor满了,则这些对象被copy到old区,或者survivor并没有满,但是有些对象已经足够Old,也被放入Old区 XX:MaxTenuringThreshold

     5、当Old区被放满的之后,进行fullGC

    在知道垃圾回收机制以后,大家可以在对jvm中堆的各个参数进行优化设置,来提高性能。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. SmartSprites - 命令行形式的CSS Sprites生成器 (累计阅读 123,894)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,156)
  3. android 开发入门 (累计阅读 19,527)
  4. Linux内存点滴 用户进程内存空间 (累计阅读 13,229)
  5. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
  6. HashMap解决hash冲突的方法 (累计阅读 12,654)
  7. Linux Used内存到底哪里去了? (累计阅读 11,867)
  8. Linux操作系统的内存使用方法详细解析 (累计阅读 10,150)
  9. 几个内存相关面试题(c/c++) (累计阅读 9,445)
  10. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,181)