第 13 章 垃圾回收概述

1、垃圾收集面试题

回顾 JVM 学习路线

关于垃圾收集

  • 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回收停顿了几次,为什么要停顿两次?

2、为什么需要GC

什么是垃圾?

什么是垃圾(Garbage)呢?

  • 垃圾是指在运行程序中没有任何指针指向的对象这个对象就是需要被回收的垃圾。
  • 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。

磁盘碎片整理

想要学习GC,首先需要理解为什么需要GC?

  • 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。
  • 除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。
  • 随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW (用户线程停止)的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。

3、早期垃圾回收

在早期,开发人员需要手动回收内存

  • 在早期的C/C++时代,垃圾回收基本上是手工进行的。 开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:
 MibBridge *pBridge= new cmBaseGroupBridge();//如果注册失败,使用Delete释放该对象所占内存区域if(pBridge->Register(kDestroy)!=NO ERROR)delete pBridge;
  • 这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存区间由于程序员编码的问题忘记被回收,那么就会产生内存泄漏,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗内存可能持续上升,直到出现内存溢出并造成应用程序崩溃。

  • 有了垃圾回收机制后,上述代码极有可能变成这样

    MibBridge *pBridge=new cmBaseGroupBridge();
    pBridge->Register(kDestroy);
    
  1. 现在,除了Java以外,C#、Python、Ruby等语言都使用了自动垃圾回收的思想,也是未来发展趋势,可以说这种自动化的内存分配和来及回收方式已经成为了线代开发语言必备的标准。

4、Java 垃圾回收机制

4.1、自动内存管理

自动内存管理的优点

Oracle官网关于垃圾回收的介绍

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html


自动内存管理的优点

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

关于自动内存管理的担忧

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

4.2、GC 的作用域

GC 的作用区域

  • 垃圾收集器可以对年轻代回收,也可以对老年代回收,甚至是全栈方法区的回收,其中,Java堆是垃圾收集器的工作重点
  • 从次数上讲:
    • 频繁收集Young区 (新生代)
    • 较少收集Old区 (老年代)
    • 基本不收集Perm区 (永久代/元空间)
  • GC主要关注于方法区堆中的垃圾收集

第 13 章 一 垃圾回收概述相关推荐

  1. 第 14 章 垃圾回收概述

    第 14 章 垃圾回收概述 1.垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集. ...

  2. 第14章 垃圾回收概述

    第14章 垃圾回收概述 来自尚硅谷宋红康老师讲解的JVM:bilibili链接 1 什么是垃圾 Java = (C++)– 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使用内存动态 ...

  3. 第十四章 - 垃圾回收概述

    第十四章 - 垃圾回收概述 文章目录 第十四章 - 垃圾回收概述 1.什么是垃圾 1.1 **大厂面试题** 1.2 什么是垃圾? 2.为什么需要GC 3.早期垃圾回收 4.Java垃圾回收机制 担忧 ...

  4. 编写高性能 .NET 代码 第二章:垃圾回收 基本操作

    基本操作 垃圾回收的算法细节还在不断完善中,性能还会有进一步的提升.下文介绍的内容在不同的.NET版本里会略有不同,但大方向是不会有变动的. 在.net进程里会管理2个类型的内存堆:托管和非托管.本地 ...

  5. JVM3--垃圾回收机制:垃圾回收概述、垃圾回收算法及分类

    一.垃圾回收概述 1.垃圾对象:运行程序中没有任何指针指向的对象 2.垃圾回收区域: 方法区+堆空间        频繁回收Young区        较少回收old区        基本不动Perm ...

  6. 垃圾回收概述(垃圾回收算法)

    垃圾回收概述 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集. 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使 ...

  7. JVM—7—垃圾回收概述及相关算法

    文章目录 一.垃圾回收概述 1.概念 2.什么是垃圾 2.1 什么是垃圾? 2.2 磁盘碎片整理 2.3 大厂面试题 3.为什么需要GC 4.早期垃圾回收 5.Java垃圾回收机制 5.1 优点 5. ...

  8. 垃圾oracle_第 14 章 垃圾回收概述

    第 14 章 垃圾回收都不懂,征服面试官! 1.垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我 ...

  9. 垃圾回收概述,算法及垃圾回收器

    参考2目录 1. 常见面试题 2. 概述 2.1 什么是垃圾 2.2 为什么需要GC(垃圾收集)? 2.3 Java的垃圾回收机制 2.4 垃圾收集主要关注的区域 3. 垃圾回收算法 3.1 判断对象 ...

最新文章

  1. How to set window title name on Oracle EBS Form?
  2. 基于kryo序列化方案的memcached-session-manager多memcached...
  3. ExecutableNotFound: failed to execute ['dot', '-Tsvg'], make sure the Graphviz executables are on yo
  4. ASP.NET Page执行顺序如:OnPreInit()、OnInit()
  5. 在Atom中运行脚本
  6. 通过Java得到的时间与操作系统时间不一致,如何修改Java虚拟机时间?
  7. 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息
  8. 1.3_bubble_sort_冒泡排序
  9. 树莓派3B+64位系统烧制与软件安装
  10. day09 CDN绕过漏洞回链接口探针全网扫描反向邮件
  11. matlab编写LDA,lda算法matlab实现
  12. 虚拟光驱xp版32位_Adobe2018大师版安装说明
  13. Ubuntu下WPS 快捷键、使用方法总结
  14. 可控硅型号怎样识别_可控硅的鉴别
  15. 202109-2 非零段划分
  16. JavaScript学习笔记——基础部分
  17. 汇率,汇率接口,汇率行情数据
  18. 熵值法 java_Java实现熵值法确定权重
  19. 最新青龙拉库命令及监控变量教学
  20. python 中全局变量、局部变量、静态变量,实例变量的区别和理解

热门文章

  1. 如何做一个优秀的团队成员
  2. Codefoeces 581B Luxurious Houses
  3. 【Henu ACM Round#19 B】 Luxurious Houses
  4. Shell脚本之正则表达式以及文本编辑器
  5. SAP案例教程FI财务后台配置
  6. 怒放7——扬笛水墨写意人物画作品赏析
  7. 中国石油大学华东2013-2014-1c语言a卷_答案,中国石油大学(华东)2012—2013学年第二学期期中A卷试卷答案...
  8. 股票筛选。如何查找股票?如何查找潜力股?
  9. HNU计算机系统lab3
  10. 名帖140 启功 楷书《临竹山连句》