5.认识JVM-垃圾收集器

目录

1.认识JVM之Classfile:https://www.cnblogs.com/nuti/p/16270652.html

2.认识JVM之类加载机制:https://www.cnblogs.com/nuti/p/16270672.html

3.认识JVM之运行时数据区: https://www.cnblogs.com/nuti/p/16270703.html

4.认识JVM之编译器: https://www.cnblogs.com/nuti/p/16270741.html

5.认识JVM之垃圾收集器: https://www.cnblogs.com/nuti/p/16270755.html

6.认识JVM之JVM内存模型: https://www.cnblogs.com/nuti/p/16270816.html

 

书接上文,https://www.cnblogs.com/nuti/p/16270741.html

这次到了垃圾收集器

 

 了解垃圾设计器之前先知道什么是垃圾收集算法?

0.整体描述

垃圾收集器他会对运行时数据区的内容进行收集,并不是只是对堆内存进行收集
  • javaThreads java虚拟机栈他的生命周期比较短一般随着线程的结束而结束
  • 方法区里面存的是模板信息会被java对象/类加载器...所用到,他这里发生回收条件过于严苛
所以一般说的都是针对于堆的垃圾收集

1.确认垃圾对象

1.1.引用计数法

对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾
0
但是他有个问题。如果发生了循环引用呢?
0
所以他存在这个问题 虚拟机里面也不是推荐使用的 他也没有默认使用

1.2.可达性分析

通过GC Root的对象,开始向下寻找,看某个对象是否可达。
0
也就是GC Root能访问到的就不是垃圾 访问不到就是垃圾
那么GC Root是什么?
类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等
以虚拟机栈的本地变量表为例子
java虚拟机栈的栈帧,他的局部变量表的引用指向的是堆中的地址,那么这个局部变量也能作为一个gc root
0
方法区静态变量 或者 本地方法栈中引用了栈中的变量 这些都是gc root
通过可达性分析 直接引用或者间接引用可以标记出哪些是reachable 或者 unreachable
0
既然知道哪些是垃圾 哪些不是垃圾之后 就可以开始垃圾收集了

2.垃圾收集算法

2.1.标记-清除

0
缺点:
    1. 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
    2. 标记和清除两个过程都比较耗时,效率不高
    3. 会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作
 

2.2.标记-整理

0
针对上一种情况很好的解决了空间碎片的问题 但是这样整理肯定比上一种方法造成很多的时间消耗

2.3.标记-复制

0
缺点
  1. 存在大量的复制操作,效率会降低
  2. 空间利用率降低
针对上面这三种的最基础的算法 其实可以根据young区和old区不同的特性进行不同的选择
比如
Young区:复制算法(对象在被分配之后,可能生命周期比较短,Young区复制效率比较高)
Old区:标记清除或标记整理(Old区对象存活时间比较长,复制来复制去没必要,不如做个标记再清理)
当然这都是最基础的算法,不需要我们去实现,我们就选择对应的垃圾收集器就行了

 垃圾收集器

垃圾收集器:对于上诉垃圾算法的落地
parallel GC是jdk8的默认使用的收集器 新老年代都用的是他
CMS和G1用的相对多一点
g1 从java7开始 java9之后 就是默认的收集器了
jdk8的官网
jdk17的官网地址
The discussion to this point has been about the serial collector. The Java HotSpot VM includes three different types of collectors, each with different performance characteristics.
关于这一点的讨论都是关于串行收集器的。Java HotSpot VM包含三种不同类型的采集器,每种采集器具有不同的性能特征

Serial Collector

The serial collector uses a single thread to perform all garbage collection work, which makes it relatively efficient because there is no communication overhead between threads.
串行收集器使用单个线程执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。
这个收集器是九几年的当初java是用于嵌入形设备 适用于cpu核心数少内存比较小的100MB
Serical的收集过程,它适用于新老年代
0

Parallel Collector

The parallel collector is also known as throughput collector, it's a generational collector similar to the serial collector. The primary difference between the serial and parallel collectors is that the parallel collector has multiple threads that are used to speed up garbage collection
并行收集器也称为吞吐量收集器,它是类似于串行收集器的分代收集器。串行收集器和并行收集器之间的主要区别是,并行收集器有多个用于加速垃圾收集的线程
 
适用于新老年代
新生代:复制算法 老年代:标记整理算法
0
 

Concurrent Mark Sweep (CMS) Collector

The Concurrent Mark Sweep (CMS) collector (also referred to as the concurrent low pause collector) collects the tenured generation. It attempts to minimize the pauses due to garbage collection by doing most of the garbage collection work concurrently with the application threads. Normally the concurrent low pause collector does not copy or compact the live objects. A garbage collection is done without moving the live objects. If fragmentation becomes a problem, allocate a larger heap.
并发标记扫描(CMS)收集器(也称为并发低暂停收集器)收集年老代。它试图通过与应用程序线程并发地执行大部分垃圾收集工作来最小化垃圾收集造成的暂停。通常,并发低暂停收集器不会复制或压缩活动对象。垃圾收集在不移动活动对象的情况下完成。如果碎片成为一个问题,分配一个更大的堆
由于停顿时间比较短500ms以上 适用:老年代
采用标记-清除算法 【有空间碎片问题】
0

Garbage-First (G1) Garbage Collector

It provides the capability to meet a pause-time goal with high probability, while achieving high throughput.
它提供了以高概率满足暂停时间目标的能力,同时实现高吞吐量
G1 is selected by default on most hardware and operating system configurations, or can be explicitly enabled using -XX:+UseG1GC 
大多数硬件和操作系统配置默认选择G1,或者可以使用-XX:+UseG1GC显式启用
新生代:标记-复制  老年代:标记-整理
0
 

The Z Garbage Collector

The Z Garbage Collector (ZGC) is a scalable low latency garbage collector. ZGC performs all expensive work concurrently, without stopping the execution of application threads
Z垃圾收集器(ZGC)是一个可伸缩的低延迟垃圾收集器。ZGC并发地执行所有昂贵的工作,而不停止应用程序线程的执行。
ZGC provides max pause times of a few milliseconds, but at the cost of some throughput. It is intended for applications
ZGC提供了几毫秒的最大暂停时间,但以牺牲一些吞吐量为代价
 
Z GC的垃圾收集器的停顿时间做到了几毫米 但是牺牲了吞吐量
 

垃圾收集器总结

  • 串行:只有一个垃圾收集线程执行Serial
  • 并行:有多个垃圾收集线程执行,业务代码线程不执行Parallel GC更加关注吞吐量
  • 并发:垃圾收集线程和业务代码线程会共同执行﹐CMS、G1、ZGC更加关注停顿时间
0
 
 
posted @ 2022-05-14 17:34  Nuti  阅读(38)  评论(0编辑  收藏  举报