谈一谈JVM的GC(垃圾回收)

JVM(Java Virtual Machine)的GC(Garbage Collection,垃圾回收)是Java语言的一个重要特性,它负责自动管理内存,释放那些不再被使用的对象所占用的内存空间。以下是对JVM GC的详细介绍:

  1. GC的基本概念
    定义:GC即垃圾回收,是指JVM用于释放那些不再被使用的对象所占用的内存。
    目的:清除不再使用的对象,防止内存泄漏,提高内存利用率。
  2. GC的工作原理
    JVM通过两种主要方法来识别垃圾对象:

引用计数:虽然这种方法简单有效,但存在循环引用的问题,因此在现代JVM中较少使用。
可达性分析:JVM使用的主流方法。以根集合(如栈上的局部变量、静态变量等)为起点,通过引用链遍历对象图,所有可达的对象都被视为存活对象,其余则为垃圾对象。

  1. GC算法

主要垃圾回收算法有3种,分别是标记清除算法、标记复制算法、标记整理算法。

(1)标记清除算法:算法核心原理,它会给所有存活对象打上标记,那么没有被标记的对象,就是需要被回收的垃圾对象,这些垃圾对象会被垃圾回收器直接回收。这种算法会产生比较多的内存碎片,而且这些内存碎片,会随着系统运行时间的增长,出现无法分配空间或连续的内存空间,会导致更加频繁的GC操作。另外这种方式清理出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表。
在这里插入图片描述

(2)标记复制算法:它把内存分为两等份,每次只需要使用其中的一份,等到正在使用的这份存满之后,它就会标记出存活的对象,然后再把现在存活的对象,拷贝到另外一份闲置的内存中,被留在原来那块内存中的对象,就会全部被垃圾回收器回收。原来闲置的那个内存空间就会变成正在使用的状态。原来使用的那块内存经垃圾回收后,就变成闲置的内存等待继续使用。这就是标记复制算法一次完整的垃圾回收过程。标记复制算法会一直重复这个循环。这种算法实际使用的内存只占50%,另外50%是闲置的,比较浪费内存空间。如果存在大量复制对象,垃圾回收的耗时会比较长。这种算法更适合处理一些活动对象比较少,垃圾对象比较多的场景,所以适用于新生代(速度快,效率高)。
在这里插入图片描述

(3)标记整理算法:它先标记出存活的对象,然后把所有的存活对象,整理到内存的另外一端,没有被标记的对象就是可以被覆盖,或是被释放。这样就解决了空间碎片化问题,但从垃圾收集和清理效率来看,增加了一个移动的动作,所以耗时会更久。此算法适合老年代。
在这里插入图片描述

  1. 分代收集(Generational Collection)

因为 Java 对象基本上都是临时的对象,很快就会被回收,所以JVM 的内存是分代设计的,根据对象在内存中的存活时间,分为年轻代、老年代、永久代。年轻代采用的是标记复制算法,在每次复制的时候,存活下来的对象会很少。而老年代是经历过几次GC的对象,JVM 会认为它可能会继续存活下去,不大适合去采用标记复制算法,所以老年代采用的是标记清除算法或标记-整理算法。比如说CMS这种回收器,采用的就是标记清除的方式。那么永久代是一直会是存活的对象,只有在触发 Full GC 的时候,才会被回收。所以永久代的对象创建过多的话,会比较容易出现内存溢出。最典型的场景是在 JSP 页面比较多的情况下,容易出现永久代的内存溢出。

  1. JVM中的GC收集器
    JVM提供了多种GC收集器,每种收集器都有其特定的应用场景和优缺点。常见的收集器包括:

Serial GC:单线程执行GC,适用于单核CPU、新生代空间较小及对暂停时间要求不高的应用。
Parallel GC:多线程执行GC,适用于多核CPU、对吞吐量有高要求的应用。
CMS(Concurrent Mark Sweep)GC:一种以最短回收停顿时间为目标的收集器,适用于对响应时间敏感的应用。但它在并发收集时会产生浮动垃圾,且需要预留一定的空间来避免频繁的全堆GC。
G1(Garbage-First)GC:面向服务端应用的垃圾收集器,它设计用来满足在堆内存不断增大的情况下,减少停顿时间的需求。G1收集器将堆划分为多个大小相等的独立区域(Region),并优先收集垃圾最多的区域。

  1. GC对JVM内存的影响
    GC主要影响JVM中的堆内存区域。堆内存被划分为新生代和老年代,GC在这两个区域中分别采用不同的算法进行回收。GC的执行会导致应用程序的暂停(Stop-The-World),但现代JVM通过优化算法和收集器,已经大大减少了这种暂停的时间。

总之,JVM的GC是Java语言内存管理的重要机制,它通过自动化的方式释放不再使用的内存空间,提高了程序的稳定性和可靠性。同时,JVM提供了多种GC算法和收集器,以满足不同应用场景的需求。

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

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

相关文章

Python 全栈系列266 Kafka服务的Docker搭建

说明 在大量数据处理任务下的缓存与分发 这个算是来自顾同学的助攻1,我有点java绝缘体的体质,碰到和java相关的安装部署总会碰到点奇怪的问题,不过现在已经搞定了。测试也接近了kafka官方标称的性能。考虑到网络、消息的大小等因素&#xff0…

风机设计基础

目录 1、风机分类按气体出口压力(或升压)来进行风机分类按风机全压来进行分类 2、风机定律及效率、功率、压力计算风机轴功率与扭矩关系:风机全压、静压效率计算公式:全压、动压、静压计算公式: 3、风机噪声1、离散噪声…

