什么是垃圾回收
- java程序运行期间生成新对象,加载类文件都需要占用内存,不同对象从被创建,使用,存储到最后使用完毕被销毁都有一个完整的生命周期,java程序开发人员实际上只需要负责对象的创建使用,对象的销毁回收由虚拟机自动完成,对象的回收过程就是垃圾回收
怎么来做垃圾回收
- jvm运行期间使用的内存包括堆内存,创建线程使用的vm栈内存,存储方法,类,常量池使用的永久代内存,堆外内存(direct buffer),开发人员使用的是heap(堆内存),也是重点需要管理的区域
- 由于不同对想的生命周期长短不同,因此需要将整块堆内存分成不同的区域,E,S1,S2,O,Eden区存放生命周期最短的对象,S区中等长度,Old区存长生命周期对象,因此对不同的区域启用不同的回收算法。
- 对象在堆的各个区域移动过程如下:E区满了进行一轮回收,剩下的晋升到空的S区,同时将非空的S区进行回收,剩下的也全部拷贝到空S区,将达到存活时间的对象晋升进入O区。
- 为什么会有两个S区,主要是为了处理回收碎片,E区满了回收之后所有对象拷贝进入S区,S区也会被回收,因此S区面临三种选择:1)整理并压缩碎片,空出整块的内存区域,2)将E区晋升上来的对象适配到S区中的碎片空间中;3)设置两块S区,将E区和非空S区的存活对象全部合并拷贝进入空S区;最终SUN选择第三种方法,从直觉上考虑直接合并拷贝应该是效率最高的,相当于用空间换时间
垃圾回收参数
其中 -Xmx 控制了 E S1 S2 O 这四个区的总大小,-XX:PermSize 和 -XX:MaxPermSize控制了PermGen的大小,两块的大小独立设置,因此总的堆内存大小 E+S1+S2+O+P= -Xmx + -XX:MaxPermSize
-Xms 初始堆大小,MinHeapFreeRatio参数可以调整空闲堆内存小于40%时候JVM会扩充堆内存到最大设置值
-Xmx 最大堆大小,MaxHeapFreeRatio参数可以控制空闲堆内存大于70%时候JVM减少堆知道最小值
-Xmn 新生代大小(E + S1 +S2),SUN推荐的大小是整个堆大小的3/8,增大这个值会减小O区的大小
-XX:PermSize 初始永久带大小
-XX:MaxPermSize 最大永久带大小,这个值设置推荐是系统P区基本稳定下来的量的1.5倍左右
-XX:SurviorRatio E区和S区的比例,默认是8,
-Xss: 每个线程的堆栈大小,jdk1.5之前是256,之后是1M。在物理内存不变的情况下减小这个值能生成更多的线程。一个进程内的线程最大数经验值推荐在3000-5000左右,调用栈不深的应用128K差不多够用了,大一点的差不多256K,具体的值还需要严格的测试。
常见的垃圾回收器
Serial回收器:jvm历史最悠久的回收器,jdk在client模式下默认的回收器,特点是启动回收的时候需要停止一切用户线程,对于小内存的应用回收效率高,不适合对响应时间要求高,大内存的应用;
Parallel回收器:并行回收相当于Serial串行回收器的多线程版,回收的时候还是需要stop the word,只是启用多线程回收让停顿时间缩短,满足对用户响应时间比较看重的应用,比如WEB应用。
CMS回收:也叫并发回收,针对Old区的回收分成6个阶段:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
并发预清理(CMS-concurrent-preclean)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
并发重置(CMS-concurrent-reset)
初始标记和重新标记需要S-T-W,其他步骤都是和用户线程一起运行,初始标记只是把从GC Root能直接关联到的对象快速标记出来,重新标记标记是对在初始标记之后新产生的可回收对象补充做一轮标记,并发标记是GC Root Tracing,花的时间比较长。
CMS的young区默认使用ParNew的并发回收算法,也不会S-T-W,CMS优点众多,把JVM停顿的时间竟可能缩短,也有几个缺点:1)在回收的过程中用户线程继续运行的方式可能会发生回收还没做完但是没足够空间满足应用对内存的申请或者没有足够空间放下新晋升到Old区的对象,导致 发生 conncurrent mode failed,触发一次串行的FGC,大内存的FGC停顿时间会相当长,比较要命,因此要妥善设置CMS触发阀值,和Old区的大小,提前预留足够的Old区空间;2)同用户线程一块运行会额外占用一些CPU资源;3)产生内存碎片,启用碎片压缩的情况下在FGC事后会进行碎片整理
DirectBuffer的垃圾回收
- 堆外内存的好处是减少数据拷贝次数,减少对heap堆垃圾回收的影响
- java中的类DirectBuffer只是个堆外内存的引用,存储了实际内存引用地址和大小,封装了申请和回收的操作,内存的申请和回收实际上是调用native方法类似 malloc和calloc的方法;
- DirectBuffer本身的对象大小很小,但是关联的堆外内存可能非常大,因此使用它的风险在于如果没好好回收DirectBuffer,明明堆内还很空,但是整个系统内存可能已经被耗尽了,因此JVM使用XX:MaxDirectMemorySize来约束申请的堆外内存量,防止由于使用不当,一个java进程搞挂整台机器
- DirectBuffer的回收机制也很特殊,因为DirectBuffer这个java对象和关联的堆外内存实际上是处于两块不同区域,它通过关联一个PhantomReference,当DirectBuffer对象没有外部强引用之后其本身会被塞进一个ReferenceQueue,这个特殊实现的Queue里头有个后台线程一直扫描队列,把队列中的对象所关联的堆外内存释放掉,这种机制的好处是JVM对于内存的管理统一了,堆外这种异类就用异步的方式来特殊实现来回收释放;
- 堆外内存在申请的时候如果不够就会调用System.gc触发FGC,并且为了及时回收堆外内存也会经常手工调用System.gc,因此设置这个参数也很重要-XX:+ExplicitGCInvokesConcurrent,把System.gc转换成一次CMS的执行,提高效率
垃圾回收日志格式
基本上都是这种格式:回收前区域占用的大小->回收后区域占用的大小(区域设置的大小),占用的时间,
具体的网上找下文档
垃圾回收调优处理过程--观察
- 收集当前java进程的内存相关启动参数,观察系统日志有没有OOM异常,观察GC日志,关注FGC以及concurrent mode failed 或者 promotion failed异常,以及GC监测工具观察系统内存使用状况;
- minor gc执行频率,如果执行非常频繁就要关注内存大小是否够用,程序代码写的质量是否不高;
- FGC执行频率,每次FGC回收效果如何,这个现象要考察内存大小是否够用,如果每次FGC效果差需要重点怀疑内存泄露;
- minor gc 和 survior回收效果如何,每次会有多少对象晋升到老年代,如果回收效果差,要考察系统使用内存情况(heap dump)或者Young区大小是否够用,系统是频繁产生大对象;
- CMS频率是否执行过高,对于这一条可以检查下触发CMS的所有条件,包括:1)old区占用量是否导到达触发CMS阀值;2)是否开启了JVM根据成本计算自主决定CMS是否启用;3)永久带回收是否打开,并且永久带占用是否达到回收阀值;4)是否设置了ExplicitGCInvokesConcurrent,由外部system.gc触发
垃圾回收调优处理过程--设定调优目标
根据第一步观察到的状况来设定调优目标:
- OOM--调大内存占用,MAT分析内存详情,排除内存泄露
- 降低minor gc 频率活minor gc执行时间
- 降低 fgc 频率或 fgc 执行时间
调整的效果可以通过 jstat 的 gcutil来观察调优目标是否达到
垃圾回收调优处理过程--常用策略的选择
- 降低FGC频率的办法:1)加大内存以及Old区;2)观察每次survior回收后是否大量晋升到Old,可以尝试调大S区,或者调大S区存活次数;3)调优程序,控制缓存等长生命周期对象的使用量
- 降低minor gc频率的办法:1)加大Eden区;2)用CMS并发回收器;3)增加并行收集的线程数;4)升级CPU;
- 降低minor gc回收时间或old 回收时间:1)减小区域占用内存大小;2)对于CMS,调小CMS触发阀值;3)换更多更牛逼的CPU;4)优化代码
JDK 7,JDK8中的新特性:G1垃圾回收器
G1 GC是jdk 7 对JVM GC算法做了一次重大升级,当初计划用来替换CMS。JDK 8中进一步对G1做了优化,去掉了永久带。G1的目标是减少因为GC带了的系统停顿。
G1将Java堆内存空间划分成一块块等大的区域(region),每个区域都是一段连续的内存空间,E,S,O区将不再固定,而是可以利用任意的空白区块。小区快带来的好处是后台回收线程在扫描可回收对象时候可以优先清理那些包含更多可回收对象的区块,用相同的停顿时间回收更多的垃圾,总体提高回收效率,缩短总体停顿时间。和CMS比有下面一些优势:
- G1通过将内存空间分成区域(Region)的方式避免内存碎片问题
- Eden, Survivor, Old区不再固定、在内存使用效率上来说更灵活
- 可以预设停顿时间控制GC停顿对系统响应的影响程度
- G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STW(stop the world)的时候做
- G1会在Young GC中使用、而CMS只能在O区使用
相关推荐
在日常的开发和使用中,我们经常需要借助各种小工具来提高工作效率,例如快速启动常用的应用程序、管理文件等。一个简单但功能强大的集成工具箱可以帮助用户快速访问、启动并管理程序。今天,我们将以Python为基础,结合Tkinter和Win32API,开发一个类似Windows快捷方式的工具箱应用,能够让你轻松集成各种常用程序并一键启动
django自建博客app
《基于YOLOv8的智慧校园实验室高压灭菌锅安全联锁系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
用于hifi测序数据的基因组组装程序
Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine-X64解压后的文件AceRedist
从大模型、智能体到复杂AI应用系统的构建——以产业大脑为例
自然语言处理之TF-IDF算法与TextRank算法的缠绵_textrank,tf-idf和两者的组合-CSDN博客.html
内容概要:2023版《科学智能 (AI4S)全球发展观察与展望》阐述了AI for Science(AI4S)在全球范围内的最新进展及其对科学和工业的深远影响。文章首先回顾了AI4S在过去一年中的快速发展,特别是在药物研发、材料科学、地质学、污染治理等多个领域的应用实例。AI4S通过结合深度学习、机器学习和其他AI技术,加速了从基础研究到实际应用的转化过程。例如,在药物研发中,AI4S帮助科学家克服了“反摩尔定律”的挑战,提高了新药研发的成功率;在材料科学中,AI4S实现了复杂材料的高效模拟,如人造钻石、石墨烯、碳纳米管等;在地质学中,AI4S通过模拟地球内部结构和物理过程,为地震学研究提供了新视角。此外,文章还探讨了大语言模型(LLMs)与科学方法的结合,指出LLMs不仅能辅助科学研究,还能生成新的科学假设并进行逻辑推理。 适合人群:具备一定科研背景或对AI技术感兴趣的科研人员、工程师、政策制定者及高校师生。
这个数据集包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,是个人健康与健身追踪的一部分。 该数据集非常适合用于以下实践: 数据清洗:现实世界中的数据往往包含缺失值、异常值或不一致之处。例如,某些天的步数可能缺失,或者存在不切实际的数值(如10,000小时的睡眠或负数的卡路里消耗)。通过处理这些问题,可以学习如何清理和准备数据进行分析。 探索性分析(发现日常习惯中的模式):可以通过分析找出日常生活中的模式和趋势,比如一周中哪一天人们通常走得最多,或是睡眠时间与活跃程度之间的关系等。 构建可视化图表(步数趋势、睡眠与活动对比图):将数据转换成易于理解的图形形式,有助于更直观地看出数据的趋势和关联。例如,绘制步数随时间变化的趋势图,或是比较睡眠时间和活动量之间的关系图。 数据叙事(将个人风格的追踪转化为可操作的见解):通过讲述故事的方式,把从数据中得到的洞察变成具体的行动建议。例如,根据某人特定时间段内的活动水平和睡眠质量,提供改善健康状况的具体建议。
框架结构天城商业办公楼5200平米(建筑图 结构图 计算书 开题报告 任务书 文献翻.zip
柴油机连杆加工工艺及夹具设计.zip
读书网首页的HTML信息
文字渐变颜色代码生成器:让文字绽放多彩魅力,演示:在信息交流日益丰富的今天,个性化的文字展示成为吸引目光的关键。这款文字渐变颜色代码生成器,便是为满足这一需求而生的绿色软件,无需安装,便捷实用。 它的操作极为简便。用户只需在软件界面中输入想要转换的文字内容,接着从丰富的色彩选项里挑选心仪的起始颜色与结束颜色,随后轻轻按下 “转换按钮”,神奇的事情就此发生 —— 适用于论坛、网页、QQ 空间等多种平台,以及自定义格式的渐变颜色代码便会即刻生成。不仅如此,生成的代码还能自动复制到剪切板,极大地节省了用户手动复制的时间。当你在论坛回帖、更新网页内容或是装扮 QQ 空间时,只需轻松粘贴代码,原本单调的文字瞬间就能拥有绚丽的渐变色彩,瞬间脱颖而出,为你的表达增添独特魅力,让文字不再平凡,轻松成为视觉焦点。 一款可以轻松把一段文字生成渐变颜色代码的绿色软件,当你在软件中输入完要转换的文字后,只需要挑选自己喜欢的起始颜色、结束颜色后,按一下―转换按钮即可生成相应的论坛/网页/QQ空间以及自定义格式代码,并且代码可以自动复制到剪切板中,回帖时直接粘贴代码即可不错得文字代码生成器,让你得文字更加漂亮.
1.【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、B0006测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:Transformer在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了Transformer在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
Android项目原生java语言课程设计,包含LW+ppt
配套文章:https://blog.csdn.net/gust2013/article/details/146909670?spm=1001.2014.3001.5502
《基于YOLOv8的智慧社区儿童游乐设施安全监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计