文章目录

  • JVM的GC
    • JVM GC的种类
    • GC的触发机制
      • 年轻代GC(Minor GC)触发机制
      • 老年代GC(Major GC/Full GC)触发机制
      • Full GC触发机制
    • 为什么需要把Java堆分代?
      • 扩展:分代回收机制的三个假说

JVM的GC

GC:垃圾回收

GC英文全称为Garbage Collection,即垃圾回收。

Java中的GC就是对内存的GC。

Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。

Java对象的分配,程序员可以通过new关键字,Class的new-Instance方法等来显示的分配;而对象的释放,程序员不能实时的进行释放,这就需要GC来完成。

JVM GC的种类

JVM常见的GC包括三种:Minor GC,Major GC与Full GC

针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:

  • 一种是部分收集(Partial GC)
  • 一种是整堆收集(Full GC)

部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集,其中又分为:

  • 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集
  • 老年代收集(Major GC/Old GC):只是老年代的垃圾收集
  • 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集,目前,只有G1 GC会有这种行为

整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集

注意:JVM在进行GC时,并非每次都对所有区域(新生代,老年代,方法区)一起回收的,大部分时候回收的都是指新生代

GC的触发机制

年轻代GC(Minor GC)触发机制

触发机制:

  • 当年轻代空间不足时,就会触发Minor GC,这里的年轻代空间不足指的是Eden区满,Survivor区满不会触发GC(每次Minor GC 会清理年轻代的内存)

因为Java对象大多具备朝生夕死的特新,所以Minor GC非常频繁,一般回收速度也比较快.
Minor GC会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才恢复运行

老年代GC(Major GC/Full GC)触发机制

指发生在老年代的GC,对象从老年代消失时,我们说"Major GC或Full GC"发生了、

一般出现Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)

触发机制:

  • 也就是老年代空间不足时,会先尝试触发Minor GC,如果之后空间还不足,则触发Major GC

PS:
Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长
如果Major GC后,内存还不足,就报OOM了
Major GC的速度一般会比Minor GC慢10倍以上

Full GC触发机制

触发Full GC执行的情况有如下五种:

  • 调用System.gc(),系统建议执行Full GC,但是不必然执行
  • 老年代空间不足
  • 方法区空间不足
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
  • 由Eden区,from区向to区复制时,对象大小大于to区可用内存,则把对象转存到老年代,并且老年代的可用内存小于该对象大小(那要是GC之后还不够呢?那还用说:OOM异常送上)

另外要特别注意: full GC是开发或调优中尽量要避免的

为什么需要把Java堆分代?

经研究,不同对象的生命周期不同,70%-99%的对象是临时对象

其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象都在一个区域,当需要进行GC的时候就需要把所有的对象都进行遍历,GC的时候会暂停用户线程,那么这样的话,就非常消耗性能,然而大部分对象都是朝生夕死的,何不把活得久的朝生夕死的对象进行分代呢,这样的话,只需要对这些朝生夕死的对象进行回收就行了.总之,容易死的区域频繁回收,不容易死的区域减少回收.

扩展:分代回收机制的三个假说

当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)[插图]的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:

  1. 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
  2. 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

把分代收集理论具体放到现在的商用Java虚拟机里,设计者一般至少会把Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域。顾名思义,在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。

分代收集并非只是简单划分一下内存区域那么容易,它至少存在一个明显的困难:对象不是孤立的,对象之间会存在跨代引用。

假如要现在进行一次只局限于新生代区域内的收集,但新生代中的对象是完全有可能被老年代所引用的,为了找出该区域中的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样。遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担。

为了解决这个问题,就需要对分代收集理论添加第三条经验法则:

  1. 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数。

依据这条假说,我们就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构(称为“记忆集”,RememberedSet),这个结构把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用。此后当发生Minor GC时,只有包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描。

所以说,虽然这种方法需要在对象改变引用关系(如将自己或者某个属性赋值)时维护记录数据的正确性,会增加一些运行时的开销,但比起收集时扫描整个老年代来说仍然是划算的。

