学习记录--《GC和GC Tuning》_YhZhou1996的博客-程序员宝宝

技术标签: jvm  学习  java  jvm.gc  

一、垃圾概念
没有引用执行的任何对象都叫做垃圾。
二、java和C++对垃圾处理的区别
java:只管扔垃圾就行,自动处理

  • GC处理垃圾
  • 开发效率高,执行效率低

C++:手动处理,但会产生问题

  • 忘记回收,内存泄漏
  • 回收多次
  • 非法访问
  • 开发效率低,执行效率高

三、如何定位垃圾
引用计数(Reference Count)后面会说RC

  • 有一个引用指向一个对象,头部有个数字,有几个指向他就写几,当变为0,就是垃圾。
  • 无法解决的问题:循环引用A->B->C,形成一种闭环,大家都是1,对于RC来说不是垃圾,单没有其他引用指向,这几个也是垃圾但是无法定位。

根可达算法(Root Searching)

  • 解决循环引用问题。
  • 通过根对象开始找,找不到就是垃圾。

根有哪些

  • JVM Stack:虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
  • Method-area:方法区中的类静态属性引用的对象。
  • Method-area:方法区中常量引用的对象。
  • Native stack:本地方法栈中JNI(Native方法)引用的对象。

三、常见的垃圾回收算法

  • 标记清除(mark sweep) - 位置不连续 产生碎片 效率偏低(两遍扫描)
  • 拷贝算法 (copying) - 没有碎片,浪费空间
  • 标记压缩(mark compact) - 没有碎片,效率偏低(两遍扫描,指针需要调整)

四、JVM内存分代模型(用于分代垃圾回收算法)

部分垃圾回收器使用的模型

  • 除Epsilon ZGC Shenandoah之外的GC都是使用逻辑分代模型
  • G1是逻辑分代,物理不分代(还不熟,学习中)其他大神博主关于G1的介绍
  • 除此之外不仅逻辑分代,而且物理分代

新生代 + 老年代 + 永久代(1.7)Perm Generation/ 元数据区(1.8) Metaspace

  • 永久代 元数据 - Class
  • 永久代必须指定大小限制 ,元数据可以设置,也可以不设置,无上限(受限于物理内存)
  • 字符串常量 1.7 - 永久代,1.8 - 堆
  • MethodArea逻辑概念 - 永久代、元数据

新生代

  • eden:默认比例8,刚new出来对象之后扔进去的区域。
  • survivor(s0):默认比例1,回收一次之后跑到这个区域,装的对象不同,算法也不同
  • survivor(s1):默认比例1

一个对象产生后进行栈上分配,若分配不下进入eden,eden经过一次垃圾回收进入s0,s0在经过一次垃圾回收后进入s1,此时eden某些对象也跟着进入s1,什么时候年龄够了会进入old区。

  1. YGC回收之后,大多数的对象会被回收,活着的进入s0
  2. 再次YGC,活着的对象eden + s0 -> s1
  3. 再次YGC,eden + s1 -> s0
  4. 年龄足够 -> 老年代 (15 CMS 6)
  5. s区装不下 -> 老年代

老年代

  • 老年代满了FGC: Full GC

GC Tuning (Generation)
- 尽量减少FGC

  • MinorGC = YGC:年轻代空间耗尽触发
  • MajorGC = FGC:老年代无法继续分配空间时触发,新生代老年代同时进行回收

对象分配过程图

对象分配过程图
start会new一个新对象,首先在栈上分配,如果能分配就分配到栈上,栈上有个好处直接压栈弹出。若分配不下就会判断打不打(用一个参数来制定),如果特别大,直接进入old区(FGC才会结束),如果不够大,会进去TLAB到eden,进行GC清除。如果清完结束,没清完进S1,S1在进行GC的清除,如果年龄够了进入old区,如果不够进S2。

五、常见的垃圾回收器
常见的垃圾回收器

  • 简单介绍:JDK诞生 Serial追随提高效率,诞生了PS,为了配合CMS,诞生了PN,CMS是1.4版本后期引入,CMS是里程碑式的GC,它开启了并发回收的过程,但是CMS毛病较多,因此目前任何一个JDK版本默认是CMS并发垃圾回收是因为无法忍受STW。
  • 垃圾回收器(常见组合S+SO,PN+CMS,PS+PO,基本上默认PS+PO):
  1. Serial 年轻代 串行回收
  2. PS 年轻代 并行回收
  3. ParNew 年轻代,配合CMS的并行回收
  4. SerialOld
  5. ParallelOld
  6. ConcurrentMarkSweep 老年代 并发的, 垃圾回收和应用程序同时运行,降低STW的时间(200ms)
  7. CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定
  • 单独解释一下CMS:CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定,CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收

  • CMS常见几个阶段:1.CMS initial mark(初始标记阶段)2.CMS concurrent mask(并发标记)3.CMS remark(重新标记)4.concurrent sweep(并发清理)

  • CMS四个阶段的解释:
    1.初始标记STW开始的标记
    2.并发标记和应用程序同时进行
    3.重新标记又是一个STW,在并发标记中产生新垃圾在重新标记中标记
    4.并发清理会产生新垃圾,叫浮动垃圾

  • CMS两大问题
    1.Memory Fragmentation内存碎片,CMS设计对付几百兆内存,到了上G内存的时候,一旦老年代产生很多碎片,年轻代过来找不到空间,这叫PromotionFailed找不到空间,这时候会用Serial Old进行标记压缩
    2.Floating Garbage浮动垃圾,出现Concurrent Mode Failure和PromotionFailed时说明碎片较多,里面内存分配不下会调用Serial Old。
    解决方案:降低触发CMS的阈值。

  • CMS和PO为啥不能一起使用:提出这个问题的原因是为何是Serial,而不能并行执行原因在于,Parallel Scavenge没有使用原本HotSpot其它GC通用的那个GC框架,所以不能跟使用了那个框架的CMS搭配使用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Joker18748379021/article/details/109608554

