什么是Java垃圾回收器
Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快)。某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不是实时的发生(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,使用内存占总内存的比列,比如0.75)时,触发垃圾回收操作。有一个对象死亡的例外,java.lang.Thread
类型的对象即使没有引用,只要线程还在运行,就不会被回收。
回收的机制
依据统计分析可知,Java(包括一些其它高级语言)里面大多数对象生命周期都是短暂的,所以把Java内存分代管理。分代的目的无非就是为不同代的内存块运用不同的管理策略(算法),从而最大化性能。相对于年老代,通常年轻代要小很多,回收的频率高,速度快。年老代则回收频率低,耗时长。内存在年轻代里面分配,年轻代里面的对象经过多个回收周期依然存活的会自动晋升到年老代。
设计选型(Design Choices)
设计选型影响JVM垃圾回收器的实现难度,以及JVM的性能指标,适用于不同的场景。描述的是回收算法的风格特点。
单线程串行回收 VS 多线程并行回收
回收操作自身是否多线程处理的问题。单线程回收的优点是简单,易实现,碎片少,适用于单核的机器。多线程并行回收在多核机器上面可以充分的利用CPU资源,减少回收的时间,增加生产力,缺点是复杂且可能有部分碎片没有回收。
回收时暂停应用线程 VS 回收和应用并发进行
回收操作时是否暂停应用线程的问题。暂停应用线程的优点是简单、准确、清理得比较干净、清理的时间也短(CPU资源独占),缺点是暂停应用线程之后会造成垃圾回收周期内应用的回应时间拉长,实时性非常高的系统比较敏感。回收和应用线程并行处理的优点是应用反应时间比较平稳、缺点是实现难度大、清理频率高、可能有碎片。
不合并释放的内存片段 VS 合并释放的内存片段 VS 把活着的复制到新的地方
这三个选型描述的是如何管理死亡的内存块片段。死亡的内存片段通常散落在堆的各个地方,如果不加以管理会有两个问题,内存分配的时候因查找可用的内存而导致速度慢,小的碎片会导致内存的浪费(比如大的数组要求大的连续内存片段)。管理有两种方式,把活着的内存挪到内存块的某一端,记录可用内存的开始位置,或者干脆把活着的内存复制到一个新的内存区域,原来的内存块整个空出来。
性能指标(Performance Metrics)
-
生产率(Throughput)
一个较长的周期(长的周期才有意义)内,非回收时间占总时间的比率。度量系统的运行效率。 -
垃圾回收花费(Garbage Collection overhead)
一个较长的周期内,回收时间占总时间的比率。与生产率相对应,加起来为100%。 -
暂停时间间隔(Pause time)
Java虚拟机在回收垃圾的时候,有的算法会暂停所有应用线程的执行,某些系统可能对暂停的时间间隔比较敏感。 -
回收的频率(Frequency of collection)
平均多久会发生回收操作。 -
内存占用的大小(Footprint)
如堆的大小。 -
实时性(Promptness)
自一个对象死亡起,经过多久该对象所占用内存被回收。
垃圾回收的类型
所有的回收器类型都是基于分代技术。Java HotSpot虚拟机包含三代,年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation)。
-
永久代
存储类、方法以及它们的描述信息。可以通过-XX:PermSize=64m
和-XX:MaxPermSize=128m
两个可选项指定初始大小和最大值。通常 我们不需要调节该参数,默认的永久代大小足够了,不过如果加载的类非常多,不够用了,调节最大值即可。 -
年老代
主要存储年轻代中经过多个回收周期仍然存活从而升级的对象,当然对于一些大的内存分配,可能也直接分配到永久代(一个极端的例子是年轻代根本就存不下)。 -
年轻代
绝大多数的内存分配回收动作都发生在年轻代。比如,年轻代被划分为三个区域,原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区。
串行回收器(Serial Collector)
单线程执行回收操作,回收期间暂停所有应用线程的执行,client模式下的默认回收器,通过-XX:+UseSerialGC
命令行可选项强制指定。
-
年轻代的回收算法(Minor Collection)
把Eden区的存活对象移到To区,To区装不下直接移到年老代,把From区的移到To区,To区装不下直接移到年老代,From区里面年龄很大的升级到年老代。 回收结束之后,Eden和From区都为空,此时把From和To的功能互换,From变To,To变From,每一轮回收之前To都是空的。设计的选型为复制。 -
年老代的回收算法(Full Collection)
年老代的回收分为三个步骤,标记(Mark)、清除(Sweep)、合并(Compact)。标记阶段把所有存活的对象标记出来,清除阶段释放所有死亡的对象,合并阶段 把所有活着的对象合并到年老代的前部分,把空闲的片段都留到后面。设计的选型为合并,减少内存的碎片。
并行回收器(Parallel Collector)
使用多个线程同时进行垃圾回收,多核环境里面可以充分的利用CPU资源,减少回收时间,增加JVM生产率,Server模式下的默认回收器。与串行回收器相同,回收期间暂停所有应用线程的执行。通过-XX:+UseParallelGC
命令行可选项强制指定。
-
年轻代的回收算法(Minor Collection)
使用多个线程回收垃圾,每一个线程的算法与串行回收器相同。 -
年老代的回收算法(Full Collection)
年老代依然是单线程的,与串行回收器相同。
并行合并收集器(Parallel Compacting Collection)
年轻代和年老代的回收都是用多线程处理。通过命令可选项-XX:+UseParallelOldGC
指定,–XX:ParallelGCThreads=3
还可进一步指定参与并行回收的线程数。与串行回收器相同,回收期间暂停所有应用线程的执行。与并行回收器相比,年老代的回收时间更短,从而减少了暂停时间间隔(Pause time)。通过–XX:+UseParallelOldGC
命令行可选项强制指定。
-
年轻代的回收算法(Minor Collection)
与并行回收器(Parallel Collector)相同 -
年老代的回收算法(Full Collection)
年老代分为三个步骤,标记、统计、合并。这里用到分的思想,把年老代划分为很多个固定大小的区(region)。 标记阶段,把所有存活的对象划分为N组(应该与回收线程数相同),每一个线程独立的负责自己那一组,标记存活对象的位置以及 所在区(Region)的存活率信息,标记为并行的。统计阶段,统计每一个区(Region)的存活率,原则上靠前面的存活率较高,从前到后, 找到值得合并的开始位置(绝大多数对象都存活的区不值得合并),统计阶段是串行的(单线程)。合并阶段,依据统计阶段的信息,多线程 并行的把存活的对象从一个区(Region)复制到另外一个区(Region)。
并发标记清除回收器(Concurrent Mark-Sweep Collector)
又名低延时收集器(Low-latency Collector),通过各种手段使得应用程序被挂起的时间最短。基本与应用程序并发地执行回收操作,没有合并和复制操作。通过命令行-XX:+UseConcMarkSweepGC
指定,在单核或者双核系统里面还可以指定使用增量式回收模式-XX:+UseConcMarkSweepGC
。增量式回收是指把回收操作分为多个片段,执行一个片段之后释放CPU资源给应用程序,未来的某个时点接着上次的结果继续回收下去。目的也是减少延时。
-
年轻代的回收算法(Minor Collection)
与并行回收器(Parallel Collector)相同 -
年老代的回收算法(Full Collection)
分为四个步骤,初始标记(Initial Mark)、并发标记(Concurrent Mark)、再次标记(Remark)、以及并发清理(Concurrent Sweep)。特别注意,没有合并操作,所以会有碎片。 - 初始化阶段: 暂停应用线程,找出所有存活的对象,耗时比较短,回收器使用单线程。
- 并发标记阶段: 回收器标记操作与应用并发运行,回收器使用单线程标记存活对象。
- 再次标记:并发标记阶段由于应用程序也在运行,这个过程中可能新增或者修改对象。所以再次暂停应用线程,找出所有修改的对象,使用多线程标记。
- 并发清理:回收器清理操作与应用并发运行,回收器使用单线程清理死亡对象。
Java垃圾回收器的性能评估工具
-
–XX:+PrintGCDetails
和–XX:+PrintGCTimeStamps
垃圾回收的开始时间,持续时间,每一代的空余内存等信息。 - jmap [options] pid
jamp 2043 查看2043进程里面已经加载的共享对象。通常DLL文件。
jmap -heap 2043 查看内存堆的配置信息以及使用情况。
jmap -permstat 2043 查看永久代的加载情况。
jmap -histo 2043 查看类的加载和内存占用情况。 - jstat [options] pid
jstat -class 2043 class加载、卸载、内存占用情况。
jstat -gc 2043 GC执行情况。
后记
Java提供自动选择和自动性能优化功能。在做垃圾回收器调优之前,先列出所关注的性能指标,通过命令行告诉JVM你所关注的性能指标,由JVM自动调优,如果不满意,可以指定垃圾回收器。OutOfMemory通常是由于堆内存不足,调节-Xmx1024m
和-XX:MaxPermSize=128m
命令行可选项即可。
相关推荐
chrome-headless-shell-win64-135.0.7004.0 (Canary).zip
建筑工地个人防护装备分割系统源码&数据集分享
车牌字符识别系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
实时可调的DDS信号发生器设计:基于FPGA的Verilog编程,灵活控制波形与频率的调制系统,(可实时切波形并控制频率)DDS信号发生器设计。 FPGA设计,verilog设计,DDS信号发生器:基于调制方式灵活可控的信号发生器DDS。 可生成ASK调制波、FSK调制波、正弦波、矩形波、三角波、锯齿波等多种波形。 方案采用三个按键控制,可按键控制不同信号、不同频率输出。 按键1:控制切六种波形(ASK调制波,FSK调制波,正弦波,矩形波,三角波,锯齿波)。 按键2:每按下一次,频率增加1 10。 按键3:每按下一次,频率减小1 10。 频率相位可灵活调整。 ,核心关键词: 1. DDS信号发生器设计 2. FPGA设计 3. Verilog设计 4. 调制方式 5. 波形切换 6. 频率控制 7. 按键控制 8. 频率相位调整 用分号分隔的关键词结果为:DDS信号发生器设计;FPGA设计;Verilog设计;调制方式;波形切换;频率控制;按键控制;频率相位调整;,灵活控制的FPGA设计:基于DDS技术的信号发生器实现方案
一个windows上使用的搜索小工具
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
标题:基于放射虫和硅藻的温度重建揭示南大洋印度洋扇区表面及亚表面温度变化 内容: 一项最新的研究在南大洋印度洋扇区的四个沉积物核心中提出了五项新的温度记录。这项研究使用了名为SORAD的数据集作为训练集,应用Imbrie和Kipp方法对经过对数转换的数据进行分析,重建了基于放射虫的亚表面温度(subST)。此外,通过利用Crosta等人于2020年编制的包含249个样本的数据集,并采用现代类似种技术应用于33个硅藻分类单元的相对丰度,预测了基于硅藻的海表温度(SST)。 特别地,来自DCR-1PC(Crosta等人,2020年)和MD19-3580(本研究)的核心SST记录以及来自MD19-3575CQ和MD19-3580(本研究)的核心subST记录被重采样至每3千年一个间隔,以便从SST中减去subST在这两个核心站点的值(DCR-1PC/MD19-3575CQ和MD19-3580),从而重建表面与亚表面之间温度差(deltaT)的演变过程。本研究包括了这些重采样数据和deltaT记录,为理解该地区过去气候条件提供了重要线索。
人脸表情行为识别系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
Zabbix 适用于各种规模的企业和组织,特别是那些需要监控复杂 IT 基础设施的用户。以下是一些使用 Zabbix 的优势: 开源免费:Zabbix 是开源软件,可以免费使用,且社区活跃,文档丰富。 高度可定制:用户可以根据需求自定义监控项、告警规则和报表。 跨平台支持:支持多种操作系统(Linux、Windows、Unix等)和数据库(MySQL、PostgreSQL、Oracle等)。 强大的社区支持:Zabbix 拥有庞大的用户社区,用户可以轻松找到解决方案和最佳实践。 企业级功能:支持高可用性、分布式监控和自动化运维,适合企业级应用。 该软件包使用rockylinux8、mysql、nginx。 软件使用:解压,createrepo创建本地yum仓库,创建仓库文件,可yum或dnf 下载,详细见:https://blog.csdn.net/m0_74744227/article/details/145389193
豆类苗叶检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
魔众视频管理系统是由国内领先的技术团队开发商进行开发的,是搭建视频系统最佳选择的程序源码,支持多端同步浏览。 魔众视频管理系统,轻量级视频管理系统。 2022年08月19日魔众视频管理系统发布v4.1.0版本,增加了以下27个特性: ·[新功能] 文件上传切片最大2M,分片文件根据配置动态清除 ·[新功能] 图标库中新增cube图标 ·[新功能] UEditorPlus升级到2.3.0 ·[新功能] bodyProperties可为body标签增加属性 ·[新功能] 图标库新增 check-simple ·[新功能] Cookie库新增属性参数 ·[新功能] 后台管理员角色新增备注字段 ·[新功能] Grid编辑操作名称可自定义 ·[新功能] FileUtil新增文件大小精简格式化 ·[新功能] 登录界面全新改版大气美观 ·[新功能] Type类型数据新增导出JS配置文件 ·[新功能] 富文本组件新增 editor-ready 自定义事件 ·[新功能] Response新增停止执行抛出消息的方法 ·[新功能] Grid新增批量弹窗快捷操作方式 ·[新功能] Json组件增加高度可配
永磁同步电机Q15焦点:无传感自适应滑膜算法及SMO_C语言定点代码与仿真模型示例解析,永磁同步电机无传感自适应滑模 滑膜观测器(SMO)_示例C语言定点代码和仿真模型,Q15 foc pmsm 使用“自适应”滑模算法消除一阶滤波器 ,核心关键词:永磁同步电机; 无传感自适应滑模; 滑膜观测器(SMO); C语言定点代码; Q15; foc pmsm; 自适应滑模算法; 一阶滤波器。 关键词用分号分隔为:永磁同步电机; 无传感; 自适应滑模; 滑膜观测器(SMO); C语言定点代码; Q15; foc pmsm; 一阶滤波器。,"自适应滑模算法在永磁同步电机中的应用:Q15定点代码与仿真模型示例"
Python泰勒图实现多模型可视化对比:源码高逼格版展示与使用教程,Python高逼格泰勒图及源码~,多模型对比~可视化工具 ,Python; 泰勒图; 高逼格; 多模型对比; 可视化工具,Python泰勒图高逼格展示:多模型对比可视化工具源码
基于WOA-XGBoost的回归预测:以优化XGBoost树参数的改进算法研究(基于MATLAB代码,包括评价指标),基于鲸鱼算法优化极限梯度提升树的数据回归预测(WOA-XGBoost) 鲸鱼算法WOA优化极限梯度提升树XGBoost树的数量、树的深度和学习率 基于MATLAB环境 替自己的数据即可 代码注释清晰 适合学习 回归预测的评价指标包括平均绝对误差 均方误差 均方根误差 平均绝对百分比误差以及关联系数 ,WOA-XGBoost; 鲸鱼算法优化; 树的数量; 树的深度; 学习率优化; MATLAB环境; 代码注释清晰; 回归预测; 评价指标,基于WOA-XGBoost算法的数据回归预测模型
介绍: 在2025年,随着技术的不断进步和用户需求的多样化,社区平台的设计与功能也在不断演变。StarFree作为一款全新的唯美风格社区源码,凭借其独特的设计理念和强大的功能,迅速成为了开发者与用户关注的焦点。本文将为您详细介绍StarFree源码的特点、功能以及应用场景。 1. 唯美设计,极致视觉体验 StarFree源码以“唯美”为核心设计理念,采用了简约而不失优雅的UI设计。整体界面以柔和的色调为主,搭配流畅的动画效果,为用户带来极致的视觉享受。无论是社区主页、个人中心,还是帖子详情页,每一个细节都经过精心打磨,确保用户在浏览时感受到舒适与愉悦。 2. 模块化架构,灵活扩展 StarFree采用模块化架构设计,开发者可以根据需求自由组合或扩展功能模块。无论是社交互动、内容发布,还是用户管理,每个模块都独立且高效,便于二次开发与定制。这种设计不仅降低了开发难度,还提高了系统的可维护性。 3. 多端适配,无缝体验 StarFree源码支持多端适配,包括Web端、移动端(iOS/Android)以及小程序。无论用户通过哪种设备访问社区,都能获得一致且流畅的体验。源码内置响应式布局
open3d qt6demo示例
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
二维码与条形码检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
内容: 该数据集由Moraitou-Apostolopoulou, M、Zervoudaki, S和Kapiris, K于2013年发布,提供了1994年9月和12月在爱琴海收集的翼足类(一种浮游软体动物)丰度数据。数据集包含了90个数据点,详细记录了这两个时间点翼足类的数量情况。此研究有助于了解气候变化对海洋生态系统中特定物种的影响。访问以下链接获取完整数据集: 请注意,直接点击上述链接将引导您至数据集的官方页面,而非直接下载页面。
1. 用户管理 用户注册与登录:支持志愿者(学生)、管理员(指导老师)等角色的注册与登录。 角色权限管理:根据不同角色分配相应的权限,如志愿者可以查看活动信息、报名,管理员可以管理活动及志愿者信息。 2. 志愿者信息管理 志愿者档案管理:记录志愿者的基本信息,包括姓名、学号、联系方式、专业等。 技能特长登记:志愿者可以添加自己的技能、特长,为活动匹配合适的志愿者。 3. 活动管理 活动信息发布:管理员可以创建、编辑和删除志愿者活动信息,包括活动名称、时间、地点、人数限制等。 活动查询与搜索:志愿者可以查看所有活动,支持按标签、时间等条件搜索活动信息。 4. 报名管理 在线报名:志愿者可在线报名参加活动,系统自动更新参与人员信息。 报名状态查询:志愿者可以查看自己报名的活动及其状态(已报名、待审核、已结束等)。 5. 反馈与评价 活动反馈:参与完活动后,志愿者可以填写反馈表,评价活动内容和组织。 统计分析:管理员可以对反馈进行统计分析,改进后续活动的安排。 6. 通知管理 消息推送:通过系统向志愿者发送活动提醒、重要通知等。 公告板:展示志愿者最新动态、活动报道等信息。 7. 系统管理