JVM (四)GC过程

news2024/12/24 0:41:15

一。概述


程序计数器、虚拟机栈、本地方法栈都是随线程生灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,内存垃圾回收主要集中于Java堆和方法区中
GC整体流程示意图:
① 年轻代对象的移动
1,新创建的对象分配到eden区;
2,eden区满了触发minor gc,eden存活的对象被复制到from区(年龄+1),不存活的对象被回收;
3,当eden区再次满了,eden和from区的存活对象被复制到to区,from和to区交换。如果to区放不下,则晋升到老年代
4,几次minor gc后,当对象的年龄达到阈值(-XX:MaxTenuringThreshold默认是15)之后,就会被从年轻代Promotion到老年代;
② minor gc和major gc的时机
1. 在新生代申请内存空间不足的时候触发垃圾回收;
2. 判断老年代剩余空间是否大于年轻代所使用的内存
    1. 老年代剩余空间 > 年轻代所使用空间,直接进行Minor GC;
    2. 老年代剩余空间 < 年轻代所使用空间,这个时候要看有没有设置担保机制(-XX:HandlePromotionFailure)
        1. 设置了担保机制,则比较每一次Minor GC后晋升到老年代的平均大小和老年代的剩余空间大小:
            1. 平均晋升对象大小 < 老年代剩余空间大小,这个时候就执行Minor GC;
            2. 平均晋升对象大小 > 老年代剩余空间大小,这个时候就先执行Major GC;
        2. 没设置担保机制,则先进行一次Major GC(防Minor GC后老年代放不下晋升对象);
至于minor gc和major gc如何执行,那就是不同垃圾收集器做的事情了。

二。垃圾分类


三。对象存活判断


判断对象是否存活一般有两种方式:
引用计数
每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题
可达性分析(Reachability Analysis):
从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
在Java语言中,GC Roots包括
* 虚拟机栈中引用的对象;
* 方法区中类静态变量引用的对象;
* 方法区中常量引用的对象;
* 本地方法栈中JNI引用的对象;

四。垃圾收集算法


标记 -清除算法

是最基础的收集算法,是因为后续的收集算法都是基于这种思路。
分为“标记”和“清除”两个阶段:
  1. 标记出所有需要回收的对象;
  2. 统一回收掉所有被标记的对象;
优点:简单快捷;
缺点:内存碎片化严重

复制算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
每次对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。
优点:内存碎片化问题得到部分解决;
缺点:内存的有效使用率太低。

标记-整理算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
优点:解决内存碎片化问题并且内存利用率大大提高;
缺点:内存需要不断地变动,效率变低。

分代收集算法

严格来说并不是一种思想或理论,而是融合上述3种基础的算法思想,而产生的针对不同情况所采用不同算法的组合。
GC分代的基本假设:绝大部分对象的生命周期都非常短暂,存活时间短。
Java堆分为新生代和老年代,根据各个年代特点采用适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要复制少量存活对象就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清除”或“标记-整理”算法来进行回收。

五。垃圾收集器


如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。
详见:JVM 垃圾收集器
    

六。Stop-The-World


在垃圾回收过程中经常涉及到对对象的挪动,导致需要对对象引用进行更新。为了保证引用更新的正确性,Java将暂停所有其他的线程,这种情况被称为“Stop-The-World”,导致系统全局停顿,会对系统性能存在影响。

在JVM启动参数的GC参数里加上-XX:+PrintGCApplicationStoppedTime,可以把全部的JVM停顿时间(不只是GC),打印在GC日志里。这个参数,可以打出几乎一切的停顿……
2016-08-22T00:19:49.559+0800: 219.140: Total time for which application threads were stopped: 0.0053630 seconds

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

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

相关文章

【UE5|水文章】在UMG上显示帧率

参考视频&#xff1a; https://www.youtube.com/watch?vH_NdvImlI68 蓝图&#xff1a;

解决生产问题的万能接口(Java编译器API的使用)

文章目录 前言Tool和ToolProvider编译器工具&#xff1a;JavaCompiler文件管理文件&#xff1a;FileObject文件管理器&#xff1a;JavaFileManager 诊断监听器&#xff1a;DiagnosticDemo&#xff1a;allPowerfulInterface具体实现测试 结语 前言 当生产环境出现问题时&#x…

【大模型应用开发极简入门】提示工程一:1. 通过context、task、role文本结构设计有效的提示词、 2. OpenAI的提示词任务示例

文章目录 一. chat_completion函数二. 设计有效的提示词1.上下文1.1. 更多细节的上下文1.2. 让GPT改进上下文 2.任务2.1. 提供足够的任务信息2.2. OpenAI的任务示例语法纠正总结TL;DR概要Python转自然语言计算时间复杂度修复Python bug产生python函数 3.角色 了解LLM和OpenAI A…

【Linux】基础IO [万字之作]

目录 一.重谈文件 二.重谈C文件操作 1.操作 1.文件的打开和关闭 2.文件的读写操作 ​编辑 1.fgetc函数 2.fputc函数 3.fputs函数 4.fgets函数 5.fprintf函数 6.fscanf函数 7.fread函数 8.fwrite函数 三.重谈当前路径 四.系统文件操作接口 1.Open函数 2.write函数 3…

假期抢票难?程序员手写一个超强抢票脚本,轻松购得出行票!

距离五一假期只剩几天的时间&#xff0c;据央视财经报道&#xff0c;从4月17日开始&#xff0c;5月1日的火车票就可以通过铁路12306网站核车站售票窗口购买了&#xff0c;售票通道一打开&#xff0c;5月1日上午的热门目的地车票&#xff0c;几乎瞬间售罄。 有平台预计&#xff…

