[转帖]jvm学习一-垃圾回收算法

jvm,学习,垃圾,回收,算法 · 浏览次数 : 0

小编点评

**新生代复制算法** **步骤:** 1. 当伊甸区满时,触发第一次 GC。 2. 将还活着的对象复制到 from 区。 3. 当 eden 区再次触发 GC 时,扫描 eden 和 from 两个区进行垃圾回收。 4. 回收还存活的对象进入 to 区或老年代。 5. 清空eden和from区的对象,并互换。 6. 将这些对象年龄加 1 清空。 7. 清空eden 和 from 区的对象,并互换。 8. 将 from 区变为 to 区,to 区变为 from 区。 **优点:** * 整体复制,不会产生内存碎片。 * 实现简单,运行高效。 * 比较占用内存空间少,但会浪费部分内存空间 (to 区总是为空的)。 **缺点:** * 比较占用内存空间,有些大对象复制比较耗时。 * 会浪费部分内存空间 (to区总是为空的)。 **标记清除算法** 1. 标记所有需要回收的对象。 2. 统一清理这些对象。 **标记整理算法** 1. 标记所有对象,然后移动它们到一个端。 2. 清理掉端边界以外的内存。 **垃圾确定方式** 1. 根搜索算法:从 GC Roots 开始向下搜索,搜索走过的路径被称为(Reference Chain)。 2. 当一个对象到 GC Roots 没有任何引用链相连时,证明该对象是不可用的。

正文

1 复制算法:新生代(MinorGC)

复制->清空->互换。
复制:当伊甸区满的时候会触发第一次gc,把还活着的对象拷贝到from区,当eden区再次触发gc的时候会扫描eden和from两个区进行垃圾回收,经过这次,回收还存活的对象进入to区或者老年代(年龄>=15)。同时把这些对象年龄+1
清空:然后清空eden和from区的对象,
互换:from区变为to区,to区变为from区

新生代采用复制算法的原因是新生代的对象大都是朝生夕死,需要复制的对象占少数。

优点

  • 整体复制,不会产生内存碎片。
  • 实现简单,运行高效

缺点

  • 比较占用内存空间,有些大对象复制比较耗时。
  • 会浪费部分内存空间(to区总是为空的)

2 标记清除算法

标记->清除,先标记出需要回收的对象然后统一清除


优点:节约内存空间
缺点:产生内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不触发另一次垃圾收集动作

3 标记整理算法

标记->移动->清除
该算法标记的过程与标记—清除算法中的标记过程一样,但对标记后出的垃圾对象的处理情况有所不同,它不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。在老年代中,对象存活率比较高,比较适合标记整理算法

优点:节约内存空间,不会产生碎片
缺点:需要移动对象的成本

4 垃圾确定方式

根搜索算法:通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),
当一个对象到GC Roots 没有任何引用链相连时(即从 GC Roots 节点到该节点不可达),则证明该对象是不可用的。
GC Root对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览36524 人正在系统学习中

与[转帖]jvm学习一-垃圾回收算法相似的内容:

[转帖]jvm学习一-垃圾回收算法

1 复制算法:新生代(MinorGC) 复制->清空->互换。 复制:当伊甸区满的时候会触发第一次gc,把还活着的对象拷贝到from区,当eden区再次触发gc的时候会扫描eden和from两个区进行垃圾回收,经过这次,回收还存活的对象进入to区或者老年代(年龄>=15)。同时把这些对象年龄+1 清

[转帖]JVM——内存区域:运行时数据区域详解

https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步。 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象、一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较。 对于C++

[转帖]JVM系列之:GC调优基础以及初识jstat命令

本文为《深入学习 JVM 系列》第二十二篇文章 影响垃圾收集性能有三个主要的属性,垃圾收集调优又有三个基本原则,以及垃圾收集调优时需要采集的信息。如果想要对垃圾收集进行调优,则需要根据实际场景对不同属性做出取舍,理解调优的原则以及收集什么信息。 性能属性 吞吐量 吞吐量是评价垃圾收集器能力的重要指标

[转帖]JVM系列之:你知道Java有多少种内存溢出吗

本文为《深入学习 JVM 系列》第二十五篇文章 Java内存区域 关于这部分内容大多来源于《深入理解Java虚拟机》一书。 Java 运行时数据区域(JDK8)如下图所示: 关于上述提到的线程共享和线程隔离区域,下图做详细讲解: 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的

[转帖]JVM系列之:深入学习方法内联

在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s

[转帖]JVM系列之:深入学习方法内联

https://zhuanlan.zhihu.com/p/487044559 在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方

[转帖]Kafka 核心技术与实战学习笔记(六)kafka线上集群部署方案

一.操作系统-Linux Kafka是JVM系的大数据框架kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的".class"文件 使用Linux kafka客户端底层使用Java的selector,selector在Linux上的实现机制是epoll,由于在windows上

[转帖]jvm学习三-MAT内存分析工具的使用

目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 Dominator Tree 1 模拟内存溢出程序 1.1 jvm配置 -XX:+PrintGCDe

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的