【GC 垃圾回收算法和回收器】

news2024/9/17 9:05:44

作者:ofLJli
链接:https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


概述

在JVM中主要的结构为:虚拟机栈、堆、方法区。其中虚拟机栈的栈帧在编译器就已经确定大小的,随着方法的结束或线程的技术,虚拟机栈的内存也随着回收。而Java堆和方法区这两个区域则有很显著的不确定性,这部分内存的分配和回收都是动态的,GC所关注的真是这部分内存该如何管理。

本篇文章就以下三方面GC所要完成的三件事:

  • 什么时候回收?(触发GC的条件)
  • 垃圾回收算法
  • 垃圾回收器

什么时候回收

根据两个分代假说:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收。把堆进行了分代:新生代(Eden、From、To)、老年代,在GC时也进行了分代回收。

image.png

Minor GC: 回收新生代的无使用对象,新生代的对象的特性是大多数是朝生夕死的。触发时机有:

  • Eden区空间不足,触发Minor GC 由于Eden空间大小有限,所以Minor GC触发的更加频繁,这就需要收集算法速度快、效率高,一般使用标记-复制算法对这一区域进行回收(后面讲)。

Major GC:回收老年代的无使用对象。一般使用标记-清除算法标记-整理算法进行回收。

Full GC: 回收堆和方法区的无使用对象。Full GC回收范围比较大,执行的时间较长可能会造成卡顿,所以要尽量减少Full GC的次数。触发时机大致有:

  • 老年代的空间不足 由新生代对象的进入老年代、大对象直接进入老年代等,如果在老年代的最大连续空间上无法存放这些对象时,就会进行一次Full GC回收。

  • 方法区的空间不足 方法区主要存储类型信息和常量池,也有空间不足的风险,会进行Full GC回收

  • System.gc()被显示调用会Full GC回收

三种垃圾收集算法:

1. 标记-清除算法

原理:用可达性分析算法将不可用的对象进行标记,然后对无用的对象进行清除。 缺点:在对象很多的情况下,标记的效率低。清除对象之后会产生内存碎片,内存不连续。 作用:在老年代回收中一些收集器会使用此算法

2. 标记-复制算法

原理:将内存空间一分为二,一半用于对象的存放,一半空闲。如果存放对象的区域满了,使用可达性分析算法把存活的对象移动标记出来,然后复制到另一个空的区域,同时把之前的区域全部清空变成空的连续空间。 缺点:如果存活对象很多,要产品大量的内存复制开辟。内存空间只能用一半优点浪费资源。 作用:在新生代朝生夕死的对象中一般用此回收算法。但新生代中对复制算法进行了优化,但这种算法加入了分配担保机制防止存活对象过多分配不了的情况。使用了一种Appel式的回收算法:

image.png

3. 标记-整理算法

原理:标记的过程跟标记-清除算法一样,然后整理存活的对象往一端移动,然后存活边界之外的对象全部清除。 缺点:移动对象有一定的风险。对象太多效率不高 作用:主要作用在老年代。

image.png

垃圾回收器

GC使用的垃圾收集器进行回收,随着不断的发展,垃圾收集器也越来越多,这里列举常规的垃圾收集器并进行分为三类:单线程收集器、多线程收集器、并发收集器。

单线程收集器

单线程的收集器的组合有:Serial/Serial Old收集器。它们不仅仅用一个收集线程去完成收集操作,而且在收集线程工作的时候,用户线程必须停止等待,直到收集完成为止。如图是Serial/Serial Old收集器示意图:

image.png 如果客户端的内存资源受限,处理器核心数较少或单核处理器来说,其简单高效的可以使收集器最快的工作完。

多线程并行收集器

多线程的收集器有:ParNew、Parallel Scavenge、Parallel Old,其中Parallel Scavenge/Parallel Old为组合收集器。这些多线程收集器仅仅是增加了垃圾收集线程,用户线程依然是停止等待垃圾收集的。

