当前位置: 首页 > news >正文

JVM 垃圾回收

垃圾回收算法

标记-清除算法(Mark and Sweep)

标记-清除算法分为两个阶段。在标记阶段,垃圾收集器会标记所有活动对象;在清除阶段,垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片,从而影响后续的内存分配。

复制算法(Copying)

复制算法将内存分为两个区域,每次只使用其中一个区域。当一个区域被占满时,垃圾收集器会将所有活动对象复制到另一个区域中,然后清除原区域的所有对象。这种算法可以有效地避免内存碎片的问题,但是需要消耗更多的内存空间。

标记-整理算法(Mark and Compact)

标记-整理算法是在标记-清除算法的基础上进行改进的,它可以避免内存碎片的问题。在标记阶段,垃圾收集器会标记所有活动对象;在整理阶段,垃圾收集器会将所有活动对象移动到内存的一端,然后清除所有未标记的对象。

分代算法(Generational)

分代算法是一种优化算法,它根据对象的生命周期将内存分为不同的代。一般来说,新创建的对象往往比较短命,垃圾收集器会将这些对象放到年轻代中,而长生命周期的对象则会放到老年代中。在垃圾回收时,年轻代采用复制算法,老年代采用标记-整理算法或标记-清除算法。这种算法可以有效地提高垃圾回收的效率。

分区算法(Region-based)

分区算法将内存分为多个区域,每个区域都有自己的垃圾回收器。这种算法可以充分利用多核 CPU 的性能,提高垃圾回收的效率。

引用计数算法

通过为每个对象维护一个引用计数器,记录指向该对象的引用数。当引用计数器为 0 时,该对象可以被清理。
该算法无法处理循环引用的情况,如果对象之间存在相互引用,但没有外部引用指向它们中的任何一个时这些对象无法被销毁。

可达性分析

通过分析对象之间的引用关系,确定哪些对象可以被程序访问,哪些对象已经不再需要并可以被垃圾回收器回收。Java 中使用可达性分析算法来进行垃圾回收,以确保内存被充分利用,同时避免内存泄漏和空间浪费。
可达性分析的过程通常由垃圾回收器自动完成,其基本思路是从一组根对象(如线程栈、静态变量等)开始,递归遍历所有对象,并标记所有可达对象。未标记的对象则被认为是不可达对象,可以被垃圾回收器回收。

垃圾回收器

Serial 垃圾回收器

单线程的垃圾回收器(在多核 CPU 的环境中,如果使用 Serial 垃圾回收器,那么只能使用一个 CPU 核心来执行垃圾回收操作,其他 CPU 核心则处于空闲状态,无法充分利用 CPU 的性能)
使用标记-清除算法进行垃圾回收。
Serial 垃圾回收器适用于内存较小的环境或者只有单个 CPU 核心的环境。

Parallel 垃圾回收器

多线程的垃圾回收器
标记-清除算法进行垃圾回收
适用于多核 CPU 的环境,可以充分利用多核 CPU 的性能。

CMS 垃圾回收器

并发的垃圾回收器,它可以在应用程序运行的同时进行垃圾回收。
适用于对响应时间要求较高的应用程序
可能会产生内存碎片。(由于采用了标记-清除算法,CMS 垃圾回收器无法像复制算法或标记-整理算法那样将内存整理成连续的空间。因此,清除之后,内存中会留下很多不连续的小块空间,这些空间称为内存碎片。)

G1 垃圾回收器(JDK8)

基于分代的垃圾回收器
可以在多核 CPU 的环境下并发执行垃圾回收。
适用于大内存的应用程序
避免内存碎片的问题。

分区:G1 垃圾回收器将整个堆内存分成多个大小相等的区域(Region),每个区域都可以独立地进行垃圾回收操作。这样,在进行垃圾回收时,可以同时并发执行多个区域的垃圾回收操作,从而充分利用多核 CPU 的性能。

并发标记和整理:G1 垃圾回收器采用了一种称为“并发标记和整理(Concurrent Marking and Compacting)”的算法,可以在应用程序运行的同时,对垃圾进行标记和整理。该算法允许垃圾回收器在多个 CPU 核心上并发执行标记和整理操作,从而提高垃圾回收的效率。

ZGC(Z Garbage Collector)垃圾回收器 (JDK 15)

低延迟:ZGC 垃圾回收器可以实现几乎无停顿的垃圾回收,最长的垃圾回收时间不超过几毫秒。这对于对实时性要求较高的应用程序非常重要。

高吞吐量:尽管 ZGC 垃圾回收器的主要目标是低延迟,但它也具有较高的吞吐量,可以处理大量的垃圾数据。

可扩展性:ZGC 垃圾回收器可以处理非常大的堆内存,支持多个 CPU 核心并行执行垃圾回收操作。

分代收集:ZGC 垃圾回收器采用分代收集策略,可以根据对象的生命周期将堆内存分为不同的代,对于不同代采用不同的垃圾回收策略。

内存压缩:ZGC 垃圾回收器可以在垃圾回收过程中对内存进行压缩,从而减少内存的碎片化。

内存碎片

内存碎片会影响后续的内存分配。当应用程序需要分配一块大的连续内存时,由于内存中存在很多小的不连续空间,无法满足分配要求导致内存分配失败。

