jvm的经典回收算法

一.垃圾回收的两个方法

  1.引用计数算法

      对象添加计数器,被引用一次计数器自加1,当引用失效计数器减1,当计数器为0的时候,

      对象就是处于可以回收的状态。(也就是不可用的状态)

          这个计数算法的好处就是实现简单。坏处就是当有两个对象相互引用,GC收集就会失败。

    2.根搜索算法

      根搜索算法这个就是 GC Roots对象作为起点,然后形成一个引用链(Reference Chain)

      如果对象不再这个引用链上(不可达)将会被认为是可回收的对象

二.GC回收的对象以及几个引用

    GC回收的对象

   1.虚拟机栈中所引用的对象。(堆中的对象)

   2.方法区中的静态变量。

   3.方法区中的常量。

   4.Native方法中的引用对象。

  引用的类型(由强到弱)

   1.强引用:new出来的对象

   2.软引用:可有可无的引用,SortReference类实现

   3.弱引用:非必要对象,只能生存到下一次GC前,通过WeakReference来实现

   4.虚引用:一个对象的生存跟虚引用没关系,构不成影响,作用就是GC前的一次系统通知

三.对象的存亡

  首先如果是不可达的对象,那就被缓刑了,至少经历两次标记然后就会被GC。(没有覆盖finalize方法)

  如果finalize方法中有机会返回引用链那么对象就逃逸了(finalize只能被执行一次,就是对象自救只能一次)

  逃逸不了就真的要死刑了

四.方法区的垃圾回收

  1.废弃常量的回收,这个跟Java堆中的回收方法差不多,只要没有被引用就有可能会被GC。

  2.无用类的回收,这个回收条件就相当的苛刻,首先判断它是可回收的(下面三个步骤)

    2.1类中的生成的实例都被回收

    2.2加载该类的ClassLoader已经被回收

    2.3该类已经完全没有被引用(反射等)

    满足上面三个条件这个类只是可以被回收

五.垃圾回收算法

  1.标记清除算法:先标记要回收的对象,然后收集。

    缺点:1.标记与清除的效率都不高。2.产生大量的内存碎片。

    2.复制算法:分为Eden:Survivor from:Survivor to = 8:1:1(新生代的比例)新生代

    Eden与from这两个是用来保留新对象的,GC后Eden存活的对象就会到to,

    而from存活的就会“老一岁“(标志加1)。到达阈值就会移进老年代。(而且老年代会

    做出分配担保)

    3.标记整理算法:就是标记清除的改进,还多了整理,使得不会产生许多内存碎片。

  

  4.分代收集算法:分为老年代与新生代,各代的收集算法都不一样。

  参考:深入理解java虚拟机

原文地址:https://www.cnblogs.com/feizhai/p/9197853.html

时间: 2024-09-30 08:00:27

jvm的经典回收算法的相关文章

图解JVM垃圾内存回收算法

图解JVM垃圾内存回收算法 这篇文章主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面博主和大家来一起学习一下吧 前言 首先,我们要讲的是JVM的垃圾回收机制,我默认准备阅读本篇的人都知道以下两点: JVM是做什么的 Java堆是什么 因为我们即将要讲的就是发生在JVM的Java堆上的垃圾回收,为了突出核心,其他的一些与本篇不太相关的东西我就一笔略过了 众所周知,Java堆上保存着对象的实例,而Java堆的大小是有限的,所以我们只

JVM常见垃圾回收算法

jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称GC)算法. 在Java堆上分配一个内存给实例对象时,此时在虚拟机栈上引用型变量就会存放这个实例对象的起始地址. Object obj = new Object();  现在如果我们将变量赋值为null. obj = null; 此时可以看到Java堆上的实例对象无法再次引用它,那么它就是被GC的对

jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)

1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域.(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行. 2.jdk.jre.jvm是什么关系?(1)JRE(Java

一张图让你看懂JVM之垃圾回收算法详解

前言 从上面这个图我们总体上对JVM的结构特别是内存结构有了比较清晰的认识,虽然在JDK1.8+的版本中,JVM内存管理结构有了一定的优化调整.主要是方法区(持久代)取消变成了直接使用元数据区(直接内存)的方式,但是整体上JVM的结构并没有大改,特别是我们最为关心的堆内存管理方式并没有在JDK1.8+的版本中有什么变化,所以图中的结构整体上是没有什么不准确的,之所以将方法区以及持久代标注出来,主要还是为了起到对比认识的作用,大家知道就可以了. 关于持久代元数据区的使用问题,目前可以理解就是使用的

JVM优化 垃圾回收 算法 垃圾收集器 GC日志可视化查看

今日内容了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行.并行.并发.G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收?程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存 资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了. 1.1.C/C++语言的垃圾回收在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete 关键字释放内存资源.如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,

JVM的垃圾回收算法有哪些

常用的垃圾回收算法有如下四种:标记-清除.复制.标记-整理和分代收集. 标记-清除算法从算法的名称上可以看出,这个算法分为两部分,标记和清除.首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象. 这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高:二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续,当分配大对象的时候,没有足够的空间时不得不提前触发一次垃圾回收. 复制算法这个算法将可用的内存空间分为大小相等的两块,每次只是用其中的一块,当这一块被用完的

JVM的垃圾回收算法

待完善... 1.引用计数算法 对象被引用,引用计数器加1. 当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1 优缺点 优点:引用计数收集器可以很快的执行,交织在程序运行中.对程序需要不被长时间打断的实时环境比较有利. 缺点:无法检测出循环引用.如父对象有一个对子对象的引用,子对象反过来引用父对象.这样,他们的引用计数永远不可能为0. 1 public class Abc_test { 2 3 public static void main(String[] args) { 4

03 JVM 从入门到实战 | 简述垃圾回收算法

引言 之前我们学习了 JVM 基本介绍 以及 什么样的对象需要被 GC ,今天就来学习一下 JVM 在判断出一个对象需要被 GC 会采用何种方式进行 GC.在学习 JVM 如何进行垃圾回收方法时,发现所谓的 JVM 垃圾回收思想和现实生活的场景有很多相似的地方.所以本文用餐厅回收餐桌的方式类比 JVM 垃圾回收算法,应该能帮助 JVM 学习的理解和记忆. 经典垃圾回收算 标记-清除(Mark-Sweep) 研发园开了家新餐厅,餐厅老板在考虑如何回收餐盘时首先使用了最简单的方式,那就是服务员在顾客

认识JVM(1)——对象分配&回收算法

本来标题党想写成<深入JVM>,不过不太敢写,我想一小篇博客我想还不足以说明JVM,在本文中,会就我所知给大家介绍JVM的很多内部知识,概念会相对较粗,因为太细的内容要写,这里肯定写不出来:本文主要偏重理论,没有什么实践,中间除一些官方资料外,还有部分自身的理解,所以请大家不要完全信任本文内容:另外本文会有一小部分纠正以前一篇文章对于intern()使用方法的错误,本文会在其中说明使用错误的原因,大致文章内容有以下几个部分: 1.JVM虚拟内存组成及操作系统地址表 2.新生成对象在HeapSi