image.png

parNew收集器:其实就是Serial的多线程版本,目前能与Serial收集器和CMS收集器合作。

Parallel Scavenge收集器:一般配合Parallel Old收集器使用。相比于parNew收集器,它更加注重是吞吐量的控制,吞吐量就是用户线程执行的时间占总CPU运行的时间,吞吐量当然是越大越好。

多线程一般用服务端,因为多线程的执行,有时间片轮转的消费时间,如果对于单处理器来说无疑处理效率更慢。但对于资源很好,不用与用户交互的分析运算的服务端却可以增加执行效率。

并发收集器

并发收集器有:CMS收集器,是一款以系统停顿的时间尽量较短,用户体验较好为目标的收集器。它的收集线程可以与用户线程并发执行。CMS有三次的标记(初始标记、并发标记、重新标记)和一次清理(并发清理),在三次的标记中有两次标记需要较短用户线程停止,一次较长的与用户线程并发的标记,和与用户线程并发的清除。

image.png

初始标记:标记GC Roots关联的第一个对象,时间很短 并发标记:和用户线程并发执行GC Roots的引用链(可达性分析算法),时间较长 重新标记:重新查找在并发标记阶段,用户线程运行生成的新的引用链。时间比初始标记长一点。 并发清除:用标记-清除算法把无用对象进行清除。

三大缺点:一:CPU敏感,并发对核心数少的处理器对用户线程的运行可能会造成影响。二:浮动垃圾:在并发清理阶段产生的垃圾只能等下一次GC回收。三:内存碎片,标记-清理法会产品大量的不连续的内存空间。

小结

本文从那些内存需要回收什么时候回收如何回收作为执行分别写出了两个对象存活判断算法、Class区回收的条件、回收的分代机制与收集时机、三个收集算法和常用的垃圾收集器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑桌面文件不见了怎么恢复?需要了解的5个知识和恢复方法!

电脑桌面文件不见了怎么恢复?电脑文件千万条,数据恢复第一条。 当我们发现电脑文件丢失时,切勿着急,只要没有做二次覆盖,丢失的文件还是有机会找回来的。本文整理了电脑误删文件的恢复方法,并提供了一些列…

ZGC在三色指针中的应用

ZGC基于颜色指针的并发处理算法 ZGC初始化之后,整个内存空间的地址视图被设置为Remapped,当进入标记阶段时的视图转变为Marked0(也称为M0)或者Marked1(也称为M1),从标记阶段结束进入转移阶段时…

社区团购小程序源码系统 带完整的安装代码以及搭建部署教程

系统概述 在这个数字化时代,线上活动成为了连接用户与组织者的桥梁。为了满足不同场景的需要,开发一个灵活、可定制的在线活动报名表单小程序显得尤为重要。本文将深入介绍一个自定义在线活动报名表单小程序的源码系统,并提供详细的搭建部署…

sublime中无法找到Package Control或Install Package

在Crtl Shift P 中无法查找到Package Control或Install Package或调用产生报错。 可以尝试在 首选项 ---- > 设置中 检查配置文件"ignored_packages":紧跟的中括号中是否为空,如果不为空请删除其中内容。 如果不确定内容,可以用下面的…

VScode代码对齐快捷键

解决复制过来代码对齐格式问题。 左对齐:Ctrl[ 右对齐:Ctrl]

从零开始做题:logtime

题目 给出1个pcapng文件 解题 wireshark打开题目流量包,在TCP流中发现flag.zip压缩包流量,将flag.zip提取到本地,解压的过程中需要解压密码,接着观察流量 import pyshark import re pcapFilePath logtime.pcapng pcapFilter…

C++基础(十七):模板进阶

前面我们学习过模板,这一节我们对模板进行进阶的学习。 目录 一、非类型模板参数 二、类模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 三、模板的分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 3.…