智能推荐

彻底了解什么是人工智能_csdn人工智能头条的博客-程序员宝宝

在计算机科学领域中,人工智能是一种机器表现的行为,这种行为能以与人类智能相似的方式对环境做出反应并尽可能提高自己达成目的的概率。人工智能大体上可以分为 3 类:弱人工智能...

java map addall_JAVA中关于Map的九大问题_weixin_39670857的博客-程序员宝宝

通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的。下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题。0、将Map转换为List类型在java中Map接口提供了三种集合获取方式:Key set,,value set, and key-value set.。它们都可以通过构造方法或者addAll()方法来转换为List类型。下面代码就说明了如何从Map中构造A...

[Hadoop源码详解]之一MapReduce篇之InputForma_suejl的博客-程序员宝宝

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://shitouer.cn/2013/02/hadoop-source-code-analyse-mapreduce-inputformat/1. 概述我们在设置MapReduce输入格式的时候,会调用这样一条语句:?1jo

【Bootstrap】本地css样式放置的位置,以及jsp文件中如何引用样式_arctan90的博客-程序员宝宝

【前言】在项目里用了Bootstrap框架,第一次写前端,发现不知道如何引用样式。首先样式文件css js fonts放在什么地方?按照现在的常用做饭,css放在WebContent目录下,而不能放在WEB-INF目录下其次,如何引用CSS?在Bootstrap样例代码中,核心库用了一个外部的cdn如果我本地有现成的css文件夹,就放在了WebConte

Oracle bitand( )函数简介_老鼠拧刀满街找猫的博客-程序员宝宝_oracle中bitand函数

Oracle bitand( )函数在Oracle数据库中是很常见的,下面就为您详细介绍Oracle bitand( )函数的用法,如果您感兴趣的话,不妨一看。Oracle bitand( )函数:返回两个数值型数值在按位进行AND 运算后的结果。语法BITAND(nExpression1, nExpression2)参数nExpression1, nExpression2

Github优秀web前端资源收集_酷笔记的博客-程序员宝宝

[url=http://www.kubiji.cn/github_listing-id74.html]Github[/url]优秀[url=http://www.kubiji.cn/juhe_listing-idQianDuanXingNeng.html]web前端[/url]资源收集HTML/CSS[url=https://github.com/h5bp/html5-boiler...

随便推点

面试的五个经典问题_weixin_30617737的博客-程序员宝宝

面试的五个经典问题 面试的五个经典问题[ 2006-03-15 18:08 ]面试是应聘一份工作的重要一关。许多人常常担心面试官到底会问什么,下面这五个经典问题可以帮你理一下思路。 1、Please tell us about your work experience. 请告诉我你过去的工作经验. "Work experience"...

Java LocalDate类| toEpochDay()方法与示例_cumtv80668的博客-程序员宝宝

LocalDate类的toEpochDay()方法 (LocalDate Class toEpochDay() method)toEpochDay() method is available in java.time package. toEpochDay()方法在java.time包中可用。 toEpochDay() method is used to convert this LocalD...

小谈Online-game服务器端设计(3)_CYoung的博客-程序员宝宝

原文地址:http://dev.gameres.com/Program/Abstract/Thinking/online_g_3.htm 下面我想来谈谈关于服务器上NPC的设计以及NPC智能等一些方面涉及到的问题。首先,我们需要知道什么是NPC,NPC需要做什么。NPC的全称是(Non-Player Character),很显然,他是一个character,但不是玩家,那么从这点上可以知道,N

2015总结_Surenon的博客-程序员宝宝

2015总结 1.真心学到了很多东西。每天朝9晚9+的,程序员最考验的是身体了。2.全栈是个不小而甘愿进入的坑。3.golang真心喜欢。开发守护进程,后端,后台非常开心。4.学会了和女孩子相处。(首先要有钱,或者多才多艺,兼得最好。当然,打代码速度快是不算艺术的,毕竟女程序猿太少了)5.不要过多的集中于业务逻辑,我是一个工程师...

什么?CPU 怎么运行代码?_公众号:肉眼品世界的博客-程序员宝宝

本文来源:养码场最近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU对代码的识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们。首先要开始这个话题要先说一下半导...

Exception evaluating SpringEL expression:_正在学习的小白:葛的博客-程序员宝宝

Exception evaluating SpringEL expression:错误说明:在网上找了很多文章解决的方法,很多都没啥作用不过慢慢找着百度还是被我找到了解决的方法转载自:http://www.bubuko.com/infodetail-2594317.html错误信息:Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "username" (template: "u