jvm基础篇之垃圾回收[2](垃圾回收算法)

文章目录

  • 版权声明
  • 垃圾回收算法核心思想
  • 垃圾回收算法的历史
  • 垃圾回收算法的评价标准
  • 垃圾分类算法分类
    • 标记清除算法
      • 核心思想
      • 标记清除算法优缺点
    • 复制算法
      • 核心思想
      • 完整案例
      • 复制算法的优缺点
    • 标记整理算法
      • 核心思想
      • 标记整理算法优缺点
    • 分代垃圾回收算法
      • arthas查看分代内存情况
      • 核心思想
  • 虚拟机内存参数
    • StopWorldTest案例代码
    • GC案例1
    • GC案例2

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。
  • 本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

垃圾回收算法核心思想

  • 垃圾回收要做的有两件事:第一,找到内存中存活的对象;第二,释放不再存活对象的内存,使得程序能再次利用该空间
    在这里插入图片描述

垃圾回收算法的历史

在这里插入图片描述

  • 1960年John McCarthy发布了第一个GC算法:标记-清除算法
  • 1963年Marvin L. Minsky 发布了复制算法。
  • 本质上后续所有的垃圾回收算法,都是在上述两种算法的基础上优化而来

垃圾回收算法的评价标准

  • Java垃圾回收过程会通过单独的GC线程来完成。所有的GC算法,都会有部分阶段需要停止所有的用户线程,进行垃圾回收。这个过程被称之为Stop The World简称STW,如果STW时间过长则会影响用户的使用。
    在这里插入图片描述

垃圾回收算法的评价标准

  1. 吞吐量:吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即 吞吐量 = 执行用户代码时间 / (执行用户代码时间 + G C 时间) 吞吐量 = 执行用户代码时间 /(执行用户代码时间 + GC时间) 吞吐量=执行用户代码时间/(执行用户代码时间+GC时间)
    • 吞吐量数值越高,垃圾回收的效率就越高.比如:虚拟机总共运行了 100 分钟,其中GC花掉 1 分钟,那么吞吐量就是 99%
  2. 最大暂停时间:最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。最大暂停时间越短,用户使用系统时受到的影响就越短。
    在这里插入图片描述
  3. 堆使用效率:不同垃圾回收算法,对堆内存的使用方式是不同的。比如标记清除算法,可以使用完整的堆内存。而复制算
    法会将堆内存一分为二,每次只能使用一半内存。从堆使用效率上来说,标记清除算法要优于复制算法
    在这里插入图片描述

  • ==上述三种评价标准:堆使用效率、吞吐量,以及最大暂停时间不可兼得。==一般来说,堆内存越大,最大暂停时间就越长。想要减少最大暂停时间,就会降低吞吐量。
  • 不同的垃圾回收算法,适用于不同的场景。没有最好的垃圾回收算法之说,只有不同场景下更合适的回收算法。

垃圾分类算法分类

标记清除算法

核心思想

  • 标记清除算法的核心思想分为两个阶段:第一标记阶段和第二清除阶段。
    1. 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出有存活对象。
    2. 清除阶段,从内存中删除没有被标记也就是非存活对象
      在这里插入图片描述

标记清除算法优缺点

  • 优点:实现简单,只需要在第一阶段给每个对象维护标志位,第二阶段删除对象即可
  • 缺点:碎片化问题;分配速度慢
    1. 碎片化问题:由于内存是连续的,在对象被删除后,内存中会出现很多细小的可用内存单元。对象需要一个比较大的空间,很有可能这些内存单元的大小过小无法进行分配。
      在这里插入图片描述
    2. 分配速度慢:由于内存碎片的存在,需要维护一个空闲链表,可能每次需要遍历到链表的最后才能获得合适的内存空间
      在这里插入图片描述

复制算法

核心思想

  • 复制算法的核心思想是:准备两块空间From空间和To空间,每次在对象分配阶段,只能使用其中一块空间(From空间)。在垃圾回收GC阶段,将From中存活对象复制到To空间。将两块空间的From和To名字互换。
    在这里插入图片描述

完整案例