CMS 垃圾回收器采用 空闲列表(Free List) 机制来维护内存碎片。
空闲列表是一种链表结构,用于记录内存中空闲的小块空间。当应用程序需要分配内存时,CMS 垃圾回收器会遍历空闲列表,找到一块足够大的空间来分配给应用程序。虽然空闲列表可以缓解内存碎片的问题,但是它也会带来额外的开销和复杂性

相关文章:

JVM 垃圾回收

垃圾回收算法 标记-清除算法(Mark and Sweep) 标记-清除算法分为两个阶段。在标记阶段,垃圾收集器会标记所有活动对象;在清除阶段,垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片&#…...

编程中的宝藏:二分查找

二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字(虽然现在谁还在用电话簿呢!)。你可以从头开始翻页,直到进入以 “K” 打头的部分。然而,更明智的方法是从中间开始,因为你知道以 “K” 打头…...

计算机网络 数据链路层

...

如何维护自己的电脑

目录 1、关于电脑选择的建议 1.1、价格预算 1.2、明确需求 1.3、电脑配置 1.4、分辨率 1.5、续航能力 1.6、品牌选择 1.7、用户评测 1.8、各个电商平台对比 1.9、最后决策 2、我的选择 3、电脑保养 3.1 外部清洁 3.2 安装软件 3.3 优化操作系统 3.4 维护硬件设…...

智能优化算法——哈里鹰算法(Matlab实现)

目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization,HHO),是由Ali As…...

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度(multiresolution)和多尺度(multiscale) 多粒度(multiresolution)和多尺度(multiscale)都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…...

利用SCCM进行横向移动

01SCCM介绍 SCCM全名为System Center Configuration Manager,从版本1910开始,微软官方将其从Microsoft System Center产品移除,重新命名为Microsoft Endpoint Configuration Manager(ConfigMgr),其可帮助 …...

Nginx 负载均衡

Nginx 负载均衡 负载均衡由反向代理来实现的 其中反向代理分为七层代理和四层代理,一般常用的是七层代理,接下来分别介绍一些 NGINX 七层代理 七层是最常用的反向代理方式,只能配置在Nginx配置文件的http模块。 配置方法名称:…...

Java课题笔记~ ServletConfig

概念&#xff1a;代表整个web应用&#xff0c;可以和程序的容器(服务器)来通信 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...

oracle的异常处理

oracle提供了预定义例外、非预定义例外和自定义例外三种类型。其中&#xff1a; l预定义例外用于处理常见的oracle错误&#xff1b; l非预定义例外用于处理预定义所不能处理的oracle错误&#xff1b; l自定义例外处理与oracle错误无关的其他情况。 Oracle代码编写过程中&am…...

【MySQL】MySQL数据类型

文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…...

【数据结构与算法】十大经典排序算法-希尔排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…...

docker 常用命令

1. 搜索并下载镜像 docker search bundlefusion # 搜索docker pull jhljx/bundlefusion # 将远程仓库文件下载到本地2. 用镜像创建容器 docker run -it --namebundlefusion colec777/bundlefusion-cu11.4-cudagl:v8 /bin/bash # 创建并运行 exit # 退出终端 sudo docker cont…...

uniapp微信小程序中打开腾讯地图获取用户位置信息

实现的效果 第一步&#xff1a;首先登录微信公众平台 , 需要用到AppID 第二步&#xff1a; 注册登录腾讯位置服务 注册需要手机号和邮箱确认&#xff0c;然后创建应用 创建后点击添加key 添加后会生成key&#xff0c;后面会用到这个key 第三步&#xff1a; 登录微信公众平台&a…...

嵌入式领域:人才供需失衡,发展潜力巨大

嵌入式技术正快速发展&#xff0c;ARM处理器、嵌入式操作系统、LINUX等技术助力嵌入式领域崛起。然而&#xff0c;行业新颖且门槛高&#xff0c;缺乏专业指导。因此&#xff0c;嵌入式人才稀缺&#xff0c;身价水涨船高。 未来几年&#xff0c;嵌入式系统将在信息化、智能化、…...

python 书籍

python高手进阶之路 10册 QQ:417398600...

Debian纯净系统安装php常用扩展和程序

适用于 php-fpm debian容器 mysql扩展 docker-php-ext-install pdo_mysql docker-php-ext-install mysqliredis扩展 pecl install redis docker-php-ext-enable redis# pecl无法装就&#xff1a; docker-php-source extract # 创建并初始化 /usr/src/php目录&#xff08;扩展…...

vue+element中如何设置单个el-date-picker开始时间和结束时间关联

功能&#xff1a;选了开始时间&#xff0c;则结束时间只能选择开始时间之后的&#xff1b;选了结束时间&#xff0c;则开始时间只能选择结束时间之前的 重点是picker-options属性 图示&#xff1a; 代码展示: // body 内部<el-form-item><el-date-pickerv-model&qu…...

二次封装ajax和axios

ajax app.config.globalProperties.$http function(url, method, data, async, fun) {$.ajax({url: baseUrl url, //请求地址type: method, //请求方式dataType: json, //数据类型contentType: "application/json",xhrFields: { //跨域设置withCredentials: t…...

Android进阶之SeekBar动态显示进度

SeekBar 在开发中并不陌生,默认的SeekBar是不显示进度的,当然用吐司或者文案在旁边实时显示也是可以的,那能不能移动的时候才显示&#xff0c;默认不显示呢,当然网上花哨的三方工具类太多了&#xff0c;但是我只是单纯的想在SeekBar的基础上去添加一个可以跟随移动显示的气泡而…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...