介绍
JVM里面的Throughtput收集器是一款关注吞吐量的垃圾收集器。该收集器是唯一一个实现了UseAdaptiveSizePolicy策略的收集器,允许用户通过指定最大暂停时间和垃圾收集时间占总时间的百分比,然后自适应调整JVM的参数来达到配置的目标。
Throughtput收集器
先上一张经典的垃圾收集器的图:
这张图相信很多人都看过,展示了各个垃圾收集器之间的搭配。平时我们说的Throughtput收集器就是图中红线框起来的几个收集器。下面会分别来介绍一些这几个收集器的特点和作用。
ParallelScavenge收集器
ParallelScavenge收集器收集的是新生代,使用的是Scavenge GC(Copying GC的另外一种叫法)。该收集器是并行的,可以同时多个线程一起执行copying阶段,在多处理器的场景下可以尽最大可能的提高minor gc的效率。ParallelScavenge收集器的目的是达到一个可控制的吞吐量,吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集的时间),虚拟机总共运行100分钟,其中垃圾收集器运行了1分钟,那么吞吐量就是99%。
关于ParallelScavenge收集器有个有趣的来历。HotSpot VM的开发者在开发垃圾收集器的时候都是在分代式框架中开发,并且希望第三方的开发者也是在这个框架中开发自定义的收集器,这样可以和其他收集器很好的配合在一起使用。后来有个开发者不想使用这个框架,于是靠一己之力实现了没有用框架的并行GC,并且这个并行GC的性能还是相当不错的,于是这个并行的GC就被放到了HotSpot VM里,这就是我们看到的ParallelScavenge收集器。这也是为什么这个收集器没法跟CMS配合使用,因为他们根本就不在一个框架内。
在使用ParallelScavenge收集器的时候,需要关于关注以下两个配置参数:
1、MaxGCPauseMills,这个参数控制允许GC最长的暂停时间,参数允许的值是一个大于0的毫秒数。设置该参数之后,VM会通过控制新生代的大小来达到暂停时间长短的控制的。不要认为把这个参数设置的越小越好,参数越小意味着新生代的空间越小,导致新生代执行垃圾收集的次数增加。举个例子,原来10秒钟执行一次minor gc,每次暂停100毫秒,现在把允许的暂停时间调低成80毫秒,可能导致每5秒钟就会执行一次minor gc,停顿时间降低了,但是吞吐量也下降了。
2、GCTimeRatio,垃圾收集时间占总时间的比率。该参数的值应该是一个大于0小于100的整数。如果把此参数设置为19,那允许的最大GC时间就占总时间的5% (即1 /(1 + 19)),默认值为99,就是允许最大1% (即1 /(1+99))的垃圾收集时间。
通过调整这两个参数就可以实现对吞吐量和暂停时间的控制,用户不用去关心新生代该设置多少,老年代该设置多少,只需要设置好这两个值,剩下的就交给虚拟机吧,它会帮你调整好对应的大小。新生代可以通过这种方式实现,那么老年代是否也有类似的方式来实现呢,答案是有的,就是图中的Parralled Old。
Parralled Old收集器
Parralled Old收集器是ParallelScavenge的老年代版本。使用的算法是Mark-Compact。Parralled Old收集器是在JDK1.6之后才出现的,在此之前如果新生代选择使用ParallelScavenge,那么老年代只能选择使用Serial Old,也就是说只能使用单线程收集,为了弥补这个不足,于是开发了Parallel Old收集器。有了Parallel Old收集器之后,Throughtput收集器才真正显示出它的强大之处,在吞吐量和CPU敏感的情况下,都可以考虑使用Parallel Scavenge+Parallel Old的组合。
Paralled Old收集器的运行示意图如下:
Serial Old收集器
Serial Old收集器是一款传统的单线程垃圾收集器,使用Mark-Sweep-Compact算法。这个收集器主要是在Client模式下使用。该收集器的用途有两个:一个是在JDK1.5之前与ParallelScavenge收集器配合使用;第二个用途是作为CMS收集器的后备预案,在CMS发生并发模式失效的时候使用Serial Old收集器进行一次完整的STW的垃圾回收。
Serial Old收集器的运行示意图如下:
收集器配置
在JDK1.8下,使用Throughtput收集器有两种配置:
1、-XX:+UseParallelGC或者-XX:+UseParallelOldGC,这两个配置下任选一个使用的收集器都是ParallelScavenge+Parralled Old。这与网上大多数说介绍是不一样的,网上大多数介绍是说UseParallelGC配置下使用的是ParallelScavenge+Serial Old,JDK1.8下已经进行了统一,Serial Old已经不再是默认的选择。
2、如果想使用Serial Old作为老年代的垃圾收集器可以这样配置:-XX:+UseParallelGC -XX:-UseParallelOldGC。
GC日志说明
-XX:+UseParallelGC或者-XX:+UseParallelOldGC参数下的日志:
2018-04-29T14:55:42.360-0800: [Full GC (System.gc()) [PSYoungGen: 1421K->0K(76288K)] [ParOldGen: 8K->1257K(175104K)] 1429K->1257K(251392K), [Metaspace: 3205K->3205K(1056768K)], 0.0054702 secs] [Times: user=0.02 sys=0.01, real=0.00 secs] |
-XX:+UseParallelGC -XX:-UseParallelOldGC参数下的日志:
2018-04-29T15:05:43.409-0800: [Full GC (System.gc()) [PSYoungGen: 1449K->0K(76288K)] [PSOldGen: 8K->1265K(175104K)] 1457K->1265K(251392K), [Metaspace: 3206K->3206K(1056768K)], 0.0034926 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] |
我使用了System.gc()分别在两种配置下触发GC,通过对比可以发现只有在老年代的收集下是不一样的,第一个用的是ParOldGen,对应的是Parralled Old收集器;第二个用的是PSOldGen,对应的是Serial Old收集器。新生代收集日志PSYoungGen对应的就是Parallel Scavenge收集器。
收集器调优
在使用Throughtput收集器的时候强烈不建议手动指定新生代大小和老年代大小,因为这将废弃虚拟机的自适应调整策略。也就意味着你配置的MaxGCPauseMills和GCTimeRatio参数很难真正起作用。用户只需要指定最大最小堆内存,以及MaxGCPauseMills和GCTimeRatio参数即可,剩下的交给VM去处理吧,它会帮你调整到最佳状态,这也是非常人性化的。VM具体的调整包含调整新生代和老年代的大小,以及调整新生代晋升到老年代的年龄等。
以上设置的参数,MaxGCPauseMills优先级最高,如果设置了这个值,新生代和老年代会随之进行调整,直到满足对应的停顿时间的目标。一旦这个目标达成,堆的总容量开始增大,直到运行时间达到比率GCTimeRatio设定值。这两个目标达成后,JVM尝试缩小堆大小,尽可能以最小堆来满足这两个目标。
其他的一些东西
ParNew与Parallel Scavenge对比
ParNew也是一个新生代的并行GC,ParNew的存在主要是为了配合CMS使用,如果没有ParNew,CMS只能搭配单线程垃圾回收。ParNew与Parallel Scavenge对比有以下几种不同:
1、ParNew使用的是广度优先来遍历对象图,Parallel Scavenge使用的是深度优先来遍历对象图
2、ParNew没有实现UseAdaptiveSizePolicy策略,而Parallel Scavenge实现了这个策略
3、ParNew可以和CMS搭配使用,而Parallel Scavenge不能与CMS搭配使用
并行GC线程数
通过-XX:ParallelGCThreads=X来设置并行GC的线程数量,默认情况下跟处理器个数一致。
总结
1、Throughtput收集器有两种参数,Minor GC和Full GC
2、通过Throughtput收集器的动态调整策略是垃圾回收调优的很好切入点,能有效的减少JVM内存使用
3、当需要追求吞吐量的时候,Throughtput总是一个不错的选择
----------------------------------------------------------------
欢迎关注我的微信公众号:yunxi-talk,分享Java干货,进阶Java程序员必备。
相关推荐
`throughtput.awk`:吞吐量是指网络在单位时间内传输数据的能力,是衡量网络性能的关键指标。这个脚本可以帮助用户分析仿真中的网络带宽利用率和数据传输速度,从而评估网络的效率和容量。 在NS2仿真中,通过这些...
- throughtput.awk:计算网络的平均吞吐量。 - wire_wireless.tcl:配置有线无线混合网络的TCL脚本。 - wireless.tcl:专门用于无线网络模拟的TCL脚本。 - mflood.cc/mflood.h:这是实现多播路由的源代码,展示如何...
对旋轴流风机毕业设计说明书.doc
内容概要:本文档为2024~2025学年第二学期的人工智能导论课程中的支持向量机(SVM)算法分析实验预习报告。报告的主要目的是深入理解SVM的基本原理、核函数的作用以及参数调节对模型的影响,同时掌握特征选取的方法和重要性,为后续处理更复杂的数据集积累经验。实验任务包括对鸢尾花数据集进行特征探索,通过绘制相关性矩阵、径向可视化或各特征之间的关系矩阵图,深入了解数据集特征,并利用SVM算法实现对该数据集的准确分类。实验设备和环境要求操作系统为Windows、Linux或macOS均可,编程语言为Python,并搭配NumPy、Pandas、Scikit-learn和Matplotlib等科学计算和数据处理库。; 适合人群:具有一定的数学基础和编程经验,正在学习或从事机器学习和数据挖掘领域工作的学生或研究人员。; 使用场景及目标:①适用于需要理解SVM算法原理及其应用的学习者;②帮助研究者掌握如何使用SVM进行分类任务,特别是针对线性不可分的数据集;③为后续更复杂的机器学习项目提供理论和技术支持。; 其他说明:实验将在图书馆附楼计算中心进行,时间为2025年4月15日,由教师王艳指导并批阅。实验预习过程应详细记录设计思想、设计步骤等初步方案,可以通过程序流程图、伪代码、预定相关测试数据和预期结果等方式来表示。
步进式推刚机设计说明书.doc
内容概要:本文详细介绍了如何使用遗传算法优化BP神经网络,以提高交通流量预测的准确性。文中首先解释了BP神经网络的基本结构及其局限性,即容易陷入局部最优解的问题。随后,作者展示了遗传算法的工作原理,并将其应用于优化BP神经网络的权重和偏置。通过定义适应度函数、选择、交叉和变异等步骤,实现了对BP神经网络的有效改进。实验结果显示,优化后的BP神经网络在交通流量预测中的精度显著高于传统的BP神经网络,特别是在处理复杂的非线性问题时表现出色。 适用人群:对机器学习、深度学习以及交通流量预测感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要进行精确交通流量预测的应用场景,如智能交通系统、城市规划等领域。主要目标是通过遗传算法优化BP神经网络,解决其易陷入局部最优的问题,从而提高预测精度和稳定性。 其他说明:文中提供了详细的Python代码实现,帮助读者更好地理解和实践这一优化方法。同时,强调了遗传算法在全局搜索方面的优势,以及其与BP神经网络结合所带来的性能提升。此外,还讨论了一些具体的实施技巧,如适应度函数的设计、交叉和变异操作的选择等。 标签1,标签2,标签3,标签4,标签5
内容概要:本文详细介绍了基于组态王6.53和西门子S7-200PLC构建的电镀生产线仿真系统的开发过程。主要内容涵盖IO配置表、PLC梯形图编程、组态王动画脚本编写以及故障模拟等功能。文中展示了如何通过PLC控制行车移动、槽位状态监测、溶液参数调节等关键操作,并通过定时器、互锁机制、PID调节等技术手段实现精确控制。此外,还提供了详细的调试经验和优化方法,如调整定时器参数、优化动画效果等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于需要进行电镀生产线自动化调试和仿真的场合。主要目标是帮助工程师理解和掌握电镀生产线的自动化控制逻辑,提高调试效率,减少实际生产中的错误。 其他说明:文章不仅提供了理论知识,还包括大量实际操作经验和调试技巧,有助于读者更好地应用于实际工作中。附带的运行效果视频进一步增强了理解和应用效果。
内容概要:本文详细介绍了利用模糊神经网络在风光互补发电系统中进行负荷功率智能分配的方法及其在Simulink/Matlab环境下的仿真实现。文中首先阐述了光伏和风机的MPPT算法,分别采用了扰动观察法和叶尖速比控制来优化能量捕获。接着重点讨论了模糊控制器的设计,通过定义输入变量(电网频率偏差、直流母线电压、SOC储能状态)和输出变量(各级负荷的功率分配系数),以及隶属度函数和规则库的构建,实现了对不同等级负荷的智能分配。此外,文章还探讨了VSC逆变器的控制策略,特别是在锁相环参数设置和LC滤波器方面的优化措施。最后,通过一系列仿真实验验证了系统的有效性和稳定性。 适合人群:从事电力电子、智能控制系统研究的技术人员,尤其是对风光互补发电系统感兴趣的科研工作者和工程技术人员。 使用场景及目标:适用于希望深入了解风光互补发电系统中负荷功率分配策略的研究人员和技术人员。目标是掌握模糊神经网络在电力系统中的应用,提高风光互补发电系统的可靠性和效率。 其他说明:文章提供了详细的代码片段和仿真技巧,帮助读者更好地理解和复现实验结果。同时,强调了调参过程中的一些常见问题和解决方案,有助于减少实际项目中的调试时间和成本。
人工智能原理及应用 王万森 课后习题答案解析
毕业设计(论文) 直动式液压往复泵设计说明书.doc.doc
内容概要:本文详细介绍了基于S7-200 PLC和MCGS组态软件构建的四路抢答器控制系统。首先阐述了系统的硬件架构,包括四个抢答按钮、复位按钮、指示灯和蜂鸣器的连接方式及其对应的PLC输入输出点配置。接着深入解析了梯形图程序的关键逻辑,如抢答互锁机制、时间戳判断防止多选手同时抢答以及主持人控制的抢答允许标志。此外,还探讨了MCGS组态画面的设计,包括动态效果展示、触摸屏变量绑定和抢答超时处理。最后,分享了一些调试经验和优化技巧,如反向电动势防护、接线注意事项和系统性能测试。 适用人群:对PLC编程和工控系统感兴趣的工程师和技术爱好者,尤其是有一定PLC基础的学习者。 使用场景及目标:适用于竞赛类节目或培训场所,用于搭建高效可靠的抢答系统,提升互动性和趣味性。主要目标是帮助读者掌握PLC编程技巧和MCGS组态设计方法,能够独立完成类似项目的开发。 其他说明:文中提供了详细的梯形图代码片段和接线图示例,便于读者理解和实践。同时强调了硬件防抖和软件互锁的重要性,确保系统的稳定性和可靠性。
内容概要:本文档详细介绍了Python爬虫的学习资源,涵盖基础知识、实例教程、反爬机制及应对策略、学习资源推荐和法律道德注意事项。基础知识部分讲解了核心库与框架(Requests库、BeautifulSoup、Scrapy框架)及其使用方法,数据提取技术(正则表达式、XPath、JSON处理)。实例教程按初级、中级、高级分类,包括静态网页抓取、动态内容抓取、分布式爬虫等项目。反爬机制与应对策略中列举了常见的反爬技术(User-Agent检测、IP频率限制等)及相应的解决办法(请求头伪装、IP代理池等)。最后强调了学习过程中应遵守的相关法律法规。; 适合人群:对Python爬虫技术感兴趣的初学者或有一定经验的研发人员。; 使用场景及目标:①掌握Python爬虫的基本概念和技术工具;②通过实例项目提高实际操作能力;③了解并应对反爬机制;④确保爬虫活动符合法律和道德规范。; 阅读建议:建议读者按照由浅入深的原则进行学习,在实践中不断巩固所学知识,同时注意遵守相关法律法规。
蛋白酶的工厂设计说明书.doc
内容概要:本文详细解析了松下FP-XH六轴伺服控制系统在汽车零部件生产线上的多工位转盘控制程序。该程序分为五个主要模块:主程序循环控制、手动模式处理、自动流程控制、报警处理模块以及输出刷新模块。每个模块的功能明确,如主程序负责调用各个子程序,报警处理模块将故障类型分颜色显示,便于快速定位问题。此外,文中介绍了点动控制中的防呆设计、绝对定位中的环形地址计算法、状态机设计用于管理六个轴的状态,以及异常处理逻辑如断电后的数据恢复机制。这些设计不仅提高了系统的稳定性和安全性,还在实际应用中表现出色,经过三年的实际运行验证。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对PLC编程和多轴伺服系统感兴趣的读者。 使用场景及目标:适用于需要深入了解PLC编程技巧、多轴伺服控制逻辑、异常处理机制以及提高系统稳定性的场合。目标是帮助读者掌握松下FP-XH PLC在复杂工业环境中的应用方法,提升实际项目的开发效率。 其他说明:本文不仅提供了详细的代码解析,还包括了许多实用的编程技巧和注意事项,如注释的规范书写、变量命名规则等,有助于读者更好地理解和应用这些技术。
内容概要:本文详细介绍了利用三菱FX3U系列PLC和组态王6.55软件实现煤矿通风机根据瓦斯浓度自动调整转速的控制系统。主要内容涵盖硬件配置、梯形图编程逻辑、组态王画面设计、调试技巧等方面。系统通过瓦斯传感器实时监测瓦斯浓度,采用双比较器进行区间判断,确保风机在不同浓度下自动调整转速,并设有多种保护机制如急停按钮、报警指示灯等。此外,还讨论了传感器零点漂移补偿、数据滤波处理、PLC与组态王通信设置等关键技术点。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和SCADA系统有一定了解的人群。 使用场景及目标:适用于煤矿井下通风系统的自动化改造,旨在提高通风效率,降低瓦斯爆炸风险,保障井下作业人员的安全。具体目标包括实现瓦斯浓度超标时快速响应、减少人工干预、提升系统稳定性。 其他说明:文中提到的实际案例表明,该系统能够显著缩短应急响应时间,减少瓦斯超限持续时间,提高生产安全性。同时提供了详细的编程技巧和调试经验,有助于读者更好地理解和应用相关技术。
内容概要:本文探讨了在“双碳”目标背景下,利用多目标粒子群优化(MOPSO)算法解决风光储荷微电网系统的多目标经济运行优化问题。文章详细介绍了MOPSO算法的特点及其在处理发电不确定性和负荷波动方面的优势,展示了该算法的具体实现方式,包括粒子类和仓库类的设计,以及目标函数的构建。此外,文中还讨论了通过分时电价机制引导需求侧响应的应用实例,验证了MOPSO算法的有效性,实现了光伏消纳比例提升15%,风电消纳比例提升20%,系统运行成本降低12%。 适合人群:从事电力系统优化、新能源技术研究的专业人士,尤其是关注微电网调度和多目标优化算法的研究人员。 使用场景及目标:适用于希望提高微电网经济效益和能源利用率的项目,旨在通过智能化调度减少弃风弃光现象,降低系统运行成本,增强微电网的稳定性。 其他说明:文章强调了算法的实际应用价值,并展望了未来结合深度强化学习进一步提升优化性能的可能性。
计算机二级office2016版教材
5+1档轿车手动变速箱设计说明书.doc