JVM认识之垃圾收集算法

一、标记-清除算法

1、定义

标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象(即垃圾),在标记完成后再统一回收所有垃圾对象。

2、优点和缺点

  • 优点:实现简单
  • 缺点:
    • 可能会产生内存碎片,导致内存分配效率降低,影响程序的性能。
    • 标记和清除阶段需要暂停程序的执行,造成一定的延迟。

二、复制算法

1、定义

复制算法,它把可用内存按容量分为大小相等的两块,每次只用其中的一块。当这一块的内存用完了,则会把存活的对象复制到另外的一块上,然后把已使用的内存空间一次清理掉。

2、优点和缺点

  • 优点:
    • 实现简单,运行高效;
    • 由于是对整个内存半区进行垃圾回收,所以不需要考虑内存碎片问题。
  • 缺点:
    • 由于算法代价是把可用内存缩小为原来的一半,所以该算法的内存利用率较低;
    • 对象存活率高时,由于需要进行较多的复制操作,效率会变低。

3、应用

新生代的垃圾回收

把新生代(默认)按8:1:1划分。Eden区有一块,该块占8份;Survior有2块,每块占1份。每次只使用Eden区和其中一块Survior区。当Eden区满了时,会触发Minor GC。Minor GC过程是把Eden区和Survior区的存活对象复制到剩下的一块Survior区,然后一次性清理掉Eden区和之前Survior区的已使用空间。其中,若剩下的那一块Survior区没有足够的连续空间容纳Eden区和已使用Survior区的存活对象,且有老年代进行内存担保,则通过内存担保机制进入老年代。

三、标记-整理算法

1、定义

标记-整理算法,它主要分为标记和整理两个阶段。标记阶段和标记-清除阶段相同,都是标记出垃圾对象。而整理阶段是先把所有存活对象都向一端移动,然后清理掉端边界外的内存。

2、优点和缺点

  • 优点:
    • 解决内存碎片问题,提高堆的内存利用率。
  • 缺点:
    • 由于需要标记所有存活对象并整理所有存活对象的引用地址,所以效率比较低;
    • 在移动过程中,若移动对象被其中对象引用,则还需要调整引用地址,这可能导致程序暂停。

3、应用

老年代垃圾回收

四、增量收集算法

1、定义

若一次性收集JVM中所有的垃圾,则可能会造成程序长时间的停顿。而增量收集算法可以让垃圾回收线程和程序线程交替执行。每次垃圾回收线程只回收一小片区域的内存空间,接着切换到程序线程,依次反复,直到垃圾回收完成。

2、优点和缺点

  • 优点:减少系统停顿时间。
  • 缺点:由于线程切换造成垃圾回收成本上升且系统吞吐量下降。

3、应用

CMS收集器

五、分代收集算法

1、定义

分代收集算法是根据对象的存活周期不同把内存空间划分为几块。一般把JVM堆划分为新时代和老年代,然后根据各个年代的特点使用适当的垃圾回收算法。由于新生代中的对象大部分存活周期短,则可以选用复制算法,只需要进行少量复制成本就可以回收垃圾。而老年代中的对象存活率高,且没有额外空间进行内存担保,则需要选择标记-清除算法或者标记-整理算法进行垃圾回收。

2、优点和缺点

3、应用

大部分JVM的垃圾回收

六、分区算法

1、定义

分区算法把整个堆空间划分为连续的不同小区间,每个小区间独立使用、独立回收。

2、优点和缺点

  • 优点:
    • 控制一次回收多少个小区间,减少GC造成的程序停顿时间;
    • 解决内存碎片问题。
  • 缺点:实现复杂。

3、应用

G1收集器

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

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

相关文章

初阶数据结构之单链表详解

目录 一:单链表概念 二:单链表的基本操作 1.定义结点 2.创建链表(初始化链表) 3:新增结点 4.单链表尾插 5.单链表头插 6.单链表尾删 7:单链表头删 8.打印单链表 9.查找单链表结点 10.单链表删除指定结点 1…

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本,点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器,这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…

JS笔试手撕题

数据劫持 Vue2的Object.defineProperty() Vue2的响应式是通过Object.defineProperty()拦截数据,将数据转换成getter/setter的形式,在访问数据的时候调用getter函数,在修改数据的时候调用setter函数。然后利用发布-订阅模式,在数…

基于PSO粒子群优化的配电网可靠性指标matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 PSO算法应用于配电网优化的基本原理 5.完整程序 1.程序功能描述 基于PSO粒子群优化的配电网可靠性指标matlab仿真,指标包括saifi, saidi, caidi, aens四个。 2.测试软件版本…