医院人员管理系统03_下午:C3P0连接池,完成简单的增删改查

文章目录 什么是C3P0项目目录Students.javaC3P0Conn.javaStuDao.java套路代码 什么是C3P0 C3P0连接池要比jdbc更简单,dao层写方法就能看出来 项目目录 Students.java 没有变,直接是jdbc的实体类 跳转我的上一篇文章查看实体类代码 C3P0Conn.java 这…

AmazonS3部署以及nacos配置参数

AmazonS3部署 因为涉及到做的需求的头像的处理,所以需要去找头像的来源,没想到又是我们的老熟人,AmazonS3,巧了已经是第二次用了,上次我是用的别人的工具类去干的,这一次我这边自己编辑具体工具类型。 对应…

敏捷专家CSM认证培训内容概述(附2024年开班时间表)

敏捷专家CSM认证培训是专为希望在Scrum项目中担任Scrum Master角色的个人而设计的专业培训。CSM认证,全称Certified Scrum Master,是敏捷开发领域中备受认可的证书,由Scrum Alliance颁发。以下是对敏捷专家CSM认证培训的详细介绍:…

solidity实战练习1

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; contract PiggyBank{constructor()payable{emit Deposit(msg.value);//触发事件1//意味着在部署合约的时候,可以向合约发送以太币(不是通过调用函数,而是直接在部署合约时发送&#…

JAVA中的回溯算法解空间树,八皇后问题以及骑士游历问题超详解

1.回溯算法的概念 回溯算法顾名思义就是有回溯的算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法&#xff…

Python 神器:wxauto 库——解锁微信自动化的无限可能

📝个人主页🌹:誓则盟约 ⏩收录专栏⏪:机器学习 🤡往期回顾🤡:“探索机器学习的多面世界:从理论到应用与未来展望” 🌹🌹期待您的关注 🌹&#x1f…

短视频矩阵:批量发布的秘密揭秘

在数字化时代,短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作,短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而,有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…

【Django】报错‘staticfiles‘ is not a registered tag library

错误截图 错误原因总结 在django3.x版本中staticfiles被static替换了,所以这地方换位static即可完美运行 错误解决

旧衣回收小程序开发,提高回收效率,实现创收

随着人们生活水平的提高,对穿衣打扮也越来越重视,衣服更换频率逐渐增高,旧衣回收行业因此产生,并随着市场规模的扩大,拥有了完善的回收产业链, 旧衣回收行业的发展不仅能够让大众获得新的赚钱方式&#xf…

探索创意无限:精彩APP启动页设计案例汇总

启动页是应用启动时出现的过渡页面或动画,旨在提升用户体验、缓解用户焦虑,以及传递品牌或产品的人情味。根据应用性能,其停留时间可能从1秒到3秒不等。启动页同样是应用名片,需要展现品牌的独特个性。运用品牌颜色和 IP 形象能加…

C语言 指针和数组——指针数组的应用:命令行参数

目录 命令行参数 演示命令行参数与main函数形参间的关系 命令行参数  什么是 命令行参数( Command Line Arguments )?  GUI 界面之前,计算机的操作界面都是字符式的命令行界面 ( DOS 、 UNIX 、 Linux &…

215.Mit6.S081-实验三-page tables

在本实验室中,您将探索页表并对其进行修改,以简化将数据从用户空间复制到内核空间的函数。 一、实验准备 开始编码之前,请阅读xv6手册的第3章和相关文件: kernel/memlayout.h,它捕获了内存的布局。kernel/vm.c&…

什么是渲染:两种渲染类型、工作原理

如果您是网页设计师或数字艺术家,您可能熟悉渲染过程的概念。这是数字艺术中的重要步骤,帮助您将图形模型转换为最终结果。在本文中,您将了解数字艺术中的渲染是什么、它的工作原理以及它的类型。 一、什么是渲染? 渲染是使用计算机软件对数…