很精彩的一次内部分享,介绍了大部分的GC算法理论知识,JVM博大精深,本篇文章只是结合本次内部分享总结的一些理论知识,如果有大佬有疑问,欢迎留言指出!

Concurrent:并发,程序一边运行一边做GC

Parallel:并行,一块区域,一个人做清扫,需要100s,但是把区域分成两块,用两个人扫,时间就缩短了一半;所以GC算法有并行的,有不是并行的,这些都是可以根据自己的实际业务去选择的,只有最适合自己的GC算法;

Stop The World:简称STW,某些GC算法当中,当需要做GC的时候,程序是必须停下来的,程序就是一个终止状态,当GC结束之后再恢复;Java的GC很多时候都是STW,举一个简单的栗子,一边扫地一边嗑瓜子,这样的话是永远扫不干净的,内存的使用率就不是很高,当然STW有一个很大的缺点,就是程序必须终止,如果说做一次GC用时太长,需要十几秒或者一分钟或更多,那肯定是无法忍受的,这就需要GC调优来完成,通过算法把时间控制在最短,让用户无感知;

root set:公集合,GC的时候会确定现在哪些对象还是存活的,

Generation GC:分代GC,先说一代GC,比方说现在有一个2G的内存区域,那么需要GC的时候,需要把整块内存区域2G遍历一次,来做GC,这是一个很复杂的过程,需要判断这么多的对象是否引用或者被引用,可想而知耗时肯定会很长;以老王的经验,1G内存做一次full GC停顿时间在1-3s,100G内存做一次full GC,停顿时间在1-3min,也就是说这几分钟程序什么都干不了,肯定是无法接受的;所以产出了分代GC,把一个区域分成几个部分,年轻代1,年轻代2,和年老代。比方说程序开始运行,新产生的对象放在年轻代1,装满之后,结合copy算法,从root节点出发,可能真正存活的对象只有很少一部分,那么我们只把这部分对象拷贝到年轻代2里面,然后将年轻代1区域全部清扫掉,这个copy算法非常高效,但前提是需要程序的对象大部分都是用完一次就可以扔掉的,不然的话,存活的对象太多了,copy算法就变得很低效了;所以copy算法的效率取决于剩余的对象,剩余的对象越多,效率越低,剩余的对象越少,效率越高;

RefCount:引用计数算法,当有指针指向这个对象的时候,就把计数器+1,当不指向这个对象的时候把计数器-1,当这个对象的计数器为0的时候,这个对象的内存就可以释放掉了,Python就是用的这个算法,官方的python流派就是用的这个算法,微软的com组建结构也是用的这个引用计数算法;这个算法两个缺点:效率低,因为访问对象是一个很频繁的操作,这样频繁做++;扫不干净,循环列表,a->b->c,其实外部没有引用,但是内部有互相引用,其实abc都是垃圾;

MarkSweep:标记清除算法,有很多对象,从公集合出发找其他的对象,是活的对象就做标记,标记的过程中,程序是不能跑的,当标记完了之后,没有被标记的对象,就都可以释放掉了,但是清扫之后的内存区域会变得千疮百孔,再分配内存的时候,需要在这些内存中,找一个合适自己的内存区域;

MarkCompact:标记压缩算法,可以理解是标记清除算法的一个升级版,同样是在活对象上标记,但是它会选一个活对象作为一个端,把另外标记的活对象往这一端挤,这样被释放的区域就会是一大块的;

Safepoint:当代码运行到某个点,这个点可以做GC,这个点就叫safepoint,做GC的时候,所有的线程都需要停下来,就是所有的线程需要跑到这个安全点,跑到这个点的时候,Java虚拟机会生成一条指令,这个指令会让这个线程访问一个内存地址,这也是为了快速响应;因为线程停下来做别的事情非常耗性能;

Reference:强引用,强引用是我只要引用你,你就不会被垃圾回收;当然还有WeakReference弱引用和软引用SoftReference等;