深度学习--DCGAN

代码之后的注释和GAN的一样,大家如果已经掌握GAN,可以忽略掉哦!!! 在学习DCGAN之前,我们要先掌握GAN,深度学习--生成对抗网络GAN-CSDN博客 这篇博客讲的就是GAN的相关知识,还是很详…

POST请求

1、代码 import urllib.request import urllib.parse# 指定 URL url https://fanyi.baidu.com/sug# POST 请求携带的参数进行处理流程: # 1. 将 POST 请求参数封装到字典 data {kw: 西瓜 }# 2. 使用 parse 模块中的 urlencode 进行编码处理 data urllib.parse.u…

【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解

博主打算从0-1讲解下java进阶篇教学,今天教学第十篇:Java中线程安全、锁讲解。 当涉及到多线程编程时,保证线程安全是至关重要的。线程安全意味着在多个线程访问共享资源时,不会发生数据错乱或不一致的情况。为了实现线程安全&am…

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础:异步编程/单线程和异步》中讲过,Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时,⼤部分情况都是通过回调函数来进⾏。 (如果你还不了解单线程和异步的概念,可以先去回顾上一…

【Redis7】10大数据类型之Zset类型

文章目录 1.Zset类型2.常用命令3.示例3.1 ZADD,ZRANGE和ZREVRANGE3.2 ZSCORE,ZCARD和ZREM3.3 ZRANGEBYSCORE和ZCOUNT3.4 ZRANK和ZREVRANK3.5 Redis7新命令ZMPOP 1.Zset类型 Redis的Zset(Sorted Set,有序集合)是一种特殊的数据结构&#xff0…

Encoder——Decoder工作原理与代码支撑

神经网络算法 :一文搞懂 Encoder-Decoder(编码器-解码器)_有编码器和解码器的神经网络-CSDN博客这篇文章写的不错,从定性的角度解释了一下,什么是编码器与解码器,我再学习笔记补充的时候,讲一下…

TMS320F28335学习笔记-时钟系统

第一次使用38225使用了普中的clocksystem例程进行编译,总是编译失败。 问题一:提示找不到文件 因为工程的头文件路径没有包含,下图的路径需要添加自己电脑的路径。 问题二 找不到库文件 例程种的header文件夹和common文件夹不知道从何而来…

【Alluxio】文件系统锁模型之InodeLockList

InodeLockList接口,表示在inode tree里一个加了锁的路径。 沿着path,inodes和edges都被加锁了。path可能从edge或inode任意一个开始。 锁列表总是包含了一定数量的读锁(0个或多个),随后跟随着一些数量的写锁(0个或多个)。 举个例子: 对 /a/b/c/d 进行加锁,c->d这…

【深度学习】网络安全,SQL注入识别,SQL注入检测,基于深度学习的sql注入语句识别,数据集,代码

文章目录 一、 什么是sql注入二、 sql注入的例子三、 深度学习模型3.1. SQL注入识别任务3.2. 使用全连接神经网络来做分类3.3. 使用bert来做sql语句分类 四、 深度学习模型的算法推理和部署五、代码获取 一、 什么是sql注入 SQL注入是一种常见的网络安全漏洞,它允许…

【进程间通信】共享内存

文章目录 共享内存常用的接口指令利用命名管道实现同步机制总结 System V的IPC资源的生命周期都是随内核的。 共享内存 共享内存也是为了进程间进行通信的,因为进程间具有独立性,通信的本质是两个不同的进程看到同一份公共资源,所以共享内存…

Java 11 到 Java 8 的兼容性转换

Java 11 到 Java 8 的兼容性转换 欲倚绿窗伴卿卿,颇悔今生误道行。有心持钵丛林去,又负美人一片情。 静坐修观法眼开,祈求三宝降灵台,观中诸圣何曾见?不请情人却自来。 入山投谒得道僧,求教上师说因明。争奈…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

java项目之在线课程管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线课程管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 在线课程管理系统的主要…

Nginx配置/.well-known/pki-validation/

当你需要在Nginx上配置.well-known/pki-validation/时,这通常是为了支持SSL证书的自动续订或其他验证目的。以下是配置步骤: 创建目录结构: 在你的网站根目录下创建一个名为.well-known的目录(SSL证书申请之如何创建/.well-known/…

Linux环境Redis部署

Redis部署 Redis是一个高性能的开源键值存储系统,它主要基于内存操作,但也支持数据的持久化。与其他数据库相比,Redis的主要优势在于它的高性能、丰富的数据结构和原生的持久化能力。Redis不仅提供了类似的功能,还增加了持久化和…

[初阶数据结构】单链表

前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录于初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…