JVM垃圾回收机制

8、GC垃圾回收机制

通过上面的学习,我们可以简单推测出GC垃圾回收机制只会存在堆中!

GC两种类

  • 轻GC(普通GC):在Eden满的时候会触发
  • 重GC(全局GC):在养老区满的时候会触发,或者自己 使用 System.gc这样程序可以进行

GC题目:

  • JVM内存模型及其分区,详细到每个区放什么?

JVM包括:

  1. 栈:存放类的引用、方法引用、基本数据类型,不存在GC
  2. 堆:包括方法区,存放类的实例方法的实例,常量池,大部分GC都在这,并且可以改变大小
  3. 本地方法栈:存放本地方法库中的方法的引用,本地方法库一般是由C或者C++写的
  4. 程序计数器:让每个线程有序进行!
  • 堆里的分区有哪些?各个区有什么特点?什么作用?

答:新生区、养老区、元空间

新生区包括Eden区、幸存区from、to 也就是对象的实例诞生的地方,同时 也是大多数类死亡的地方

养老区的实例能活很久

元空间以前叫永久代或持久区,里面存有方法区,静态方法区

  • GC的算法有哪些 ?怎么用的?

答:标记清除法、标记压缩、复制算法、引用计数器

  • 轻GC和重GC的区别

轻GC在Eden区满的时候触发,重GC在养老区满的时候自动执行或者手动写了 System.gc会建议程序执行重GC可能不执行,不建议使用 System.gc 会特别影响程序性能

GC垃圾回收方式:


1、引用奇数器

2、复制算法

什么是复制算法?就是把对象赋值到取它地方

基于它的优缺点我们主要在新生区使用它,实现 from 和 to区对象的互换

执行过程:

  • 每次GC都会把 Eden 区中存活的对象转移到 to区,
  • 把原来from区中的对象复制转移到to区
  • from 和 to 区改变名字:谁空谁是to区

如何调节对象进入老年区的时间?

-XX:MaxTenuringThreshold = 15;默认是15,可以根据对象调用的次数进行调优!
  • 具体过程:

  • 优缺点:

优点:没有内存碎片:没有把东西乱放

缺点:浪费了一本的空间,to区一直为空

所以适用在对象存活度较低的区域,其实就是新生区!

3、标记清除压缩算法

一般标记清除法和标记压缩连一起使用,下面是具体操作流程图

只执行前两步就是标记清除法

  • 缺点:浪费时间,扫描了两次,产生了碎片空间
  • 优点:没有浪费空间

三步执行完为标记清除压缩算法

  • 缺点:浪费时间,扫描了三次
  • 优点:没有浪费空间

选:标记清除算法(内存碎片多了) 再选一次标记压缩算法

总结:

内存效率:(时间复杂度) 复制算法 > 标记清除法 > 标记压缩法

内存整齐度:(内存碎片多少) 复制算法 = 标记压缩算法 > 标记清除算法

内存利用率:(空间复杂度) 标记压缩 = 标记清除 > 复制算法

思考:有最优的算法吗?

答:没有最好的算法,只有最合适的算法,-----> GC:分代收集算法:根据不同 代对象的特点进行选择最合适的算法!

实例:

  • 新生代:

特点:存活率底

选复制算法

  • 老年代:

特点:存活率高

posted @ 2020-04-14 10:47  贝加尔湖畔╭  阅读(206)  评论(0)    收藏  举报