修改jupyter notebook 默认浏览器(不动配置文件,改系统默认浏览器)

最开始把联想浏览器切到EDGE就是用的修改系统的默认浏览器。不知怎么的现在搜到的方法都是在说修改配置文件😓。 不想动配置文件,平时对默认浏览器没有特殊要求的,可以用这个方法。 这里是把默认浏览器改成联想浏览器,电脑也是联…

macos 系统 降级, 重装, 升级图文教程

最近一不小心mac被升级到了最新版本, 在使用vscode的时候经常卡顿,于是有了降级macos的想法! 于是就有了这macos的系统降级 , 重装, 升级图文教程. 本文重点介绍macos降级, 重装过程, 至于升级, 这个一不小心就会被升级(通过应用商店)基本上都是自动升级的,所以不做更多说明. …

低代码平台赋能:烟花鞭炮企业数字化转型新篇章

随着数字化转型的浪潮席卷全球,传统制造业正面临着前所未有的变革机遇。烟花鞭炮行业,作为承载深厚文化底蕴与独特工艺的传统产业,也不例外。近年来,我国政府高度重视中小企业数字化转型,出台了一系列扶持政策&#xf…

基于大数据的电商平台电脑销售数据分析系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着电子商务的蓬勃发展,各大电商平台积累了海量的商品数据。如何从这些数据中提取有价值的信息,对于商家来说至关重要。本项目利用网络爬虫技术从京东电商平台采集各类品牌…

春秋云镜(OpenSSH)·CVE-2023-51385

靶标介绍: OpenSSH 是使用 SSH 协议进行远程登录的连接工具。在OpenSSH 9.6版本之前的ssh中,如果用户名或主机名中含有shell元字符(如 | "等),并且ssh_config中ProxyCommand、LocalCommand指令或"match exe…

Mybatis 基础知识

目录 一、简介 1、JDK: 2、JRE: 3、JVM: 4、Java SE: 5、Java EE: 6、持久层: 7、轻量级: 8、半自动化: 9、ORM: 10、框架: 二、三层架构 1、业…

数据结构-----双向链表

1.什么是内存泄漏? 主动申请到的内存空间没有进行内存释放,导致无内存空间可用。 2.双向链表? 双向链表(Doubly Linked List)是链表的一种,它允许我们在链表中的任何一个节点向前或 向后遍历。与单向链表…

display flex 的div 被子元素撑开不显示滚动条的一个解决demo

display flex 的div 被子元素撑开,不显示y轴滚动条的 一个解决demo。 注: 不一定适用所有人的的相同问题 less # less .contact {display: flex;flex-grow: 1;overflow: hidden auto;flex-direction: column;.contact-items {flex: 1 1 0;display: flex…

Python和Java及MATLAB和CUDA显微镜导图

🎯要点 交互式设备控制和图像处理图像背景和阴影校正可视化萤光团位置算法和读取光学图像读写转换显微镜图像生物医学细胞图像分析荧光图像算法计算亮度数据和模拟表征新型染料和缓冲液强度估计细菌图像分析扫描透射和高分辨率透射图像模拟多模态成像分割可视化透射…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1)用户说明 2)Hiveserver2部署 (1)Hadoop端配置 (2)Hive端配置 3)测试 (1)启动Hiveserver2 (2)使用命…

深入学习电路基础:从理论到实践

引言 电路是电子学的核心,也是现代科技的基石。从简单的灯泡开关到复杂的计算机处理器,电路在各类电子设备中都起到了至关重要的作用。深入学习电路知识不仅有助于理解电子设备的工作原理,还能够为实际设计和开发电子产品打下坚实的基础。 …

flutter语法:var、late、const、final区别

var: 用于声明可变变量,支持类型推断并能多次赋值,但只能是同类型的数据赋值。之后其类型更改,会抛出异常。 var number 10;void main() {print(number); // 这将打印10。number 20; // 再次赋值,但必须同类型print(number); /…

某云彩SRM2.0任意文件下载漏洞

文章目录 免责申明搜索语法漏洞描述漏洞复现修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 搜索语法 fofa icon_hash"1665918155"漏洞描述 某云采 SRM2.0是一款先…

扁平数组转化分类树

使用下列数组生成一个分类树(数组中每项中的pid是父节点的id,pid:0表示顶层,pid:1,表示这个节点属于id为1的节点,children该节点的子节点数组) const jsona [{"ID": 1,"CreatedAt": …

【计算机视觉前沿研究 热点 顶会】ECCV 2024中扩散模型有关的论文

神经辐射场修复的驯服潜在扩散模型 神经辐射场(NERF)是一种从多视角图像进行三维重建的表示法。尽管最近的一些工作表明,在编辑具有扩散先验的重建的 NERF 方面取得了初步成功,但他们仍然在努力在完全未覆盖的区域中合成合理的几何图形。一个主要原因是…

使用大型语言模型进行监督微调(SFT)

大型语言模型(LLMs)通常经过几个阶段的训练,包括预训练和几个微调阶段;请参见下文。尽管预训练很昂贵(即需要数十万美元的计算成本),但相比之下,微调LLM(或进行上下文学习…

应用商店优化(ASO)的四大误区

应用商店优化 (ASO) 是移动营销中最重要的部分之一,可以帮助开发人员吸引自然流量并在应用推广方面取得预期效果。近年来ASO优化在开发者中越来越受欢迎。虽然它已经证明了其有效性和对应用成功的影响力,但尽管如此仍然存在与ASO相关的误解,导…

Day-04-QFile打开文件的两种方式

一、UI界面设置两个按键&#xff0c;并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数&#xff0c;应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…