JVM的三种常见GC:Minor GC、Major GC与Full GC相关推荐

  1. JVM的三种垃圾回收算法

    一.什么是垃圾? 在了解垃圾回收机制之前我们首先要定义一下什么是垃圾,我们内存里大部分的对象都是随着方法的执行而创建,方法执行完毕后这些对象就不会被再次使用了,但是这些生成的对象不会被清除掉,所以我们 ...

  2. bios显示计算机故障,笔记本电脑BIOS出现故障怎么办 三种常见BIOS故障解决方案...

    笔记本电脑出现黑屏怎么办?长时间无法开间是什么原因?如何在老IBM笔记本电脑BIOS设置中删除修改密码?我想大家都会朋友这些令人困扰的BIOS故障吧.下面本文就针对这三种常见的BIOS故障,给出大家一 ...

  3. 三种常见mq的优缺点比较

    共同的优缺点:优点:解耦系统,异步化,削峰缺点:系统可用性降低,复杂度增高,维护成本增高MQ,保证最终一致性 同时保证消息的处理的幂等性,保证broker的高可用 优点: 1.实现简单,改造成本低 2 ...

  4. 常见的邮件服务器有哪三种,常见邮件服务器的种类有哪些?分别用什么协议?,常见服务器类型...

    我们简单地比力一下SMTP和HTTP.那两个和谈都是用于从一台从机向另一台从机传送文件;HTTP用于从web办事器向Web用户代办署理(即浏览器)传送文件(或对象),SMTP用于从一个邮件办事器向另一 ...

  5. 常见的网络计算机模式有哪三种,常见的无线组网模式有哪几种

    1.无线组网 组网要求:在局域网内用无线的方式组网,实现各设备间的资源共享. 组网方式:在局域网中心放置无线接入点,上网设备上加装无线网卡. 2.网状网连接 无线网状网是纯无线网络的系统,网络内的各个 ...

  6. 三种常见Content-Type格式,最后一种你肯定用过

    文章目录 一 参数传输失败元凶:请求头中的Content-Type 1.1 application/x-www-form-urlencoded 1.2 multipart/form-data 1.3 ...

  7. Java中 9 种常见的 CMS GC 问题分析与解决

    目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...

  8. 美团技术总结:Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  9. 美团技术:Java中9种常见的CMS GC问题分析与解决

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

最新文章

  1. Android中的PopupWindow详解
  2. 京东上市了,员工有多少股票? .
  3. ps导出gif颜色不对_PS基础知识(1)
  4. 【今日CS 视觉论文速览】3 Jan 2019
  5. Web开发秘方(WEB DEVELOPMENT RECIPES)[47.5MB] PDF扫描版
  6. Oracle_忘记密码
  7. C#实现两个时间相减的方法
  8. NanoDet-Plus的学习笔记
  9. 1. OpenMAX系列 —— ACodec和OMX的联系
  10. shell 后台运行程序并写pid文件
  11. 什么是java实例化?举例说明
  12. 构建Arduino的LoRa远程智能空气质量监测系统
  13. 视觉测试_5分钟即可开始视觉测试
  14. Spring Cloud 学习笔记
  15. java计算机毕业设计大学生校园兼职系统源码+数据库+系统+lw文档+部署
  16. uniapp实现左右滑动
  17. python手机触屏代码_使用python实现触摸?
  18. 支持向量机原理(一) 线性支持向量机
  19. 行为识别笔记:iDT算法用法与代码解析
  20. js中关于length与size的区别

热门文章

  1. 手机屏幕xy坐标软件_软件工程中的xy问题
  2. Java基础之四大核心函数式接口简单使用
  3. HLS 流媒体服务与加解密
  4. 编辑器工具--通用编辑器工具(持续完善中)
  5. 华为视频终端默认的Web页面用户名和密码是多少
  6. ADODB.Recordset 错误 '800a0bb9' 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
  7. TL431NSG-A 友顺UTC
  8. 理解 RxSwift:为什么要使用 RxSwift(一)
  9. 从键盘上输入一位整数,当输入1~7时,显示对应的英文星期名称的缩写。
  10. 【解决】ERROR Failed to compile with 1 error;error in ./node_modules/pdfjs-dist/build/pdf.js