Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

在这个快速教程中,我们将展示不同的基础知识JVM垃圾收集(GC)实现。此外,我们还将了解如何在应用程序中启用特定类型的垃圾收集。

2.垃圾收集的简要介绍

从名字上看,好像垃圾收集处理从内存中查找和删除垃圾。然而,在现实中,垃圾收集跟踪JVM堆空间中的每个可用对象,并删除未使用的对象。

简单的单词,GC只需两个简单的步骤,即标记和清除:

  • 马克-在这里,垃圾收集器标识哪些内存正在使用,哪些没有使用
  • 扫描-此步骤删除“标记”阶段中标识的对象

优点:

  • 没有手动的内存分配/回收处理,因为未使用的内存空间被自动处理GC
  • 无装卸费用悬空指针
  • 自动内存泄漏管理(GC它自己不能保证内存泄漏的完整解决方案,但是,它会处理它的很大一部分)

缺点:

  • JVM必须跟踪对象引用的创建/删除,除了原始应用程序,这个活动需要更多的CPU功耗。它可能会影响需要大量内存的请求的性能
  • 程序员无法控制用于释放不再需要的对象的CPU时间调度
  • 使用某些GC实现可能会导致应用程序不可预测地停止
  • 自动化的内存管理不会像正确的手动内存分配/回收那样有效

3.GC实现

JVM有四种类型GC实现:

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS垃圾收集器
  • G1垃圾收集器

3.1。串行垃圾收集器

这是最简单的GC实现,因为它基本上只使用一个线程。作为一个结果,GC实现在运行时冻结所有应用程序线程。因此,在多线程应用程序(如服务器环境)中使用它不是一个好主意。

然而,有一个优秀的谈话通过推特工程师在QCon 2012上的表现串行垃圾收集器-这是更好地理解这个收集器的好方法。

串行GC是大多数应用程序的垃圾收集器的选择,这些应用程序没有较小的暂停时间要求,并且运行在客户机风格的机器上。要启用串行垃圾收集器,我们可以使用下面的参数:

java -XX:+UseSerialGC -jar Application.java

3.2。并行垃圾收集器

这是默认的GCJVM有时称为吞吐量收集器。不像串行垃圾收集器,这使用多个线程管理堆空间。但它也会在执行时冻结其他应用程序线程GC

如果我们用这个GC,我们可以指定最大的垃圾收集线程和暂停时间、吞吐量和内存占用(堆大小)。

垃圾收集器线程的数量可以通过命令行选项控制- xx: ParallelGCThreads = < N >

两个之间的最大暂停时间目标(间隔[以毫秒计])GC)用命令行选项指定- xx: MaxGCPauseMillis = < N >

最大吞吐量目标(通过花费在垃圾收集上的时间与花费在垃圾收集之外的时间来度量)由命令行选项指定- xx: GCTimeRatio = < N >。

使用该选项指定最大堆占用空间(程序运行时需要的堆内存数量)- xmx < N >。

要启用并行垃圾收集器,我们可以使用下面的参数:

java -XX:+UseParallelGC -jar Application.java

3.3。CMS垃圾收集器

同步标记扫描(CMS)实现使用多个垃圾收集器线程进行垃圾收集。它专为喜欢更短的垃圾收集暂停的应用程序设计,并且能够在应用程序运行时与垃圾收集器共享处理器资源。

简单地说,使用这种类型GC的应用程序平均响应较慢,但不会因为执行垃圾收集而停止响应。

这里需要注意的一点是GC是并发的,调用显式垃圾收集如使用system . gc ()当并发进程正在工作时,将导致并发模式故障/中断

如果超过98%的时间是花在CMS垃圾收集和小于2%的堆被恢复,然后OutOfMemoryError是由CMS收集器。如果需要,可以通过添加选项禁用该特性- xx: -UseGCOverheadLimit到命令行。

这个收集器还有一种增量模式,这种模式在Java SE 8中已被弃用,并可能在未来的主要版本中被删除。

要启用CMS垃圾收集器,我们可以使用以下标志:

java -XX:+UseParNewGC -jar Application.java

从Java 9开始, CMS垃圾回收器已弃用。因此,如果我们尝试使用它,JVM会打印一条警告消息:

警告:选项UseConcMarkSweepGC在9.0版本中已被弃用,可能在未来的版本中被删除。java版本“9.0.1”

此外,Java 14完全放弃CMS支持:

java -XX:+UseConcMarkSweepGC——version OpenJDK 64位服务器虚拟机警告:忽略选项UseConcMarkSweepGC;支持在14.0 openjdk 14 2020-03-17中被删除

3.4。G1垃圾收集器

G1(垃圾优先)垃圾收集器是为运行在具有大内存空间的多处理器机器上的应用程序而设计的。它是可用的自JDK7更新4在以后的版本中。

G1收集器将取代CMS收集器,因为它的性能效率更高。

不像其他的收藏家,G1收集器将堆划分为一组大小相同的堆区域,每个区域都是连续的虚拟内存范围。在执行垃圾收集时,G1显示一个并行的全局标记阶段(即称为标记)确定整个堆中对象的活动状态。

标记阶段完成后,G1知道哪些区域大部分是空的。它首先聚集在这些区域,这通常会产生大量的空闲空间(即称为全面)。这就是为什么这种垃圾收集方法被称为垃圾优先。

要启用G1垃圾收集器,我们可以使用下面的参数:

java -XX:+UseG1GC -jar Application.java

3.5。Java 8变化

Java 8 u20又介绍了一个JVM参数,通过创建太多相同的实例来减少不必要的内存使用字符串。这通过删除重复项来优化堆内存字符串值到全局单个char []数组中。

该参数可以通过添加来启用- xx: + UseStringDeduplication作为一个JVM参数。

4.结论

在这个快速教程中,我们看看不同的JVM的垃圾收集实现及其用例。

可以找到更详细的文档在这里

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
本文评论关闭!