重温经典《Thinking in java》第四版之第五章 初始化与清理(三十一)

简介: 重温经典《Thinking in java》第四版之第五章 初始化与清理(三十一)

“5.5.4 垃圾回收器如何工作”,这一小节重点论述了垃圾回收器的作用,以及垃圾回收器在Java中的回收技术介绍。Java语言从1995年到现在已经28年了,垃圾回收器的技术也在不断的更新迭代,可以说是更快,更高和更强了。从业这么久,没有对Java的垃圾回收器技术参数做过配置和优化,也没有排查过垃圾回收器相关的问题,很惭愧。

Java的垃圾回收器(Garbage Collector,GC)是Java运行时环境的一部分,它的主要任务是自动回收程序中不再使用的对象所占用的内存。这个过程通常是自动进行的,无需程序员显式地释放内存。垃圾回收器的工作原理主要依赖于以下几个概念:

1、对象引用:当创建一个对象并赋值给一个变量时,该变量就成为该对象的引用。当没有变量引用该对象时,该对象就被认为无法访问,因此被认为是垃圾数据。

2、根对象:在程序的执行过程中,有一些对象是全局的,或者是其他对象的成员,这些对象被称为根对象。垃圾回收器从根对象开始,找出所有被这些根对象直接或间接引用的对象,这些对象被认为是活动的,而没有被任何根对象引用的对象则被认为是垃圾。

3、垃圾回收算法:Java的垃圾回收器使用了几个经典的垃圾收集算法,包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)和分代收集(Generational Collect)。

标记-清除算法:这是最基础的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器从根对象开始,标记所有可达的对象;在清除阶段,清除所有未被标记的对象。

复制算法:将内存分为两个区域,每次只使用其中一个区域。当这个区域被用满时,就遍历这个区域的所有对象,将所有可达的对象复制到另一个区域中。然后,原区域的所有对象都被认为是垃圾。

标记-整理算法:这是一种结合了标记-清除和复制的算法。在标记阶段,垃圾回收器标记所有可达的对象;在整理阶段,它将所有未被标记的对象移动到一起,并释放它们所占用的空间。

分代收集算法:这种算法基于一个观察:大多数对象很快就会变得无用,而长时间存活的对象往往比短时间存活的对象存活得更久。因此,垃圾回收器将内存分为新生代和老生代两个区域。新创建的对象首先被放在新生代中,随着它们在新生代中的存活时间变长,它们会被逐渐提升到老生代中。

4、垃圾收集器:Java提供了几个不同的垃圾收集器,包括Serial Collector、Parallel Collector、CMS(Concurrent Mark Sweep)Collector和G1(Garbage-First)Collector等。这些垃圾收集器的选择可以在Java运行时环境通过命令行参数进行配置。

 

几个不同的垃圾收集器的区别主要体现在以下几个方面:

1、运行机制:不同的垃圾收集器使用不同的运行机制。例如,Serial收集器使用单线程方式进行垃圾回收,Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU),而CMS等收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。

2、回收策略:不同的垃圾收集器采用不同的回收策略。例如,Serial收集器采用标记整理算法,Parallel Scavenge收集器采用复制算法,而CMS收集器则基于标记清除算法。

3、优化重点:不同的垃圾收集器优化的重点不同。例如,Parallel Scavenge收集器关注点是吞吐量,即CPU中用于运行用户代码的时间与CPU总消耗时间的比值,而Concurrent Mark Sweep收集器则以最短回收停顿时间为目标。

4、适用场景:不同的垃圾收集器适用于不同的场景。例如,Parallel Scavenge收集器适合进行CPU密集型任务的执行,Serial收集器适合单核处理器或低延迟场景,而Concurrent Mark Sweep收集器则适用于需要较高用户响应率的交互式应用。

要想更好的了解回收算法和各种垃圾回收器,还要从Jvm的内存模型学习开始,这一块在《深入理解Java虚拟机》这本书里有详细的介绍,感兴趣的可以找来学学。

目录
相关文章
|
2月前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
2月前
|
存储 Java
如何在 Java 中初始化二维 ArrayList
【8月更文挑战第23天】
58 1
|
2月前
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + "BLACK"`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
|
2月前
|
存储 Java 编译器
如何在 Java 中初始化对象 Arraylist?
【8月更文挑战第23天】
62 0
|
2月前
|
存储 Java 开发工具
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
|
2月前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
41 0
|
2月前
|
Java
Java中 字符串,字符串数组,整型数组初始化
Java中 字符串,字符串数组,整型数组初始化
10 0
|
3月前
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
|
3月前
|
存储 Java 容器
Java数组的初始化方法
Java数组的初始化方法
|
4月前
|
缓存 并行计算 Java
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
下一篇
无影云桌面