所谓垃圾是指对象已经结束了它在运行态下的生命周期,但是依然占据着运行态下堆内存的空间。此时,就需要对该对象所占用的堆内存空间进行回收,以分配给新的待创建的对象。在 Java 中,垃圾内存的回收是由 JVM 自动完成的,但是深入掌握 GC,依然是我们写出安全、可靠、高性能的 Java 程序的基础。
什么是 GC?
GC 是 Garbage Collection 的缩写,中文叫做垃圾回收。它是一种自动化的内存管理机制,能够识别和回收不再使用的内存空间。在 Java 里,JVM 负责 GC。通过这种方式,Java 程序员无需手动进行内存的分配和回收,从而降低了内存泄漏的风险,提高了开发效率。
在 JVM 实现里,虚拟机栈、本地方法栈、程序计数器和线程同生灭,伴随着线程的退出,同步进行着所占用内存的自动清理。所以 , JVM 里的内存垃圾回收主要应用于堆区和方法区所对应的内存空间的管理,在程序的运行态下,这部分内存的分配、使用和回收都是动态的。
GC 用来做什么?
GC 的主要目标是借助以下三种方式帮助我们提高程序的运行效率和开发效率。
-
减少内存泄漏注意,这里说的是减少而不是消除,内存泄漏是生产实践中经常会遇到的比较严重的问题,各种因素都可能会引发内存泄漏,但是 JVM 的自动识别和内存回收机制,能够帮助我们有效地降低内存泄漏的风险。
-
提升内存利用率
GC 通过不断回收不再使用的内存空间,实现了提高内存利用率的效果。 -
降低内存管理成本
GC 被发明之前,开发者是需要自己手动管理内存的分配和释放的,而随着 GC 的诞生,这一部分职责交由底层 JVM 负责,从而有效地减轻了开发者的负担,提升了开发效率。
GC 的主要步骤
虽然垃圾回收器种类繁多,但垃圾回收的过程基本一致,主要是 4 个阶段:分别是标记(Mark)、清除(Sweep)、整理(Compact)、再分配(Allocation)。
标记
这个阶段的目标是确定哪些对象是“活动”的,或者说是正在被使用的,哪些对象是“垃圾”,也就是不再被使用了。垃圾回收器会遍历 Java 堆内存里所有的对象,通过引用关系来判断对象是否存活。确认可回收对象确认一个对象是否可以被回收,通常有两种解决方案,分别是引用计数法和可达性算法。
此文章为9月Day19学习笔记,内容来源于极客时间《云时代JVM实战 》,强烈推荐该课程
网友评论