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

news2024/11/15 5:07:48

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.coloradmin.cn/o/2093425.html

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

相关文章

Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理

使用KeepAlived配置实现虚IP在多服务器节点漂移 1 )环境准备 2台 linux , 一主一备 节点1:192.168.184.30 CentOS 7 Master节点2:192.168.184.40 CentOS 7 BackupVIP 192.168.184.50 安装 KeepAlived, $ yum install keepalived 注意&#x…

前端源码解读:前端小白也能轻松理解的axios源码

作为前端开发的小伙伴,你肯定对 axios 这个超级好用的 HTTP 请求库不陌生吧?它不仅操作简单,功能还特别强大,难怪大家都爱用!但你知道吗?axios 的魅力可不仅仅在于它的好用,真正让人佩服的是它源…

jmeter 响应乱码

Jmeter在做接口测试的时候的,如果接口响应的内容中有中文,jmeter的响应内容很可能显示乱码,为了规避这种出现乱码的问题,就要对jmeter的响应结果进行编码处理。 打开jmeter进行接口、压力、性能等测试,出现以下乱码问…

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现…

数据结构-队列的介绍及循环队列

1.队列的概念 在开始前,请牢记这句话:队列是一个先进先出的数据结构。 队列(queue)是限定在表的一端进行插入,表的另一端进行删除的数据结构,如同栈的学习,请联系前文所学链表,试想…

python 安装

下载 Download Python | Python.org 安装

jquery下载的例子如何应用到vue中

参考测试圈相亲平台开发流程(4):选个漂亮的首页 (qq.com) 下载的文件夹解压到v_love项目的pubilc下的static文件夹内,这里放的都是我们的静态资源。 打开文件夹内的index.html,我们先确定下它是不是我们要的东西&…

产品经理的学习笔记(全集)-持续更新

1.前言 产品经理不是一个软件,也不是一个专业技能,是一个思维量变的过程;内容介绍:P1-产品经理基础认知;P2-从0-1搭建实战项目(电商) 2.产品经理基础 2.1产品经理定义 产品管理--产品的设计…

求职Leetcode题目(9)

1.通配符匹配 题解: 其中,横轴为string s,纵轴为pattern p 这个表第(m,n)个格子的意义是:【p从0位置到m位置】这一整段,是否能与【s从0位置到n位置】这一整段匹配 也就是说,如果表格的下面这一个位置储存的是T(True)…

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

Ubuntu 24.04 VMware里面设置静态ip上网

1.VMware里面设置网络为桥接模式 2.Ubuntu里面检查网卡名称 [~] ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:…

python图像类型分类汇总

图型所在包样例例图热图seabornimport matplotlib.pyplot as plt import seaborn as sns sns.heatmap(df.isnull()) plt.show() Bitmap Bitmap import numpy as np # 获取数据 fraud data_df[data_df[Class] 1] nonFraud data_df[data_df[Class] 0] # 相关性计算 cor…

Leetcode 404-左叶子之和

题目 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 题解 二叉树的题目&#xff0c;如果需要返回某个值&#xff0c;可以分左右子树递归计算&#xff0c;最后sumleftright 递归三部曲&#xff1a; 确定递归函数的参数和返回值 判断一个树的左叶子节点之和&…

函数式接口实现策略模式

函数式接口实现策略模式 1.案例背景 我们在日常开发中&#xff0c;大多会写if、else if、else 这样的代码&#xff0c;但条件太多时&#xff0c;往往嵌套无数层if else,阅读性很差&#xff0c;比如如下案例&#xff0c;统计学生的数学课程的成绩&#xff1a; 90-100分&#…

微分方程(Blanchard Differential Equations 4th)中文版Section6.1

拉普拉斯变换 积分变换 在本章中&#xff0c;我们研究了一种工具——拉普拉斯变换&#xff0c;用于解微分方程。拉普拉斯变换是众多不同类型的积分变换之一。一般来说&#xff0c;积分变换解决的问题是&#xff1a;一个给定的函数 y ( t ) y(t) y(t) 在多大程度上“像”一个…

温馨网站练习运用

第二次与团队一起制作网页虽然不进行商用&#xff0c;但是练习一下还是好的&#x1f60a;&#x1f60a; 我主要负责后端部分&#xff0c;该项目用了SpringBoot框架、SpringSecurity的安全框架、结合MyBatis-Plus的数据库查询。如果想看看&#xff0c;网站&#xff1a;温馨网登…

Python基础性知识(中部分)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、Python中的语句1.1 顺序语句1.2 条件语句1.3 循环语句1.3.1 while循环1.3.2 for循环1.3.3 break与continue语句 1.4 综合三大语句制作小游戏--人生重开模拟器…

opencv之形态学

文章目录 1. 什么是形态学2. 形态学操作2.1 腐蚀2.2 膨胀2.3 通用形态学函数2.4 开运算2.5 闭运算2.6 形态学梯度运算2.7 礼帽运算2.8 黑帽运算 1. 什么是形态学 在图像处理领域&#xff0c;形态学是一种基于形状的图像分析技术&#xff0c;用于提取和处理图像的形态特征。这包…

存储架构模式-分片架构和分区架构

分片架构 分片架构就可以解决主从复制存在的问题&#xff0c;如果主机能够承担写的性能&#xff0c;那么主从就够了&#xff0c;如果不能&#xff0c;那么就需要分片架构了。 分片架构设计核心 分片架构设计核心-分片规则 案例1&#xff1a;不合理&#xff0c;因为不同年龄是不…

echarts组件——饼图

echarts组件——饼图 饼图&#xff0c;环形图 组件代码 <template><div :class"classname" :style"{height:height,width:width}" /> </template><script> // 环形图 import * as echarts from echarts require(echarts/them…