JVM垃圾回收算法和垃圾收集器笔记

概述

程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存.

判断对象是否是垃圾的算法

JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(reference chain),当对一个对象到GC Roots没有任何引用链时,则证明对象不可用的.

判定对象死亡

判定一个对象是否死亡,至少要经历2次标记.如果GC时,经过可达行分析对象不可用,将标记第一次并且进行第一次筛选,筛选条件是对象的finaliz()方法被覆盖且没有执行过.然后放入F-Queue队列中.第二次标记是对F-Queue队列,看对象是否在finalize()方法中拯救自己,否则进行回收.任何对象的finalize()方法都只会被系统自动调用一次,强烈不推荐使用finalize()方法.

垃圾回收算法

  • 标记-清除算法

    最基础的算法,其它算法是对它的完善和补充

  • 复制算法

    现在虚拟机都采用这种收集算法来回收新生代.

  • 标记-整理算法

    也可称标记-压缩算法.回收老年代采用了这种算法.

HotSpot的算法实现

  • 枚举根节点
  • 安全点停顿GC
  • 安全区域GC

垃圾收集器

Serial收集器

Serial垃圾收集器是最基本,历史最悠久的收集器.

单线程GC,回收时”Stop the world”.采用复制算法.

对于运行Client模式下的虚拟机来说是一个不错的选择.

Serial Old收集器

Serial Old收集器是Serial的老年代版本.采用标记-整理算法.

ParNew收集器

Serial垃圾收集器

对于运行Server模式下的虚拟机来说是一个不错的选择.

Parallel Scavenge收集器

Parallel Scavenge收集器是新生代收集器,它采用复杂算法收集,又是并行的多线程收集器.

Parallel Scavenge收集器最主要目的是达到一个可控制的吞吐量.吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和”标记-整理”算法.

CMS收集器

CMS(Concurrent Mark Sweep)收集器是以一种获取最短回收停顿时间为目标的收集器.

4个步骤

- 初始标记(Stop the world)

- 并发标记

- 重新标记(Stop the world)

- 并发清除

G1收集器

并行和并发,分代收集,空间整合,可预测停顿.最前沿技术.

时间: 2024-10-07 18:51:08

JVM垃圾回收算法和垃圾收集器笔记的相关文章

java垃圾回收算法和垃圾收集器

垃圾收集算法.垃圾回收算法.java垃圾收集器 目录1. 垃圾收集算法1)引用计数法2)根搜索法2. 垃圾回收算法1)复制算法2)标记-清除算法3)标记-整理算法4)分代收集算法3. java垃圾收集器新生代GC器:1)Serial垃圾收集器2)ParNew垃圾收集器3)Parallel Scavenge垃圾收集器老年代GC器1)Serial和Parallel Scavenge都有对应的老年代版本2)CMS垃圾收集器4.java对象的内存分配位置5.java TLAB 1. 垃圾收集算法 1)引

Java虚拟机四:垃圾回收算法与垃圾收集器

在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内存就回收了.但是方法区和堆区不一样,一个接口或者实现类所需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,只有程序运行时才能知道创建哪些对象,这部分内存的分配和回收是动态的. 在进行垃圾回收时候,首先需要判断哪些对象需要回收,这就涉及到回收算法的问题. 一.垃圾回收算法 1.标记-清除

6.GC垃圾回收算法和垃圾收集器的关系

JAVAGC垃圾回收机制和常见垃圾回收算法 推荐博客:JVM垃圾回收机制和常见垃圾回收算法 JVM的内存结构.垃圾回收算法 原文地址:https://www.cnblogs.com/2019wxw/p/11762065.html

JVM垃圾回收算法(最全)

JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C

JVM垃圾回收算法及分代垃圾收集器

一.垃圾收集器的分类 1.次收集器 Scavenge GC,指发生在新生代的GC,因为新生代的Java对象大多都是朝生夕死,所以Scavenge GC非常频繁,一般回收速度也比较快.当Eden空间不足以为对象分配内存时,会触发Scavenge GC. 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区.然后整理Survivor的两个区.这种方式的GC是对年轻代的Eden区进行

jvm(5)---垃圾回收(回收算法和垃圾收集器)

1.垃圾回收算法 1.1 标记-清除算法 算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.它是最基础的收集算法,效率也很高,但是会带来两个明显的问题: 1.效率问题 2.空间问题,标记清除后会产生大量不连续的碎片 1.2 复制算法 为了解决效率问题,“复制”收集算法出现了.它可以将内存分为大小相同的两块,每次使用其中的一块.当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉.这样就使每次的内存回收都是对内存区间

JVM垃圾回收算法 总结及汇总

先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,

JVM系列(四) - JVM垃圾回收算法

前言 前面介绍了Java内存运行时区域,其中 程序计数器.虚拟机栈.本地方法栈 三个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性.在这几个区域内不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟随着回收了. Java堆 和 方法区 则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样.我们只

JVM 垃圾回收算法

在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是"垃圾". 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是"垃圾"了. 引用计数器实现简单,效率高:但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和减少都带来了很多额外的开销,所以在JDK1.1之后,