美文网首页
2.垃圾收集器与内存分配策略(1)

2.垃圾收集器与内存分配策略(1)

作者: 农民工进城 | 来源:发表于2021-02-28 23:12 被阅读0次

本章要点

1.如何判定对象死亡
2.垃圾回收算法
3.垃圾收集器
4.引用分类

1.判定对象死亡

要想知道如何垃圾回收,首先应该明确如何什么才能算得上是“垃圾”。
那么如何判断对象是否死亡,即垃圾呢?

1.1 引用计数算法:

给对象中添加一个引用计数器,每当有一个地方引用的时候+1,当引用时效,计数器值-1,当计数器的值为0,即对象不可再用。
特点:实现简单,效率高;但是不能很好的解决对象之前的相互循环引用的问题。

1.2 可达性分析算法:

通过一系列的成为“GC ROOT”的对象作为起始点,从这些节点开始往下搜索,搜索所经过的路径称为“引用链”,当一个对象没有任何引用链能够到达GC ROOT的时候,则证明该对象是不可用的

1.3 GC-ROOT

GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收。

  • 处于激活状态的线程
  • 虚拟机栈中栈桢中的局部变量(也叫局部变量表)中引用的对象
  • 方法区中类的静态变量、常量引用的对象
  • 本地方法栈中 JNI (Native方法)引用的对象

2.垃圾回收算法

2.1标记清除法

分为"标记"和"清除"两个阶段。首先标记所有需要清除的对象,然后统一回收所标记的对象
缺点:
1.效率问题:标记和清除两个阶段的效率都不高
2.清除后会产生大量不连续的空间碎片

2.2 复制算法

它将可用内存分成大小相等的两块,每次只使用其中的一块(用于新生代);但是由于新生代的对象都是朝生夕死,所以一般不需要两等分。而是将它分成一大块的eden空间和两个较小的survivor,每次只使用Eden和其中的一块survicor,其比例是:Eden:suvivor:suvivor=8:1:1,所以有效区域为90%。
优点:实现简单,高效
缺点:代价比较高,只有一半的内存可用

2.3 标记整理算法

标记整理算法的标记阶段和标记清除的算法是一样的,只不过整理阶段不单单是清除,而是让所有还活着的对象移到另一端,然后清理掉边界以外的内存;适合用于老年代。

image.png

3.垃圾收集器

3.2 垃圾收集器种类
image.png
3.2 性能指标
  • 吞吐量:这里的吞吐量是指应用程序所花费的时间和系统总运行时间的比值。我们可以按照这个公式来计算 GC 的吞吐量:GC 的吞吐量=应用程序耗时/系统总运行时间,系统总运行时间 = 应用程序耗时 +GC 耗时。如果系统运行了 100 分钟,GC 耗时 1 分钟,则系统吞吐量为 99%。GC 的吞吐量一般不能低于 95%。
  • 停顿时间:指垃圾收集器正在运行时,应用程序的暂停时间。对于串行回收器而言,停顿时间可能会比较长;而使用并发回收器,由于垃圾收集器和应用程序交替运行,程序的停顿时间就会变短,但其效率很可能不如独占垃圾收集器,系统的吞吐量也很可能会降低。
  • 垃圾回收频率:多久发生一次指垃圾回收呢?通常垃圾回收的频率越低越好,增大堆内存空间可以有效降低垃圾回收发生的频率,但同时也意味着堆积的回收对象越多,最终也会增加回收时的停顿时间。所以我们只要适当地增大堆内存空间,保证正常的垃圾回收频率即可

4. 引用分类

JDK 1.2 之后,Java 对引用的概念进行了扩充,将引用分为了以下四种:


image.png

相关文章

网友评论

      本文标题:2.垃圾收集器与内存分配策略(1)

      本文链接:https://www.haomeiwen.com/subject/dczgfltx.html