Java虚拟机的几个GC算法:

  年轻代:Serial:串行,STW特性

      ParNew:多线程,也是STW

      ParScavenge:多线程,同样是STW,是ParNew升级版

  年老代:CMS:试图平衡停顿时间,这个算法的过程为:InitialMark->CCMark->Remark->CCSweep

      SerialOld:MarkCompact算法上面提到过的

      ParOld:同样是MarkCompact算法,是SerialOld升级版

年轻代和年老代GC算法是可以组合的,除了部分;

ZGC:Java11版本发布推出,管理TB级内存,GC时间控制在10ms;

JVM培训之一些GC算法的理论知识的更多相关文章

  1. JVM内存管理之GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  2. jvm系列(三):java GC算法 垃圾收集器

    GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

  3. JVM内存模型与GC算法

    1.JVM内存模型 JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明 ...

  4. JVM内存管理之GC算法精解(五分钟教你终极算法---分代搜集算法)

    引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...

  5. JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  6. JVM内存模型与GC算法(简介)

    JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 ...

  7. JVM的四种GC算法

    程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运 ...

  8. JVM虚拟机垃圾回收(GC)算法及优缺点

    一.什么是GC   GC是jvm的垃圾回收,垃圾回收的规律和原则为:   次数上频繁收集新生区(Young)   次数上较少收集养老区(Old)   基本上不动永久区(Perm) 二.GC算法(分代收 ...

  9. JVM(2)——GC算法和收集器

    一.引入 上篇博客<JVM--简介>中主要介绍了JVM的内存模型,思考一下: 为什么要划分堆.栈.方法区等? 为什么把不同种类的数据信息分别存放? 答案可以分为很多很多条,这里就说一个方面 ...

随机推荐

  1. HDU P2089

    题目大意为,统计区间内不含4和62的数字的个数: 老实说,看到这题我是抵触的..... 基本上是数位DP的板子,话说数位DP好像全是模板题吧: 预处理,有关的整区间的数字个数: 调用已有的区间,求解0 ...

  2. React 入门实例教程[阮一峰的网络日志] (分享)

    作者: 阮一峰 https://github.com/ruanyf/react-demos 转自:http://www.ruanyifeng.com/blog/2015/03/react.html 对 ...

  3. 第8课 网络数据读取测试-TinyWebDB

    TinyWebDB是在线小型数据库,通过它的使用,可以将数据保存在网络,实现排行榜等功能.   实现功能:读入数据并保存,读出数据并显示.   1.组件设计   TinyWebDB1:非可视化,借用网 ...

  4. C语言写控制台互交界面

    void show_menu() { //system("clear"); printf("---------------------\n"); printf( ...

  5. git 打包报错:Maven Build时提示:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test

    1.使用git 升级 服务命令 mvn  deploy -e 之后报错: Failed to execute goal org.apache.maven.plugins:maven-surefire- ...

  6. xml php 解析

    JSON作为数据交换可以说已经成为了一种事实上的标准,但是前几年和它对应的xml虽然说用的越来越少,但是我感觉还是有他可以应用的地方. json更偏重于程序员来使用和解读,而xml则更适合用户来使用和 ...

  7. Vertical-Align: 关于inline,inline-block文本排版

    inline, inline-block元素在同行元素的排版布局中非常有用,但是时常会出现一些莫名奇妙的问题.要解决这些问题,深刻理解inline,inline-block元素的特征有非常重要的意义. ...

  8. Google Developers 中国网站正式发布

    Google Developers 中国网站 (developers.google.cn) 正式发布!Google Developers 中国网站是特别为中国开发者而建立的,它汇集了 Google 为 ...

  9. 关于Ubuntu16.04下phpmyadmin出现mbstring错误的正解

    1.打开终端,输入php -i | grep extension_dir 查看extension_dir的绝对路径 2.查看phpinfo,php.ini的绝对路径 3.打开php.ini文件. 设置 ...

  10. C# 递归函数详细介绍及使用方法

    什么是递归函数/方法? 任何一个方法既可以调用其他方法也可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或递归方法. 通常递归有两个特点: 1. 递归方法一直会调用自己直到某些条件被满足 2. ...