conda虚拟环境,安装pytorch cuda cudnn版本一致,最简单方式

1、pytorch版本安装&#xff08;卸载也会有问题&#xff09; &#xff08;1&#xff09;版本如何选择参考和卸载 https://zhuanlan.zhihu.com/p/401931724 &#xff08;2&#xff09;对应版本如何安装命令 https://pytorch.org/get-started/previous-versions/ 最简答安装参考…

网络数据包抓取与分析工具wireshark的安及使用

WireShark安装和使用 WireShark是非常流行的网络封包分析工具&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程中各种问题定位。 1 任务目标 1.1 知识目标 了解WireShark的过滤器使用,通过过滤器可以筛选出想要分析的内容 掌握Wir…

海外短剧推广平台的开发策略

在全球文化交融的背景下&#xff0c;海外短剧正逐渐成为观众的新宠。为了满足这一需求&#xff0c;我们提出了“视界无界&#xff1a;海外短剧推广平台”的开发策略。下面&#xff0c;我们将详细介绍这一策略的具体内容。 一、全球化内容策略 我们将积极引进全球各地的优质短…

找不到vcruntime140_1.dll无法继续执行的原因解析及解决方法

在现代的信息化社会中&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具之一。然而&#xff0c;在使用过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失vcruntime140_1.dll文件。那么&#xff0c;这个问题到底是怎么回事呢&#xff1f;小编将…

传神论文中心|第11期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

负氧离子监测站:打造健康生态的守护者

TH-FZ5随着人们对生活质量和健康水平的要求日益提高&#xff0c;空气质量成为了公众关注的焦点。其中&#xff0c;负氧离子作为空气中的一种重要成分&#xff0c;对人体健康有着显著的影响。负氧离子监测站作为监测空气中负氧离子浓度的专业设备&#xff0c;在现代环境监测和生…

Python 扫雷游戏【含Python源码 MX_010期】

简介&#xff1a; 游戏开始时&#xff0c;玩家会看到一个方格矩阵&#xff0c;其中一些方格下面藏有地雷&#xff0c;而其他方格则是空的。玩家可以通过输入坐标来选择方格&#xff0c;以揭开方格下隐藏的内容。如果揭开的方格下有地雷&#xff0c;则游戏失败&#xff1b;否则…

如何用Java程序实现一个简单的消息队列?

在Java程序中&#xff0c;可以使用内置的java.util.concurrent.BlockingQueue作为消息队列存放的容器&#xff0c;来实现一个简单的消息队列。 具体实现如下&#xff0c;在这个例子中&#xff0c;我们创建了一个生产者线程和一个消费者线程&#xff0c;他们共享同一个阻塞队列…

基于webrtc的媒体流传输工具tl-rtc-file

也不知道是什么意思&#xff0c;天天都有人在微信公众号的后台发&#xff0c;是打算找我兑奖吗&#xff1f; 本文软件是朋友 Eduna 推荐的&#xff0c;因为他觉得好像很好玩的样子。老苏一开始以为 tl-rtc-file 是跟 Snapdrop 一样的局域网文件传输工具&#xff0c;在看了 demo…

Anconda安装

参考: centos7篇---安装anaconda_centos7安装anaconda-CSDN博客 CentOS 7 上安装 Anaconda_centos安装conda-CSDN博客 CentOS7 安装Anaconda 的步骤_centos7安装anaconda-CSDN博客 centos7 如何安装与使用 Anaconda - 码农教程 下载 wget命令 wget https://repo.anaconda…

Flutter鸿蒙终端一体化-天下一统

在前面的文章中&#xff0c;我们了解了如何使用FlutterPage来创建Flutter容器。 Flutter鸿蒙终端一体化-混沌初开 Flutter鸿蒙终端一体化-珠联璧合 语雀 但更多的时候&#xff0c;我们需要的是一种类似FlutterFragment的方式来进行引用&#xff0c;可喜的是&#xff0c;鸿蒙…

稳定性测试要点+性能监控关键指标分析

前言 1、稳定性测试的要点 1&#xff09;长时间的以正常的业务负载进行运行&#xff08;最低为用户实际使用时的负载量&#xff0c;如果用户实际负载量低于最优负载量&#xff0c;也可以使用最优负载量&#xff09; 2&#xff09;稳定性的测试数据&#xff08;用户实际使用负…

文献解读-农业系列-第八期|《有害突变在多倍体棉花中积累速度快于二倍体棉花,且在亚基因组间不平衡》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;基因组多倍体化&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Deleterious Mutations Accumulate Faster in Allopolyploid Than Diploid Cotton (Gossypium) and Unequally betw…

【笔记】深度学习入门

神经网络基础 计算机视觉 1.1 人工智能的本质——线性模型 ykxb k为权重&#xff0c;b为偏置 像素点有323233072个任务点 所以权重有3072个&#xff0c;假设有10组类别&#xff0c;注意权重是一个矩阵 1.2 模型更新方法 权重一开始是随机的 权重和损失值&#xff0c;尝试…

进口电动对夹式硬密封蝶阀的特点-美国品牌

进口电动对夹式硬密封蝶阀的特点可以归纳如下&#xff1a; 一、结构特点 对夹式设计&#xff1a;采用对夹式连接&#xff0c;无需法兰和螺栓&#xff0c;安装简便快捷&#xff0c;降低了安装成本和空间占用。三偏心结构&#xff1a;阀座与蝶板之间采用三偏心设计&#xff0c;…