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

《JVM由浅入深学习【八】 2024-01-12》JVM由简入深学习提升分(JVM的垃圾回收算法)

目录

    • JVM的垃圾回收算法
      • 1. 标记-清除算法(Mark-Sweep)
        • 原理
        • 步骤
        • 优点
        • 缺点
      • 2. 复制算法(Copying)
        • 原理
        • 步骤
        • 优点
        • 缺点
      • 3. 标记-整理算法(Mark-Compact)
        • 原理
        • 步骤
        • 优点
        • 缺点
      • 4. 分代收集算法(Generational Collection)
        • 原理
        • 步骤
        • 优点
        • 缺点
      • 结论

JVM的垃圾回收算法

引言
Java虚拟机(JVM)的垃圾回收(GC)是Java内存管理的重要部分。正确理解不同的垃圾回收算法对于优化Java应用性能至关重要。本文将探讨JVM中常见的垃圾回收算法,分析它们的工作原理,并对比它们的优缺点。

1. 标记-清除算法(Mark-Sweep)

原理

标记-清除算法分为“标记”和“清除”两个阶段:首先标记出所有从根集合(如线程栈、静态字段等)可达的对象,然后清除未被标记的对象。

步骤

步骤1(标记):显示内存堆中的对象,用不同颜色标记可达和不可达的对象。
步骤2(清除):展示清除后的内存堆,不可达对象被移除。

优点

简单直观。
不需要额外移动存活对象。

缺点

清除后会产生大量内存碎片。
标记和清除过程效率不高。

2. 复制算法(Copying)

原理

将内存划分为两块,每次只使用其中一块。当这一块内存用完时,程序就将所有存活的对象复制到另一块内存中,然后清除当前块的所有对象。

步骤

复制前:展示内存的两个区域,其中一个区域包含对象。
复制后:存活的对象被复制到另一块区域中,原区域被清空。

优点

无内存碎片。
复制过程中仅处理存活的对象,适合对象存活率低的场景。

缺点

内存利用率低,只能使用一半的内存。
对象复制需要时间,影响性能。

3. 标记-整理算法(Mark-Compact)

原理

类似于标记-清除算法,但在清除阶段不直接释放未被标记的对象,而是将所有存活的对象都向一端移动,然后清理掉边界以外的内存。

步骤

标记阶段:显示标记存活对象的过程。
整理阶段:显示所有存活对象向内存的一端移动的过程。

优点

解决了内存碎片问题。
保持了较高的内存利用率。

缺点

移动对象需要时间,可能会暂停用户线程。
实现相对复杂。

4. 分代收集算法(Generational Collection)

原理

基于对象的生命周期不同,将内存划分为几个代,如年轻代、老年代等。不同代使用不同的垃圾回收算法。

步骤

内存分代示意图:展示年轻代和老年代的内存分布。
各代的垃圾回收过程:分别展示年轻代使用复制算法,老年代使用标记-清除或标记-整理算法的过程。

优点

提高了垃圾回收的效率和内存的利用率。
可以针对不同代的特点优化算法。

缺点

管理复杂,需要调整各代的大小和回收频率。

结论

不同的垃圾回收算法各有优劣,通常JVM会根据具体应用的需求和特点选择合适的算法。理解这些算法的原理和特点对于优化Java应用和调试内存问题非常有帮助。

http://www.lryc.cn/news/278723.html

相关文章:

  • 在矩阵回溯中进行累加和比较的注意点
  • AI语音机器人的发展
  • SQL语句错误this is incompatible with sql_mode=only_full_group_by解决方法
  • 静态长效代理IP和动态短效代理IP有哪些用途?分别适用场景是什么?
  • 基于Spring Boot+Vue的课堂管理系统(前后端分离)
  • 供排水管网管理信息化的必要性
  • 统一格式,无限创意:高效管理不同格式图片批量转换
  • 工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV
  • 中国智造闪耀CES | 木牛科技在美国CES展亮相多领域毫米波雷达尖端方案
  • 亚马逊衣物收纳 梳妆台 收纳柜CPC认证ASTM F2057-23 报告分析
  • 【设计模式】02-SOLID 设计原则
  • 突然间我懂了软件
  • 游戏美术的技与艺
  • Python(35):Python3 通过https上传文件和下载文件
  • 【MySQL】日期格式为 YYYY-MM 无法直接使用 DATE_SUB 函数的解决方案(特殊处理 或 PERIOD_DIFF 函数)
  • Redis的key淘汰方式和内存不足淘汰方式
  • java使用redis
  • MySQL技能树
  • redis获取过期时间
  • ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin
  • MergeTwoSortedLists 【合并有序链表】
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpRequest模块 解析http请求协议
  • muduo网络库剖析——网络地址InetAddress类
  • 什么是本地IP?服务器本地IP有哪些优势?
  • Open CASCADE学习|参数化球面的奇异性
  • 基础知识篇(一)Acticity生命周期
  • Java内存结构
  • Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表
  • SpringSecurity 密码加密登录
  • 大模型实战作业03