完整的复制算法的例子:

  1. 将堆内存分割成两块From空间 To空间,对象分配阶段,创建对象
  2. GC阶段开始,将GC Root搬运到To空间
  3. 将GC Root关联的对象,搬运到To空间
  4. 清理From空间,并把名称互换
    在这里插入图片描述

复制算法的优缺点

  • 优点:吞吐量高、不会发生碎片化
    • 吞吐量高:复制算法只需遍历一次存活对象复制到To空间即可,比标记-整理算法少一次遍历的过程,因而性能较好,但是不如标记-清除算法,因为标记清除算法不需要进行对象的移动
    • 不会发生碎片化:复制算法在复制之后就会将对象按顺序放入To空间中,所以对象以外的区域都是可用空间,不存在碎片化内存空间
  • 缺点:内存使用效率低
    • 每次只能让一半的内存空间来为创建对象使用

标记整理算法

  • 标记整理算法也叫标记压缩算法,是对标记清理算法中容易产生内存碎片问题的一种解决方案。

核心思想

  • 核心思想分为两个阶段:标记阶段和整理阶段
    1. 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象
    2. 整理阶段,将存活对象移动到堆的一端。清理掉存活对象的内存空间。
      在这里插入图片描述

标记整理算法优缺点

  • 优点:内存使用效率高、不会发生碎片化
    • 内存使用效率高:整个堆内存都可以使用,不会像复制算法只能使用半个堆内存
    • 不会发生碎片化:在整理阶段可以将对象往内存的一侧进行移动,剩下的空间都是可以分配对象的有效空间
  • 缺点:整理阶段效率不高
    • 整理算法有很多种,比如Lisp2整理算法需要对整个堆中的对象搜索3次,整体性能不佳。可以通过TwoFinger、表格算法、ImmixGC等高效的整理算法优化此阶段的性能

分代垃圾回收算法

  • 现代优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广的就是分代垃圾回收算法(Generational GC)。
  • 分代垃圾回收将整个内存区域划分为年轻代和老年代
    在这里插入图片描述

arthas查看分代内存情况

  1. 在JDK8中,添加-XX:+UseSerialGC参数使用分代回收的垃圾回收器,运行程序。
  2. 在arthas中使用memory命令查看内存,显示出三个区域的内存情况
    在这里插入图片描述

核心思想

  • 分代回收时,创建出来的对象,首先会被放入Eden伊甸园区。随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC。Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区。接下来,S0会变成To区,S1变成From区。当eden区满时再往里放入对象,依然会发生Minor GC。此时会回收eden区和S1(from)中的对象,并把eden和from区中剩余的对象放入S0。
  • 注意:每次Minor GC中都会为对象记录他的年龄,初始值为0,每次GC完加1。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 如果Minor GC后对象的年龄达到阈值(最大15,默认值和垃圾回收器有关),对象就会被晋升至老年代
    在这里插入图片描述
  • 当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收。
    如果Full GC依然无法回收掉老年代的对象,那么当对象继续放入老年代时,就会抛出Out Of Memory异常。
    在这里插入图片描述

虚拟机内存参数

  • 根据以下虚拟机参数,调整堆的大小并观察结果。注意加上-XX:+UseSerialGC
参数名参数含义示例
-Xms设置堆的最小和初始大小,必须是1024倍数且大于1MB比如初始大小6MB的写法: -Xms6291456、-Xms6144k、-Xms6m
-Xmx设置最大堆的大小,必须是1024倍数且大于2MB比如最大堆80 MB的写法:-Xmx83886080、-Xmx81920k、-Xmx80m
-Xmn新生代的大小新生代256 MB的写法:-Xmn256m、-Xmn262144k、-Xmn268435456
-XX:SurvivorRatio伊甸园区和幸存区的比例,默认为8新生代1g内存,伊甸园区800MB,S0和S1各100MB比例调整为4的写法:-XX:SurvivorRatio=4
-XX:+PrintGCDetails/verbose:gc打印GC日志

StopWorldTest案例代码

