GC 垃圾回收

  1. 什么是垃圾java

系统没有被使用的无用对象或者一组循环引用对象python

  1. 如何找到垃圾算法

  • 引用计数并发

  • 对引用进行计数,没法解决循环引用问题(java里已经抛弃了这种算法,python如今垃圾回收用的仍是引用计数)app

  • 根可达算法ide

根对象有哪些?spa

  1. 线程栈变量线程

  1. 静态变量指针

  1. 常量池orm

  1. JNI指针等

图片


垃圾回收算法

  • mark-sweep:标记清除

  • copying:拷贝

  • mark-compact:标记压缩

标记清除:不适合伊甸区

先标记后清除,两遍扫描,容易产生碎片,适合存活对象比较多的状况




拷贝算法:适合伊甸区

容易形成空间浪费,移动复制对象,须要调整对象引用,适用于存活对象较少的状况,只扫描一次,效率提升,不会形成内存碎片



标记压缩

每次清除垃圾,都把不是垃圾的对象填充到垃圾的坑里,这样就不会产生碎片,但须要扫描两次,须要移动对象,效率低一些

图片


图片


JVM组成

主流的hostspot的JVM是分代模型

由伊甸区 suvisor1 suvisor2 old区组成

对象出生到消亡过程;以下图

图片


s1 最大年龄是4位,最大数是15,因此有个对象在s1里 被扫描了15次就会被放入到 老年代


图片

动态年龄

  • s1 -> s2 超过50%(超过s1+s2的总和的50%)

  • 把年龄最大的放入O

分配担保

YGC期间,suvivor区的空间不够了,空间担保直接进入老年代

垃圾回收器

1.8 默认用的yong是Parallel+ old Parallel (PS+PO)

下图凡是Yong+Old 红线能够连在一块儿的均可以组合。

图片


  • Serial:串行工做,会致使STW。(stop the word),意思是serial垃圾回收的时候,别的都没有工做了。已通过时了。

  • Parallel:多个线程并行处理GC,也会致使STW,可是比Serial效率高

  • ParNew: 由Parallel的加强版:ParNew 响应时间优先,配合CMS,线程数通常是cpu核心数

  • CMS(重点: concurrent Mark sweep,多个线程并行处理,解决(缓解)了STW问题。可是cms问题特别多,例如最严重的内存碎片化,若是管理大内存,碎片化问题严重失衡,会致使使用Serial Old去对老年代的gc顺序作标记进行压缩,致使更严重的STW问题。

并发标记算法:三色标记

三色扫描算法

图片


三色标记法是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法。原理以下,

  1. 首先建立三个集合:白、灰、黑。

  1. 将全部对象放入白色集合中。

  1. 而后从根节点开始遍历全部对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。

  1. 以后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,以后将此灰色对象放入黑色集合

  1. 重复 4 直到灰色中无任何对象

  1. 经过write-barrier检测对象有变化,重复以上操做

  1. 收集全部白色对象(垃圾)

这个算法能够实现 “on-the-fly”,也就是在程序执行的同时进行收集,并不须要暂停整个程序。

可是也会有一个缺陷,可能程序中的垃圾产生的速度会大于垃圾收集的速度,这样会致使程序中的垃圾愈来愈多没法被收集掉。

相关文章
相关标签/搜索