谈一谈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.rhkb.cn/news/414090.html

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

相关文章

Python爬虫案例四:爬取某个博主的所有文章保存成PDF格式

引入(将图片保存成PDF格式): 测试链接: https://zq.bookan.com.cn/?tdetail&id21088&ct1&is31042341&rid4658(图书馆图片保存PDF),前提是装库,pip install img2pdf…

VTK平面切割

文章目录 一、vtkClipPolyData二、CapClip三、SolidClip四、vtkClipClosedSurface 本文的主要内容:简单介绍VTK中通过平面切割模型的相关功能。 哪些人适合阅读本文:有一定VTK基础的人。 一、vtkClipPolyData VTK官网描述: vtkClipPolyData使…

网络各层的安全实例:从物理层到应用层的保护

在前面的各节中,我们学习了利用密码学技术实现机密性、完整性、数字签名和实体鉴别等安全服务的基本方法。在本节中,我们将讨论这些方法在网络各层的具体应用实例。这些安全应用实例涉及从物理层到应用层的所有层次。 1. 为什么需要在网络各层提供安全服…

GoLang:Go语言开发环境的配置

Go语言 Go语言开发环境的配置 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

【Matlab】时间序列模型(ARIMA)

文章目录 前言一、示例二、代码实现----Matlab全部数据的平稳性检验ADF检验图检验法 划分训练集平稳性检验确定 p,q结果分析和模型检验模型预测 前言 接上一篇博客,用 Matlab 完成代码编写。 【学习笔记】时间序列模型(ARIMA) 一、示例 已知一个上市公…

Pandas 9-绘制柱状图

1. 准备数据 首先,需要准备一个DataFrame。 import pandas as pd # 创建一个DataFrame data { Name: [Alice, Bob, Charlie, David], Age: [24, 27, 22, 32], City: [New York, Los Angeles, Chicago, Houston], Score: [85, 92, 78, 88]} df pd.…

sql-labs46-50通关攻略

第46关 一.查询数据库 http://172.16.1.142/Less-46/?sort1%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)--http://172.16.1.142/Less-46/?sort1%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)-- 二.查表 http://172.16.1.142/Les…

软件测试 | 测试用例

测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境,测试步骤,测试数据,预期结果等要素。 设计测试用例原则⼀: 测试用例中⼀个必需部分是对…

【微机原理】指令JZ和JNZ的区别

🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 JZ(Jump …

php特性刷题

93 上面注释的是一些配置信息 然后包含flag.php页面 高亮显示 如果,先判断是否存在GET传参的参数num,如果弱比较等于4476,就会输出“no non no !” 如果包含字母那么就错误(包含大小写) 判断变量 $num 是否等于 4…

QEMU - user network

Documentation/Networking - QEMUQEMU/KVM中的网络虚拟化--Part2 User Networking | Xiaoye Zhengs blog (zxxyy.github.io)QEMU Network — ARM SoC Device Assignment Notes documentation (cwshu.github.io)slirp / libslirp GitLabGitHub - virtualsquare/libvdeslirp: li…

Python中排序算法之选择排序

选择排序算法是对《Python中排序算法之冒泡排序》中提到的冒泡排序算法的改进。 1 选择排序原理 选择排序是在参加排序的所有元素中找到数值最小(或最大)的元素,如果它不是左侧第一个元素,就使它与左侧第一个元素中的数据相互交…

Mysql8利用binlog实现数据恢复

文章目录 1binlog基本概念2 binlog相关常用命令3 binlog工具mysqlbinlog4 测试数据准备&导入数据5 模拟误删表6 数据恢复方式说明7 数据恢复分析(偏移量方式恢复)8 数据恢复9 验证10 数据恢复的局限性11 总结 1binlog基本概念 binlog即binary log,二进制日志文件…

Python爬虫02

xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg:

基于PHP评论区的存储型XSS漏洞

评论区的XSS漏洞是指攻击者在评论区输入恶意脚本,当其他用户浏览该页面时,这些恶意脚本会被执行,从而造成安全威胁。这种漏洞通常出现在网站没有对用户输入进行充分过滤和转义的情况下,为存储型XSS。存储型XSS攻击是指攻击者在目标…

使用 EasyExcel 高效读取大文件 Excel

使用 EasyExcel 高效读取大文件 Excel 的最佳实践 在现代应用中,数据处理经常涉及到大规模数据集的处理,Excel 作为一种常见的文件格式,经常用于数据导入和导出。然而,传统的 Excel 处理库如 Apache POI 在处理大文件时可能会面临…

实战项目:俄罗斯方块(一)

文章目录 🍊自我介绍🍊vt100 控制码1.概述2.数字格式①常用数字控制码②常用控制码 🍊绘制方格 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我…

关于VUE3开发频繁引入ref,reactive,computed等基础函数。

利用unplugin-auto-import插件可以避免频繁引入ref,reactive,computed等基础函数。 1.安装unplugin-auto-import依赖 npm i -D unplugin-auto-import 2.在vite.config.ts中注入依赖 效果

Webfunny前端监控如何搭建高并发使用场景

Webfunny可以支持千万级别PV的日活量了。但是,我们默认的部署配置,是无法支持这么高的日活量的,需要我们做一些支持高并发的配置和操作,下面让我们一起看下如何让webfunny支持更高的并发量吧,下图为webfunny高并发架构…

AI安全前沿:模型攻击与防御策略

引言 随着chatGPT的横空出世,通用人工智能的时代正式开启。人工智能极大地影响了人类的生活方式和生产方式,例如以ChatGPT为代表的各类大模型,能够理解和生成人类语言,并以对话的方式同人类进行互动,能够执行撰写文本…