添加URL
分享

表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC ,注意它 不表示只GC新生代 ,并且 现有的不管是新生代还是老年代都会STW

Allocation Failure

表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

ParNew

表明 本次GC发生在年轻代并且使用的是ParNew垃圾收集器 。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作( 默认使用的线程数和CPU数相同 ,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用 复制算法 回收内存,期间会停止其他工作线程,即Stop The World。

367523K->1293K(410432K) :单位是KB

三个参数分别为:GC前 该内存区域(这里是年轻代) 使用容量,GC后该内存区域使用容量,该内存区域总容量。

0.0023988 secs

该内存区域GC耗时,单位是秒

522739K->156516K(1322496K)

三个参数分别为: 堆区 垃圾回收前的大小,堆区垃圾回收后的大小,堆区总大小。

0.0025301 secs

该内存区域GC耗时,单位是秒

[Times: user=0.04 sys=0.00, real=0.01 secs]

分别表示用户态耗时,内核态耗时和总耗时

分析下可以得出结论:

该次GC新生代减少了367523-1293=366239K

Heap区总共减少了522739-156516=366223K

366239 – 366223 =16K,说明该次共有16K内存从年轻代移到了老年代,可以看出来数量并不多,说明都是生命周期短的对象,只是这种对象有很多。

我们需要的是 尽量避免Full GC的发生,让对象尽可能的在年轻代就回收掉 ,所以这里可以 稍微增加一点年轻代 的大小,让那17K的数据也保存在年轻代中。

GC 时, 什么方法判断哪些对象 需要 回收:

  1. 引用计数法(已经不用了)
  2. 可达性分析法

前一种简而言之就是给对象添加一个引用计数器,有其他地方引用时这个计数器+1,引用失效时-1,为0时就可以删除掉了。但是它不能解决循环引用的问题,所以一般使用的都是后一种算法。

可达性分析法的基本思路就是通过 一系列 名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那就可以回收掉了。

GC Roots一般都是些 堆外 指向堆内 的引用,例如:

  1. JVM栈中引用的对象
  2. 方法区中静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中引用的对象
  5. 因为新生代对象生命周期一般很短,现在一般将该内存区域划分为三块部分,一块大的叫Eden,两块小的叫Survivor。他们之间的比例一般为8:1:1。

    使用的时候只使用Eden + 一块Survivor。用 E den 区用满 时会进行一次minor gc,将存活下面的对象 复制到另外一块Survivor上 。如果另一块 Survivor放不下(对应 虚拟机参数为 XX:TargetSurvivorRatio 默认 50, 50 % ) ,对象直接进入老年代

    (使用CMS时,默认的新生代收集器是ParNew)(有时新生代GC时,需要找到老年代中引用的新生代对象,这个时候会用到一种叫“卡表”的技术,避免老年代的全表扫描,具体怎么操作的暂时还不知道……)

    Survivor 区的意义:

    如果没有survivor,Eden每进行一次minor gc,存活的对象就会进入老年代,老年代很快被填满就会进入major gc。由于 老年代空间一般很大,所以进行一次gc耗时要长的多 !尤其是频繁进行full GC,对程序的响应和连接都会有影响!

    Survivor存在就是减少被送到老年代的对象,进而减少Full gc的发生。默认设置是经历了16次minor gc还在新生代中存活的对象才会被送到老年代。

    为什么要有两个Survivor:

    主要是为了解决 内存碎片化和效率 问题。如果只有一个Survivor时,每触发一次minor gc都会有数据从Eden放到Survivor,一直这样循环下去。注意的是,Survivor区也会进行垃圾回收,这样就会出现内存碎片化问题。如下图所示:

    碎片化会导致堆中可能没有足够大的 连续空间 存放一个大对象,影响程序性能。如果有两块Survivor就能将剩余对象集中到其中一块Survivor上,避免碎片问题。如下图所示:

    Minor GC:

    对于复制算法来说 ,当年轻代Eden区域满的时候会触发一次Minor GC,将Eden和From Survivor的对象复制到另外一块To Survivor上。

    注意:如果某个对象存活的时间超过一定Minor gc次数会直接进入老年代,不在分配到To Survivor上(默认15次,对应虚拟机参数 -XX:+MaxTenuringThreshold)。

    Full GC:

    用于清理整个堆空间。它的触发条件主要有以下几种:

    1. 显式调用System.gc方法( 建议 JVM触发)。
    2. 方法区空间不足(JDK8及之后不会有这种情况了,详见下文)
    3. 老年代空间不足,引起Full GC。这种情况比较复杂,有以下几种:

    3.1 大对象直接进入老年代引起,由-XX:PretenureSizeThreshold参数定义

    3.2 Minor GC时,经历过多次Minor GC仍存在的对象进入老年代。上面提过,由-XX:MaxTenuringThreashold参数定义

    3.3 Minor GC时,动态对象年龄判定机制会将对象提前转移老年代。年龄从小到大进行累加,当加入某个年龄段后,累加和超过survivor区域 * -XX:TargetSurvivorRatio的时候, 从这个年龄段往上 的年龄的对象进入老年代

    3.4 Minor GC时,Eden和From Space区向To Space区复制时,大于To Space区可用内存,会直接把对象转移到老年代

    JVM 的空间分配担保机制可能会触发Full GC:

    在进行Minor GC之前,JVM的空间担保分配机制 可能 会触发3.2、3.3和3.4发生,即触发一次Full GC。

    空间担保分配是指在发生Minor GC之前,虚拟机会检查老年代 最大可用的连续空间 是否大于新生代所有对象的总空间。

    如果大于,则此次Minor GC是安全的。

    如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的, 失败后会重新发起 一次Full gc;如果小于或者HandlePromotionFailure=false,则改为 直接进行 一次Full GC。

    所有才会说一次Full GC 很有可能 是由一次Minor GC触发的。

    PS:JDK8中HotSpot为什么要取消永久代

    JDK8取消了永久代,新增了一个叫元空间(Metaspace)的区域,对应的还是JVM规范中的方法区(主要存放一些class和元数据的信息)。区别在于 元空间使用的并不是JVM中的内存,而是使用本地内存

    而这么做的原因大致有以下几点:

    1、字符串存在永久代中,容易出现性能问题和内存溢出。

    2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

    3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

    4、Oracle 可能会将HotSpot 与 JRockit 合二为一。

    补充下JDK8内存模型图:

    https://blog.csdn.net/antony9118/article/details/51425581 (两个Survivor的意义)

    https://zhidao.baidu.com/question/1111800566588999699.html(Full GC什么时候触发)

    https://blog.csdn.net/l1394049664/article/details/81486470#%E4%BA%94%E3%80%81java8%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%9B%BE ( JDK8 内存模型图)

    https://blog.csdn.net/quinnnorris/article/details/75040538 (可达性分析算法解析)

    https://segmentfault.com/a/1190000007726689 (卡表是什么)

    序本文主要分析一个频繁GC (Allocation Failure)及young gc时间过长的case。症状gc throughput percent逐步下降,从一般的99.96%逐步下降,跌破99... 来自: weixin_33701251的博客 Table of Contents概述JConsoleVisualVmGC日志GC日志分析概述博主在最近使用spring batch的过程当中遇到了内存容量耗尽程序崩溃的问题,于是决定将此次的内存问题... 来自: topdeveloperr的博客 日志文件中的部分内容如下:分析:让我们来挑几条典型的日志进行分析:第一条:63.971: [GC (Allocation Failure) [PSYoungGen: 31073K->4210K(... 来自: George的博客 点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...... 来自: 爱开发 目录1、个人申请2、团队申请3、企业/组织申请3.1、个人/企业/组织和企业/组织联合申请4、补充最近和团队做一个项目:基于NB-IoT技术的城市道路智慧路灯监控系统,决定申请计算机软件著作权便于保护... 来自: 不脱发的程序猿 文章目录@[toc]spring cloud 介绍spring cloud 技术组成Spring Cloud 对比 Dubbo一、service - 服务二、commons 通用项目新建 maven ... 来自: weixin_38305440的博客 本章介绍导致GC性能问题的典型情况。相关示例都来源于生产环境, 为演示需要做了一定长度的精简。 说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位... 来自: weixin_34210740的博客 首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。那么,... 来自: DavidGoGo_的博客 博客说明:这是自己写的有关python语言的一篇综合博客。只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类... 来自: 归零者 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次... 来自: 程序员宜春的博客 引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧。Java学习路线当然,这里... 来自: java_sha的博客 引子Hacker(黑客),往往被人们理解为只会用非法手段来破坏网络安全的计算机高手。但是,黑客其实不是这样的,真正的“网络破坏者”是和黑客名称和读音相似的骇客。骇客,是用黑客手段进行非法操作并为己取得... 来自: tiantian520ttjs——Python程序猿~ 在前面两篇文章中(https://blog.csdn.net/qq_41453285/article/details/103050710、https://blog.csdn.net/qq_414532... 来自: 江南、董少 本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢... 来自: Nicky's blog 欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所... 来自: Python作业辅导员 - 天元浪子【许向武】 介绍最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的if (msgType = "文本") { // dosomething} else if(msg... 大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频... 来自: 帅地 作者 |胡书敏责编 | 刘静出品 | CSDN(ID:CSDNnews)本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。... 来自: CSDN资讯 位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也... 来自: weixin_34014555的博客 不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于andr... 来自: Hello___Sunshine的专栏 和你一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:和你一起终身学习,这里是程序员 Android本篇文章主要介绍Andr... 来自: 程序员Android 11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。  区块链技术被认为是继蒸汽机、电力... 来自: CSDN资讯 说实话,对于学习路线这种文章我一般是不写的,大家看我的文章也知道,我是很少写建议别人怎么样怎么样的文章,更多的是,写自己的真实经历,然后供大家去参考,这样子,我内心也比较踏实,也不怕误导他人。但是,最... 来自: 帅地 作者 | 胡巍巍出品 | CSDN(ID:CSDNnews)世界500强中,30%的掌舵人,都是印度人。是的,你没看错。这是近日《哈佛商业评论》的研究结果。其中又以微软CEO萨提亚·纳德拉(Satya... 来自: CSDN资讯 这篇文章其实已经准备了11个月了,因为虽然我们年初就开始使用 Angular 的微前端架构,但是产品一直没有正式发布,无法通过生产环境实践验证可行性,11月16日我们的产品正式灰度发布,所以是时候分享... 来自: 柚橙论 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成)one 樱花树 动态生成樱花效... 来自: 碎片 从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英... 来自: CSDN资讯 知乎高赞:中国有什么拿得出手的开源软件产品?在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?”事实上,还不少呢~本人于2019.7.6进行了较为全面的... 来自: 大白技术控 - 大白技术Bravo Yeung 2019年诺贝尔经济学奖,颁给了来自麻省理工学院的 阿巴希·巴纳吉(Abhijit Vinayak Banerjee)、艾丝特·杜芙若(Esther Duflo)夫妇和哈...... 来自: 微信公众号:猴子聊人物 文章目录0.新建操作:1.查看操作2.删除操作3.复制操作4.移动操作:5.重命名操作:6.解压压缩操作0.新建操作:mkdir abc #新建一个文件夹touch abc.sh #新建一个文件1.查... 来自: 不能如期而至的专栏 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的... ​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下... 我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买ma... 双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地... 小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycha... CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是... 2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人... 相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有... 其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...... Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语... By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...... Java基础知识点梳理 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法... 哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈... 蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能... Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以We... Spring1.Spring是什么?有什么好处?2.IOC是什么?有什么好处?具体过程?3.DI是什么?4.IOC和DI的关系?5.bean标签的属性有哪些?6.IOC创建对象有哪几种方式?7.Spr... 作者| Just出品|CSDN(CSDNnews)紧急驰援疫区,AI医生也出动了。截止到2月6日,随着新冠病毒肺炎疫情的不断发展,全国累计已有31161例确诊病例,26359例疑...... 本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降... 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字... 4 容器类型 容器深层含义自己不知道,但是就表面意思。我自己理解的容器就是容器。他就是一个可以装“东西”的罐子啥的。不同的“罐子”可以装的“东西”不同,就像酒杯装酒,茶杯装茶,水缸装水。酒杯、茶杯、水... Guava包中的BloomFilt... qq_35387940: BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 100_0000, 0.001);

    线程安全的List zc19921215: [reply]panyongcsd[/reply] 嗯,是的是的!

    线程安全的List panyongcsd: CopyOnWrite适用于读多写少的场景,是以空间换时间的思想

    在IDEA中直接提交Spark任务 Yuliiiiiiiii: [reply]zc19921215[/reply] 老哥 方便讲解下 "因为不是一个独立的可运行的程序,而是运行在Spark环境上的,由另外一个jvm来调用."这句话吗?

    在IDEA中直接提交Spark任务 zc19921215: [reply]Yuliiiiiiiii[/reply] 这个不太清楚是传递jar包还是直接在JVM中传送序列化类,我个人是倾向与后者,因为会包TaskNotSerial的问题,我也不是很确定