import lombok.SneakyThrows;
import java.util.LinkedList;
import java.util.List;/*** STW测试*/
public class StopWorldTest {public static void main(String[] args) {new PrintThread().start();new ObjectThread().start();}
}class PrintThread extends Thread{@SneakyThrows@Overridepublic void run() {//记录开始时间long last = System.currentTimeMillis();while(true){long now = System.currentTimeMillis();System.out.println(now - last);last = now;Thread.sleep(100);}}
}class ObjectThread extends Thread{@SneakyThrows@Overridepublic void run() {List<byte[]> bytes = new LinkedList<>();while(true){//最多存放8g,然后删除强引用,垃圾回收时释放8gif(bytes.size() >= 80){bytes.clear();}bytes.add(new byte[1024 * 1024 * 100]);Thread.sleep(10);}}
}

GC案例1

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 垃圾回收器案例1*/
//-XX:+UseSerialGC  -Xms60m -Xmn20m -Xmx60m -XX:SurvivorRatio=3  -XX:+PrintGCDetails
//-XX:+UseParNewGC -XX:+UseConcMarkSweepGC  -XX:ConcGCThreads
//-XX:+UseParallelGC  -XX:+UseParallelOldGC
public class GcDemo1 {public static void main(String[] args) throws IOException {List<Object> list = new ArrayList<>();int count = 0;while (true){System.in.read();System.out.println(++count);//每次添加1m的数据list.add(new byte[1024 * 1024 * 1]);}}
}

GC案例2

/*** 垃圾回收器案例2*/
//-XX:+UseSerialGC -Xmn10m -Xmx30m -XX:SurvivorRatio=8  -XX:+PrintGCDetails -verbose:gc
public class GcDemo2 {public static void main(String[] args) throws IOException {List<Object> list = new ArrayList<>();int count = 0;while (true){System.in.read();System.out.println(++count);//每次添加1m的数据list.add(new byte[1024 * 1024 * 1]);}}
}

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

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

相关文章

stm32软件安装以及创建工程

文章目录 前言一、软件安装软件破解 二、创建工程三、创建项目创建组配置启动文件添加到组 为项目添加头文件路径创建源文件&#xff08;main函数文件&#xff09;使用寄存器配置引脚拼接好STLINK与stm32最小电路板的接线编写程序配置STLink下载程序配置寄存器配置13号端口&…

用户体验优化:HubSpot的秘密武器

在当今数字化市场中&#xff0c;提升用户体验已经成为企业成功的关键因素之一。HubSpot&#xff0c;作为一款领先的营销自动化工具&#xff0c;不仅在推动销售业绩上表现出色&#xff0c;同时通过其独特的策略也致力于提升用户体验。运营坛将深入探讨HubSpot是如何通过个性化推…

Leetcode—41. 缺失的第一个正数【困难】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—41. 缺失的第一个正数 实现代码 class Solution { public:int firstMissingPositive(vector<int>& nums) {int n nums.size();// nums[i] i 1;// nums[i] - 1 i;// nums[nums[i] - 1] nums[i];for(int …

能源管理新高度DI/DO/CAN/RS485/USB网关助力二次开发

能源管理领域正在寻求更为智能化和高效的解决方案。一款集成了先进ARM架构处理器的边缘计算能源储能网关应运而生&#xff0c;以其卓越的性能和丰富的接口功能吸引了众多行业用户的关注。 这款网关不仅配备有常规的数字输入&#xff08;DI&#xff09;、数字输出&#xff08;DO…

【简便方法和积累】pytest 单元测试框架中便捷安装插件和执行问题

又来进步一点点~~~ 背景&#xff1a;之前写了两篇关于pytest单元测试框架的文章&#xff0c;本篇内容对之前的做一个补充 一、pytest插件&#xff1a; pytest 有非常多的插件&#xff0c;很方便&#xff0c;以下为插件举例&#xff1a; pytest&#xff0c;pytest-html&#x…

新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)

本文记录于数学建模老哥视频的学习过程中。b站视频&#xff1a;http://【【零基础教程】老哥&#xff1a;数学建模算法、编程、写作和获奖指南全流程培训&#xff01;】https://www.bilibili.com/video/BV1kC4y1a7Ee?p50&vd_sourceff53a726c62f94eda5f615bd4a62c458 目录…

树型结构构建,模糊查询,过滤

一、前言 1、最近在做甘特图&#xff0c;有些需求和树型结构要求很大&#xff0c;看的是 pingCode&#xff0c;有搜索 2、还有抽取一部分树型结构的&#xff0c;如下是抽取上面的结构类型为需求的&#xff0c;重新组成树型 二、构建多颗树型结构 1、某些业务下&#xff0c;从…

C语言指针的几种用途

先看题目&#xff0c;写一个fun函数&#xff0c;统计一个字符串中某个字符出现的次数&#xff0c;以及这个字符第一次出现的位置。 看起来很简单&#xff0c;似乎几行就可以搞定&#xff0c;但是写出来之后&#xff0c;才发现代码怎么这么长&#xff01;程序里多处使用了指针&…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件&#xff1a;子组件A&#xff1a;子组件B&#xff1a;eventbus/index.js&#xff1a; EventBus的基本使用方法&#xff1a; 示例背景 在Vue中&#xff0c;使用EventBus可以实现组件…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了&#xff0c;因为urllib现在已经很少人用&#xff0c;大部分人用得是requests&#xff0c;requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA&#xff01; 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

Java开发工具 IntelliJ IDEA 2023中文

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于多种编程语言&#xff0c;包括Java、Python、Kotlin等。它提供了许多特色功能&#xff0c;以提高开发效率和代码质量。 Java开发工具 IntelliJ IDEA 2023中文 以下是一些IntelliJ ID…

大数据分析|设计大数据分析的三个阶段

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

扫盲软件开发工具低代码

目录 一、低代码是什么&#xff1f; 二、低代码平台的优势和劣势都是什么&#xff1f; 三、低代码操作方式 四、写在最后 一、低代码是什么&#xff1f; 低代码是一套可视化开发工具&#xff0c;它帮开发者把前后端基础功能写扎实&#xff0c;开发者只需要通过填表配置或拖…

C#——三角形面积公式

已知三角形的三个边&#xff0c;求面积&#xff0c;可以使用海伦公式。 因此&#xff0c;可以执行得到三角形面积公式的计算方法代码如下&#xff1a; /** / <summary>* / 三角形面积公式* / </summary>* / <param name"a">边长a</param>*…

OfficeWeb365 Readfile 任意文件读取漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 Rea…

前端常见标签

<li> (List Item)&#xff1a;定义列表中的一个项目&#xff08;项&#xff09; <ul> (Unordered List)&#xff1a;定义无序列表 <ol> (Ordered List)&#xff1a;定义有序列表 <a> (Anchor Tag)&#xff1a;定义超链接 <ul><li>苹…

何以穿越产业周期?解读蓝思科技2023年增长密码

1月30日晚&#xff0c;蓝思科技发布了2023年业绩预告&#xff0c;2023年预计实现归母净利润29.38亿元-30.60亿元&#xff0c;同比增长20%-25%。 松果财经注意到&#xff0c;蓝思科技通过垂直整合&#xff0c;构筑了更具竞争力的产业链条。一方面&#xff0c;公司打造了包含ODM…

蓝桥杯---煤球数目

有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 代码 pu…

Web3生态系统:构建去中心化的数字社会

随着科技的飞速发展&#xff0c;我们正处在迈向数字未来的道路上&#xff0c;而Web3生态系统则成为这一变革的中心。不仅仅是技术的演进&#xff0c;Web3代表着对传统互联网体系的颠覆&#xff0c;致力于构建一个去中心化的数字社会。本文将深入探讨Web3的核心特征、对金融、社…

3dmatch-toolbox详细安装教程-Ubuntu14.04

3dmatch-toolbox详细安装教程-Ubuntu14.04 前言docker搭建Ubuntu14.04安装第三方库安装cuda/cundnn安装OpenCV安装Matlab 安装以及运行3dmatch-toolbox1.安装测试3dmatch-toolbox(对齐两个点云) 总结 前言 paper:3DMatch: Learning Local Geometric Descriptors from RGB-D Re…