JVM-堆

堆的内存结构

Java堆(Heap)是Java虚拟机中内存管理的一个重要区域,主要存放对象的实例和数组

新生代:内存被划分为Eden区和两个幸存者区(from和to)

  • 默认情况下,Eden区与两个Survivor区的比例是8:1:1
  • 这种划分基于经验,目的主要是优化垃圾回收的性能

工作流程:

  • 当一个对象被创建时,会放到Eden区域,当Eden区即将存满时,做一次垃圾回收(Minor GC)
    • 将当前存活的对象复制到from区,随后将Eden区清空
  • 当Eden区下一次存满时,再做一次垃圾回收(这时from区也存满了)
    • 先将存活的对象复制到to区,再把Eden区和from区的所有对象进行回收
  • 当Eden区再一次存满时,再做一次垃圾回收
    • 将存活的对象复制到from区,再把Eden区和to区的所有对象进行回收

所以,新生代垃圾回收采用的是复制算法

老年代:当一个对象经过新生代15次垃圾回收的操作,依旧存活,就会被移动到老年代

至于为什么是15次?可以去看下对象头的结构图,看懂后,你就知道了,这里就不涉及了

  • 老年代中对象生命周期较长,因此垃圾回收发生的频率很低
  • 老年代垃圾回收的执行时间较长,因为老年代占用的空间比新生代大

垃圾回收(根据回收区域不同)

Minor GC

  • 作用区域:仅针对新生代进行垃圾回收
  • 触发条件:当Eden区满时,会触发Minor GC
  • 特点:
    • 因为大多数新创建的对象都被分配在Eden区,所以Minor GC非常频繁
    • 由于新生代中的对象大多生命周期较短,因此回收速度较快,停顿时间较短

Major GC

  • 概念澄清:实际上,"Major GC"这个术语并不如Minor GC或Full GC那样明确,在一些资料中它指的是对老年代(Old Generation)的垃圾回收。但是,更常见的是使用"Old GC"来描述这一过程
  • 作用区域:主要针对老年代
  • 触发条件:通常是老年代空间不足时触发
  • 特点:相比Minor GC,Major GC发生得不那么频繁,但因为需要扫描并回收整个老年代,其执行时间较长,导致应用程序暂停的时间也相对较长

Full GC:

  • 作用区域:涉及整个堆空间的垃圾回收,包括新生代、老年代以及永久代/元空间(Metaspace,在Java 8之后替代了永久代)
  • 触发条件:
    • 当老年代或者元空间空间不足时,可能会触发Full GC
    • 显式调用System.gc()也可能触发(虽然这并不是强制性的,取决于具体的JVM实现和参数设置)
  • 特点:
    • Full GC是最耗时的操作之一,因为它需要处理整个堆内存,可能导致应用出现明显的停顿
    • 频繁的Full GC通常是性能问题的信号,应该尽量避免
相关推荐
折哥的程序人生 · 物流技术专研1 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
Moment2 小时前
面试官:如果产品经理给你多个需求,怎么让AI去完成❓❓❓
前端·后端·面试
每天进步一点_JL2 小时前
JVM 内存模型与 OOM 排查:从入门到实战
后端
REDcker3 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
Supersist3 小时前
【设计模式03】使用模版模式+责任链模式优化实战
后端·设计模式·代码规范
Fox爱分享3 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
折哥的程序人生 · 物流技术专研3 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
Mahir083 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试
L0CK4 小时前
Redis 内存淘汰策略
后端
zhengzizhe4 小时前
ReBAC 与 Google Zanzibar:权限系统的未来
后端·架构