第 14 章 垃圾回收都不懂,驯服面试官!
1、垃圾收集面试题
回顾 JVM 学习路线
对于垃圾收集
- Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C 语言没有垃圾收集技术,须要咱们手动的收集。
- 垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始应用内存动态分配和垃圾收集技术的 Lisp 语言诞生。
-
对于垃圾收集有三个经典问题:
- 哪些内存须要回收?
- 什么时候回收?
- 如何回收?
- 垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。现在,垃圾收集简直成为古代语言的标配,即便通过如此长时间的倒退,Java 的垃圾收集机制依然在一直的演进中,不同大小的设施、不同特色的利用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。
瞅瞅大厂面试题
蚂蚁金服
- 你晓得哪几种垃圾回收器,各自的优缺点,重点讲一下 CMS 和 G1?
- JVM GC 算法有哪些,目前的 JDK 版本采纳什么回收算法?
- G1 回收器讲下回收过程 GC 是什么?为什么要有 GC?
- GC 的两种断定办法?CMS 收集器与 G1 收集器的特点
百度
- 说一下 GC 算法,分代回收说下
- 垃圾收集策略和算法
天猫
- JVM GC 原理,JVM 怎么回收内存
- CMS 特点,垃圾回收算法有哪些?各自的优缺点,他们独特的毛病是什么?
滴滴
- Java 的垃圾回收器都有哪些,说下 G1 的利用场景,平时你是如何搭配应用垃圾回收器的
京东
- 你晓得哪几种垃圾收集器,各自的优缺点,重点讲下 CMS 和 G1,
- 包含原理,流程,优缺点。垃圾回收算法的实现原理
阿里
- 讲一讲垃圾回收算法。
- 什么状况下触发垃圾回收?
- 如何抉择适合的垃圾收集算法?
- JVM 有哪三种垃圾回收器?
字节跳动
- 常见的垃圾回收器算法有哪些,各有什么优劣?
- System.gc() 和 Runtime.gc() 会做什么事件?
- Java GC 机制?GC Roots 有哪些?
- Java 对象的回收形式,回收算法。
- CMS 和 G1 理解么,CMS 解决什么问题,说一下回收的过程。
- CMS 回收进展了几次,为什么要进展两次?
2、为什么须要 GC
什么是垃圾?
什么是垃圾(Garbage)呢?
- 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是须要被回收的垃圾。
- 外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.
- 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会始终保留到应用程序完结,被保留的空间无奈被其余对象应用。甚至可能导致内存溢出。
磁盘碎片整顿
想要学习 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);
- 当初,除了 Java 以外,C#、Python、Ruby 等语言都应用了主动垃圾回收的思维,也是将来发展趋势,能够说这种自动化的内存调配和来及回收形式曾经成为了线代开发语言必备的规范。
4、Java 垃圾回收机制
4.1、主动内存治理
主动内存治理的长处
Oracle 官网对于垃圾回收的介绍
https://docs.oracle.com/javas…
主动内存治理的长处
- 主动内存治理,无需开发人员手动参加内存的调配与回收,这样升高内存透露和内存溢出的危险
- 没有垃圾回收器,java 也会和 cpp 一样,各种悬垂指针,野指针,泄露问题让你头疼不已。
- 主动内存管理机制,将程序员从沉重的内存治理中释放出来,能够更分心地专一于业务开发
对于主动内存治理的担心
- 对于 Java 开发人员而言,主动内存治理就像是一个黑匣子,如果适度依赖于 ” 主动 ”,那么这将会是一场劫难,最重大的就会弱化 Java 开发人员在程序呈现内存溢出时定位问题和解决问题的能力。
- 此时,理解 JVM 的主动内存调配和内存回收原理就显得十分重要,只有在真正理解 JVM 是如何治理内存后,咱们才可能在遇见 OutofMemoryError 时,疾速地依据谬误异样日志定位问题和解决问题。
- 当须要排查各种内存溢出、内存透露问题时,当垃圾收集成为零碎达到更高并发量的瓶颈时,咱们就必须对这些 ” 自动化 ” 的技术施行必要的监控和调节。
4.2、GC 的作用域
GC 的作用区域
- 垃圾收集器能够对年老代回收,也能够对老年代回收,甚至是全栈和办法区的回收,其中,Java 堆是垃圾收集器的工作重点
-
从次数上讲:
- 频繁收集 Young 区
- 较少收集 Old 区
- 根本不收集 Perm 区(元空间)
- GC 次要关注于办法区和堆中的垃圾收集
你只管学习,我来负责记笔记???? 关注公众号!, 更多笔记,等你来拿,谢谢