笔记 笔记
首页
  • 开发工具
  • Java Web
  • Java 进阶
  • 容器化技术
  • Java 专栏

    • Java 核心技术面试精讲
    • Java 业务开发常见错误 100 例
  • 数据库专栏

    • MySQL 实战 45 讲
    • Redis 核心技术与实战
  • 安全专栏

    • OAuth 2.0 实战课
  • 计算机系统
  • 程序设计语言
  • 数据结构
  • 知识产权
  • 数据库
  • 面向对象
  • UML
  • 设计模式
  • 操作系统
  • 结构化开发
  • 软件工程
  • 计算机网络
  • 上午题错题
在线工具 (opens new window)

EasT-Duan

Java 开发
首页
  • 开发工具
  • Java Web
  • Java 进阶
  • 容器化技术
  • Java 专栏

    • Java 核心技术面试精讲
    • Java 业务开发常见错误 100 例
  • 数据库专栏

    • MySQL 实战 45 讲
    • Redis 核心技术与实战
  • 安全专栏

    • OAuth 2.0 实战课
  • 计算机系统
  • 程序设计语言
  • 数据结构
  • 知识产权
  • 数据库
  • 面向对象
  • UML
  • 设计模式
  • 操作系统
  • 结构化开发
  • 软件工程
  • 计算机网络
  • 上午题错题
在线工具 (opens new window)

购买兑换码请添加

添加时候请写好备注,否则无法通过。

  • 设计模式

  • JVM 详解

    • JVM 与 Java 体系结构
    • 类加载子系统
    • 运行时数据区
    • 程序计数器
    • 虚拟机栈
    • 本地方法接口
    • 本地方法栈
    • 堆
    • 方法区
    • 对象的实例化内存布局与访问定位
    • 直接内存
    • 执行引擎
    • StringTable
    • 垃圾回收概述
      • 垃圾回收的概述
      • 面试题
      • 什么是垃圾
      • 为什么需要 GC
      • 早期垃圾回收
      • Java 垃圾回收机制
        • 自动内存管理
      • 应该关注的区域
    • 垃圾回收算法
    • 垃圾回收概念
    • 垃圾回收器
  • Linux

  • Redis

  • 分布式锁

  • Shiro

  • Gradle

  • Java 进阶
  • JVM 详解
EasT-Duan
2024-04-18
目录

垃圾回收概述

欢迎来到我的 ChatGPT 中转站,极具性价比,为付费不方便的朋友提供便利,有需求的可以添加左侧 QQ 二维码,另外,邀请新用户能获取余额哦!最后说一句,那啥:请自觉遵守《生成式人工智能服务管理暂行办法》。

# 垃圾回收的概述

Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C++ 语言没有垃圾收集技术,需要程序员手动的收集。

垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生。

关于垃圾收集有三个经典问题:

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?

垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。

# 面试题

蚂蚁金服

  1. 你知道哪几种垃圾回收器,各自的优缺点,重点讲一下 CMS 和 G1?
  2. JVM GC 算法有哪些,目前的 JDK 版本采用什么回收算法?
  3. G1 回收器讲下回收过程 GC 是什么?为什么要有 GC?
  4. GC 的两种判定方法?CMS 收集器与 G1 收集器的特点

百度

  1. 说一下 GC 算法,分代回收说下
  2. 垃圾收集策略和算法

天猫

  1. JVM GC 原理,JVM 怎么回收内存
  2. CMS 特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么?

滴滴

  1. Java 的垃圾回收器都有哪些,说下 G1 的应用场景,平时你是如何搭配使用垃圾回收器的

京东

  1. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下 CMS 和 G1,
  2. 包括原理,流程,优缺点。垃圾回收算法的实现原理

阿里

  1. 讲一讲垃圾回收算法。
  2. 什么情况下触发垃圾回收?
  3. 如何选择合适的垃圾收集算法?
  4. JVM 有哪三种垃圾回收器?

字节跳动

  1. 常见的垃圾回收器算法有哪些,各有什么优劣?
  2. System.gc () 和 Runtime.gc () 会做什么事情?
  3. Java GC 机制?GC Roots 有哪些?
  4. Java 对象的回收方式,回收算法。
  5. CMS 和 G1 了解么,CMS 解决什么问题,说一下回收的过程。
  6. CMS 回收停顿了几次,为什么要停顿两次?

# 什么是垃圾

垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。

如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。

# 为什么需要 GC

对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。

除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象。

随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有 GC 就不能保证应用程序的正常进行。而经常造成 STW 的 GC 又跟不上实际的需求,所以才会不断地尝试对 GC 进行优化。

# 早期垃圾回收

在早期的 C/C++ 时代,垃圾回收基本上是手工进行的。开发人员可以使用 new 关键字进行内存申请,并使用 delete 关键字进行内存释放。比如以下代码:

MibBridge *pBridge= new cmBaseGroupBridge();
//如果注册失败,使用Delete释放该对象所占内存区域
if(pBridge->Register(kDestroy)!=NO ERROR)
	delete pBridge;
1
2
3
4

这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存区间由于程序员编码的问题忘记被回收,那么就会产生内存泄漏,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗内存可能持续上升,直到出现内存溢出并造成应用程序崩溃。

现在,除了 Java 以外,C#、Python、Ruby 等语言都使用了自动垃圾回收的思想,也是未来发展趋势,可以说这种自动化的内存分配和来及回收方式已经成为了现代开发语言必备的标准。

# Java 垃圾回收机制

# 自动内存管理

官网介绍:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide, Release 8 (oracle.com) (opens new window)。

自动内存管理的优点

  • 自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险。
  • 没有垃圾回收器,java 也会和 cpp 一样,各种悬垂指针,野指针,泄露问题让你头疼不已。
  • 自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发。

关于自动内存管理的担忧

  • 对于 Java 开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于 “自动”,那么这将会是一场灾难,最严重的就会弱化 Java 开发人员在程序出现内存溢出时定位问题和解决问题的能力。
  • 此时,了解 JVM 的自动内存分配和内存回收原理就显得非常重要,只有在真正了解 JVM 是如何管理内存后,我们才能够在遇见 OutofMemoryError 时,快速地根据错误异常日志定位问题和解决问题。
  • 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些 “自动化” 的技术实施必要的监控和调节。

# 应该关注的区域

  1. 垃圾收集器可以对年轻代回收,也可以对老年代回收,甚至是全栈和方法区的回收。
  2. 其中,Java 堆是垃圾收集器的工作重点。

在频次上:

  • 年轻代(Young 区)的回收是最频繁的,因为大部分对象都是在年轻代中创建的,而且许多对象的生命周期都很短。
  • 老年代(Old 区)的回收较少,因为只有经过多次年轻代回收仍然存活的对象才会被移动到老年代,所以老年代中的对象通常生命周期较长。
  • 永久代(Perm 区)或者元空间的回收基本不进行,因为这些区域存储的是 Java 类和方法的元数据,这些数据通常在程序运行期间不会被释放。
#JVM
上次更新: 2025/04/12, 05:37:39
StringTable
垃圾回收算法

← StringTable 垃圾回收算法→

最近更新
01
Reactor 核心
02-24
02
前置条件
10-30
03
计算机网络
09-13
更多文章>
Theme by Vdoing | Copyright © 2019-2025 powered by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式