垃圾收集概述
目录
首先从一个经常进行的操作(磁盘碎片整理)开始,随后再逐渐引入垃圾收集的概念
¶从碎片整理看垃圾收集
如果使用过机械硬盘,对于碎片整理应该都不陌生。机械硬盘使用一段时间后最好进行一次磁盘整理,避免磁盘中碎片过多造成存储空间的浪费。其实上述的这个过程与垃圾收集类似,都是为了能够更加高效的使用存储空间,进而对空间进行某些清扫操作
¶垃圾收集从何而来?
垃圾收集,不是 Java 语言的伴生产物,早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生时就已经支持垃圾回收机制。如今,垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。即使经过如此长时间的发展,Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点
✨本文主要讲解垃圾收集的三个经典问题中的第一个问题:哪些内存需要回收
🎶虽然经常将垃圾收集称为 GC,但是在不同的上下文中 GC 指代的含义是不同的,比如本文中的 GC 可能指代的是Garbage Collection
,而如果在讨论垃圾收集算法时,GC 指代的可能时Garbage Collector
,因此需要和特定的上下文进行关联,在后面的文章中不再过多解释
¶为什么需要 GC
🤔为什么需要垃圾回收,如果不进行垃圾回收会怎么样?
📓垃圾收集除了能够堆垃圾的收集和释放之外,也可以清除内存里的记录碎片(类似磁盘碎片整理),将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象
¶其他语言的垃圾收集方案
🤔 GC 拥有如此强大的功能,是否所有的语言都采用了 GC?
1 | MibBridge *pBridge= new cmBaseGroupBridge(); |
📓这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存区间由于程序员编码的问题忘记被回收,那么就会产生内存泄漏,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗内存可能持续上升,直到出现内存溢出并造成应用程序崩溃
¶Java 垃圾收集分析
🆚Java 垃圾收集优劣分析
📓了解 JVM 的自动内存分配和内存回收原理就显得非常重要,只有在真正了解 JVM 是如何管理内存后,才能够在遇见outofMemoryError
时,快速地根据错误异常日志定位问题和解决问题。
¶GC 关注的区域(哪些内存需要回收)
🤔什么是垃圾(哪些内存需要回收)?
📓由于程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,所以这几个区域不需要考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于 JVM 堆和方法区,只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的正是这部分内存
如果更进一步分析,垃圾收集器不仅可以对堆中的年轻代回收,也可以对老年代回收,甚至是全栈和方法区的回收。Java 堆是垃圾收集器的工作重点