《他强由他强,清风拂山岗;他横由他横,明月照大江》之四

JVM垃圾回收

1.JVM中判断对象存活的方法

  • 引用计数法
    每个对象都有一个与之关联的引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1。
    优点:高效、简单
    缺点:无法解决循环引用问题
  • 可达性分析算法
    目前主流的商用程序语言(包括Java)主要采用的算法,它通过一系列的"GC Roots"作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到"GC Roots"没有任何引用链相连(即从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
    GC Roots含有以下对象:
    虚拟机栈中引用的对象(栈帧中的本地变量表)
    方法区中静态属性引用的对象
    方法区中常量引用的对象
    本地方法栈内JNI(native)引用的对象

2.GC算法

  • 标记-清除法
    垃圾回收器首先标记出所有从根集合(如线程栈、静态域等)开始遍历能够到达的对象,这些为存活对象。标记完成后,清除阶段将回收掉所有未被标记的对象
    缺点:效率不高,标记和清除都需要时间;标记清除后产生大量内存碎片
  • 标记-整理法
    标记-整理算法在标记-清除算法的基础上改进。首先标记所有存活的对象,然后,再让所有存活的对象都向一端移动,接着清理掉端边界以外的内存
    优点:解决了标记-清除算法中内存碎片过多的问题
    缺点:移动对象需要更多的时间和处理能力
  • 复制算法
    将可用内存分为两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。
    优点: 没有内存碎片,回收效率较高。
    缺点: 直接明显的是内存利用率降低为原来的一半
  • 增量收集
    为了防止在GC期间长时间的停顿,增量收集算法将垃圾收集工作分成多个小步骤,分散到应用程序的执行中间。
    优点: 减少单次垃圾收集时的停顿时间。
    缺点: 相对提高了回收的总体开销,可能影响系统吞吐量。
  • 分代收集算法
    根据对象存活的时间将内存划分为几个区域,通常是新生代、老年代和永生代。新生代采用复制算法,老年代采用标记-清除或标记-整理算法。因为大多数对象生命周期短,这样可以使得大部分的内存回收都在新生代完成,提高回收效率。
    优点: 提高了回收效率,减少了GC的停顿时间,更加适应对象生命周期规律。
    缺点: 设计和实现相对复杂。

3.CMS

并发标记清除(Concurrent Mark-Sweep,简称CMS)垃圾回收器主要使用的算法是“并发标记-清除”算法。它旨在减少应用程序停顿的时间,特别适用于对停顿时间敏感的多线程应用。他的回收过程如下:

  • 初始标记(stop-the-world)
    这个阶段标记所有直接与GC根相连的对象。这个阶段很快,但是需要停止应用程序所有的工作线程
  • 并发标记
    在这个阶段,GC遍历堆中对象图,标记所有从GC根开始可达的对象。此阶段是并发执行的,不需要暂停应用线程
  • 预清理
    这个阶段的目的是处理自从并发标记阶段开始后,在应用线程运行期间产生的一些变动,由于此阶段并发执行,因此会有多次小的暂停
  • 重新标记(stop-the-world)
    重新标记阶段用来完成最终的标记,并处理自并发标记以来发生的任何变化。这一阶段通常使用算法(如增量更新或快照算法)来减少停顿时间,并且这里还包含了一次短暂的全线程暂停。
  • 并发清除
    在这个并发清除阶段,GC将清理那些在标记阶段确认为死亡的对象。此阶段同样并发执行,不停止应用线程。
  • 并发重置
    完成垃圾收集后,为下一个GC循环准备工作,这包括清除内部数据结构,为下次回收工作重置状态等。这一阶段也是并发执行的。
使用场景说明
  • 低延迟要求
    对于需要快速响应,不能承受长时间GC停顿的应用(如交互式网站、在线游戏、交易系统等),CMS因其具有较短的停顿时间而更为合适。
  • 多核CPU环境
    CMS可以充分利用多核CPU环境,因为它在进行垃圾收集时可以并发地执行,不会阻塞用户线程。
  • 稳定负载的服务器
    适用于服务负载相对平稳,具有足够处理能力来同时处理应用负载和垃圾收集任务的服务器
    缺点:
    内存碎片:CMS可能会导致较多的内存碎片,所以在内存分配大对象时可能会提前触发Full GC,相对增加了系统的不确定性。
    资源占用:为了达到快速响应的目的,CMS通常会占用更多的CPU资源,如果在CPU负载已经很高的系统中使用CMS,可能会影响应用的整体性能。
    预留内存问题:由于CMS不进行压缩,因此要求必须设置一定的预留内存(-XX:CMSInitiatingOccupancyFraction),以避免过频繁地执行Full GC。
    基于上述缺点,如果你的应用未对停顿时间有特别需求,或者运行在资源较紧张的环境下,可能就不适合使用CMS。

4.G1

G1(Garbage-First)垃圾回收器使用的是一种结合了分代收集和分区(Region-based)的垃圾回收算法。与传统的分代收集器不同,G1将整个Java堆划分为多个大小相等的独立区域(Region),每个区域都可能扮演新生代、老年代或者是幸存者区(Survivor space)的角色。G1的目标是提供一个即可以处理大堆场景也能保持稳定停顿时间的收集器。
G1的工作过程如下

  • 初始标记(stop-the-world)
    此阶段标记所有从GC根直接可达的对象。这个阶段需要停止应用线程,但是停顿时间较短。
  • 并发标记
    在这个阶段中,G1收集器遍历堆中的对象图,标记所有存活对象。此阶段并发执行,不会停止应用线程。
  • 最终标记 (stop-the-world)
    G1在这个阶段完成存活对象的最终标记,它使用一种称为“快照-在-开始(Snapshot-At-The-Beginning, SATB)”的标记算法来记录并发标记阶段发生的引用变化。为了减少停顿时间,G1会使用多线程和一些算法优化,如记忆集(Remembered Set)清理和卡表(Card Table)扫描。最终标记阶段需要短暂停止应用线程。
  • 筛选回收(stop-the-world)
    在此阶段发生真正的垃圾收集行为,G1会选择一些区域进行清理,首先是完全空闲的区域,然后是混合区域(含有一定比例垃圾的老年代区域)。存活对象会被复制到其他区域,而被清理的区域会被完全回收。这个阶段需要停止应用线程,但G1的目标是使这个停顿时间变得可以预测和配置
使用场景说明
  • 大内存应用:G1垃圾回收器特别适合需要大堆内存(Heap)的应用。由于G1通过将堆分割成多个区域(Region)来管理内存,这使得它能够更高效地处理大量数据,是处理大内存堆的理想选择。

  • 对停顿时间敏感的应用:G1设计目标是为了提供可预测的停顿时间,通过允许用户设定期望的停顿时间(比如50毫秒),G1能够通过控制每次垃圾收集的工作量来满足这个目标。因此,对于需要低延迟、对停顿时间敏感的应用(如金融交易系统、大型在线游戏等),G1是一个很好的选择。

  • 需要平滑的吞吐量的应用:对于那些需要同时保证较低的停顿时间和较高吞吐量的应用,G1提供了一种平衡方案。通过自适应的调整垃圾收集的策略,G1旨在最小化对应用吞吐量的影响。

  • 需要灵活配置和调优的应用:G1提供了较为丰富的配置参数,允许开发者和调优专家根据具体应用特点进行详细的调优,以期达到最佳的性能表现。

CMS和G1优缺点对比

G1 垃圾回收器的优点

  • 可预测停顿时间:G1提供了更可预测的停顿时间模型,允许用户指定期望的停顿时间目标。

  • 改善内存碎片问题:通过在并发回收期间对堆进行增量压缩动作,G1可以减少内存碎片。

  • 大堆优化:G1专为大内存堆设计,非常适合多核服务器环境,并能有效管理大规模的内存。

  • 平衡吞吐量和停顿时间:G1综合考虑吞吐量和停顿时间,通过分区并行回收可以获得更好的总体性能。

  • 灵活的堆划分:G1将堆划分成多个区域,可以细致地控制回收过程,优化GC的过程和暂停时间。

G1 垃圾回收器的缺点

  • 资源占用:由于G1复杂的算法和并发性,它可能在某些情况下要比CMS消耗更多的CPU资源。

  • 初始调优:G1在默认设置下可能不会立即提供最优性能,可能需要一些额外调优以适应特定应用。

过渡期的性能波动:G1在取代CMS过程中,在某些特定场景下可能会出现相对CMS的性能回退。

CMS 垃圾回收器的优点

  • 低延迟:CMS设计目标是减少应用程序停顿时间。对于依赖较低延迟的应用程序,CMS仍然是一个不错选择。

  • 成熟稳定:CMS已经存在多年,它在许多应用和环境中表现出了成熟和稳定。

CMS 垃圾回收器的缺点

  • 内存碎片:CMS不能压缩堆,可能导致内存碎片,这在长时间运行的应用中会逐渐成为问题。

  • 预留空间和并发失败:CMS需要较大的预留内存以避免并发模式失败导致的频繁Full GC,这限制了其在大内存应用中的效率。

  • 停顿时间不可预测:CMS在某些情况下可能会有不可预测的长停顿时间,特别是在做Full GC的时候。

5.Safepoint

当发生 GC 时,用户线程必须全部停下来,才可以进行垃圾回收,这个状态我们可以认为 JVM 是安全的(safe),整个堆的状态是稳定的。如果在 GC 前,有线程迟迟进入不了 safepoint,那么整个 JVM 都在等待这个阻塞的线程,造成了整体 GC 的时间变长。

如何到达Safepoint
JVM利用两种主要的方式来使线程到达Safepoint:

主动式请求(Polling):这种方法下,JVM在执行字节码指令的过程中插入Safepoint检查点。这意味着线程将定期检查是否需要到达Safepoint。如果是,线程会在下一个Safepoint检查处主动停下来。

被动式等待:在这种策略下,如果一个线程因为执行某些系统调用或者等待I/O操作而被阻塞,它可以被视为已经处于Safepoint状态,因为这种情况下线程的状态是已知且控制的。

Safepoint的作用
达到Safepoint是垃圾回收和其他影响整个JVM状态的操作能够安全执行的前提条件。这个机制确保了在进行这些操作时,没有正在执行的线程会更改JVM的内存状态,这对于垃圾回收器正确识别可达对象、重新编译方法或执行其他需要全局视角的操作是十分重要的。

对性能的影响
尽管Safepoint是JVM正常操作的必要部分,但是当JVM频繁尝试到达Safepoints时,可能会对应用程序的性能产生影响。在这种情况下,应用的线程可能会因为需要等待到达Safepoint而经常停顿。这种停顿通常称为“Safepoint停顿”或“Safepoint同步时间”。根据JVM的设计和配置,以及应用程序的特性,这些停顿的影响会有所不同。

总的来说,Safepoint是JVM保证内存一致性和执行特定操作安全性的关键机制,尽管其实现和使用需要在性能和安全性之间做出平衡。

6.动态对象年龄判定

为了能更好地适应不同程序的内存状况,虚拟机并不总是要求对象的年龄必须达到阈值才能进入老年代。如果在 Survivor 区中相同年龄的所有对象的空间总和大于 Survivor 区空间的一半,则年龄大于或等于该年龄的对象直接进入老年代。

7.空间分配担保

在发生 Minor GC 之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的空间总和,如果这个条件成立,那么 Minor GC 可以确保是安全的。如果不成立则进行 Full GC。

8. JVM性能调优常用参数

jps:查看java进程及相关信息

jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数

jinfo:查看JVM参数

jinfo 11666
jinfo -flags 11666
Xmx、Xms、Xmn、MetaspaceSize

jstat:查看JVM运行时的状态信息,包括内存状态、垃圾回收

jstat [option] LVMID [interval] [count]

常用的jstat选项
以下是一些jstat中常用的选项及其描述:

-class: 显示类装载情况。
-gc: 显示与垃圾回收(GC)相关的堆信息。
-gccapacity: 显示各个代(Young, Old Generations)的容量及其相应的空间。
-gccause: 显示GC统计信息(和-gcutil一起显示)以及最后一次或正在进行的GC事件的原因。
-gcutil: 显示GC的总结信息,例如堆各部分的使用百分比。
-gcnew: 显示新代的行为(即Young Generation)。
-gcnewcapacity: 显示新代(Young Generation)的各部分大小。
-gcold: 显示老代的行为(即Old Generation)。
-gcoldcapacity: 显示老代(Old Generation)的大小。
-gcmetacapacity: 显示元数据区的容量。
jstack:查看JVM线程快照,jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环

jstack [option] <java process id or core file name or remote debug server>

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

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

相关文章

【腾讯云智笔试题——分苹果时间复杂度和空间复杂度都是O(1)】

文章目录 题目描述解题思路&#xff1a;思路讲解&#xff1a; 题目描述 有m个苹果&#xff0c;n个小孩。每个小孩都有一个编号&#xff0c;小明的编号是。要尽量公平的分苹果&#xff0c;相邻编号的小孩分到的苹果数目差距不能大于1。 请问如何在满足相邻编号的小孩分到的苹果…

wsl2平台鸿蒙全仓docker编译环境快速创建方法

文章目录 1 文章适用范围&#xff1a;2 WSL环境安装3 镜像迁移非C盘4 Docker环境准备4.1 docker用户组和用户创建4.2 Docker环境配置4.2.1 Ubuntu下安装docker工具4.2.2 鸿蒙Docker环境安装4.2.3 鸿蒙全仓代码拉取编译 5 鸿蒙全仓代码的更新策略6 参考文献7 FAQ7.1 缺头文件xcr…

【0基础学爬虫】爬虫基础之自动化工具 Appium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

CentOS 5(CentOS 6、Redhat 6)服务器配置VNC

一、配置服务器yum源 yum源&#xff08;本地、华为云、阿里云、网易&#xff09; 二、使用yum安装vnc服务 1、检查系统是否安装了vnc 和 vncserver&#xff0c; rpm -qa | grep vnc如果没有安装那就行自行下载安装&#xff08;我这里用yum安装了&#xff0c;vncserver安装需…

设计程序,实现高精度圆周率的计算和存储,使用线性表突破程序设计语言内置变量的数值和有效数字范围限制

一、使用线性表突破程序设计语言内置变量的数值和有效数字范围的限制&#xff0c;为了实现高精度圆周率的计算&#xff0c;先根据数学公式进行对PI高精度运算&#xff0c;如图1-1。根据这个数学公式 π2 0nn!2n1‼ 即 Rn1Rn*n2n1&#xff0c;R11&#xff0c;sum π2* n1∞Rn 来…

sql-server数据库的备份与还原

一、数据库的备份 BACKUP DATABASE [pathogen-jeecg] TO DISK D:\pathogenManagement\pathogen_jeecg_Full.bak WITH COMPRESSION, STATS 10, INIT; 二、数据库的还原 RESTORE DATABASE [pathogen_jeecg_jw] FROM DISK D:\pathogenManagement\pathogen_jeecg_Full.bak …

Redis学习|Redis基础知识、Redis五大数据类型、Redis三种特殊数据类型、Redis事务

Redis基础知识 redis默认有16个数据库&#xff0c;并且这个数量可以在conf配置文件中更改 默认使用的是第0个 可以使用 select 进行切换数据库! key *查看数据库所有的key 清除当前数据库 flushdb 清除全部数据库的内容FLUSHALL 为什么redis是6379!(了解一下即可!) Redis 是…

【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

文章目录 一、Graham 凸包扫描算法1、凸包概念2、常用的凸包算法3、Graham 凸包扫描算法 二、Graham 算法前置知识点1、角排序2、叉积3、算法过程分析 三、代码示例1、完整代码示例2、执行结果 使用 Graham 算法绘制的凸包效果 : 博客代码下载 : https://download.csdn.net/d…

大模型之-Seq2Seq介绍

大模型之-Seq2Seq介绍 1. Seq2Seq 模型概述 Seq2Seq&#xff08;Sequence to Sequence&#xff09;模型是一种用于处理序列数据的深度学习模型&#xff0c;常用于机器翻译、文本摘要和对话系统等任务。它的核心思想是将一个输入序列转换成一个输出序列。 Seq2Seq模型由两个主…

上海市计算机学会竞赛平台2023年9月月赛丙组

题目描述 一开始&#xff0c;你只有一个数字&#x1d460;s&#xff0c;&#x1d460;s 只可能为 00 或 11。接下来&#xff0c;你需要将这个数字扩张 &#x1d45b;n 轮&#xff0c;最后变成一个 2&#x1d45b;2&#x1d45b;2n2n 的矩阵&#xff0c;每轮的扩张规则如下&…

企业微信,机器人定时提醒

场景&#xff1a; 每天定时发送文字&#xff0c;提醒群成员事情&#xff0c;可以用机器人代替 人工提醒。 1&#xff09;在企业微信&#xff0c;创建机器人 2&#xff09;在腾讯轻联&#xff0c;创建流程&#xff0c;选择定时任务&#xff0c;执行操作&#xff08;企业微信机…

未登录也能知道你是谁?浏览器指纹了解一下!

引言 大多数人都遇到过这种场景&#xff0c;我在某个网站上浏览过的信息&#xff0c;但我并未登录&#xff0c;可是到了另一个网站发现被推送了类似的广告&#xff0c;这是为什么呢&#xff1f; 本文将介绍一种浏览器指纹的概念&#xff0c;以及如何利用它来判断浏览者身份。…

FIddler+Proxifer 实现PC客户端抓包详细教程

文章目录 前言1、Proxifer下载和配置1.1、下载Proxifer1.2、Proxifier配置 2、FIddler下载和配置2.1、FIddler下载2.2、FIddler配置 3、三、为什么抓不到有些应用程序的HTTP(s)的包&#xff1f; 前言 一般在浏览器场景下&#xff0c;我们可以利用Fiddler很好的完成抓包&#x…

计算机网络学习3

文章目录 以太网的MAC帧格式虚拟局域网VLAN概述虚拟局域网VLAN的实现机制以太网的发展802.11无线局域网的组成无线局域网的物理层无线局域网的数据链路层---使用CSMA/CD协议802.11无线局域网的MAC帧 网络层网络层概述网际协议IP和4.2.1异构网络互联IPv4地址及其编址方法概述IPv…

webpack处理样式资源04--webpack入门学习

处理样式资源 本章节学习使用 Webpack 如何处理 Css、Less、Sass、Scss、Styl 样式资源 介绍 Webpack 本身是不能识别样式资源的&#xff0c;所以我们需要借助 Loader 来帮助 Webpack 解析样式资源 我们找 Loader 都应该去官方文档中找到对应的 Loader&#xff0c;然后使用…

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后&#xff0c;为了验证osgearth编译是否正确&#xff0c;进行测试&#xff0c;模型加载代码如下&#xff1a; root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题&#xff0c;遂改为以下代码…

Kithara实时定时器

管理定时器和实时定时器 目录 管理定时器和实时定时器管理时间数据通用定时器编程初始化计时器删除计时器停止/启动/调整定时器备注RealTimer 备注项目实例项目结构项目源码 示例更多&#xff1a; 管理时间数据 在 Kithara RealTime Suite 中&#xff0c;所有时间值均以 100 ns…

Pikachu靶场--文件上传

参考借鉴 Pikachu靶场之文件上传漏洞详解_皮卡丘文件上传漏洞-CSDN博客 文件上传漏洞&#xff1a;pikachu靶场中的文件上传漏洞通关_pikachu文件上传通关-CSDN博客 client check 在桌面新建一个文件夹&#xff0c;准备一个hello.php文件&#xff0c;文件写入如下代码 <?p…

产品3D模型在线展示

产品3D模型可以向潜在客户提供360度的观察角度&#xff0c;比平面图形的效果更好。快速实现产品3D模型的在线展示最简单的方法是使用老子云3D可视老子云3D可视化的模型内嵌特性&#xff0c;无需任何开发工作&#xff0c;5分钟就可以完成&#xff1a; 老子云的模型内嵌功能&…

[YOLOv10:注意力机制的轻量化创新,MLCA在目标检测中的卓越表现]

本文改进:一种轻量级的Mixed Local Channel Attention (MLCA)模块,该模块考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果。 1.YOLOv10介绍 论文:[https://arxiv.org/pdf/2405.14458] 代码: https://gitcode.com/THU-MIG/yolov10?utm_source=csdn…