判断Java对象存活的算法

一、引用计数算法

给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用。这种算法虽然简单,但是有个致命的缺点,就是不能适用于相互引用的情况。

二、可达性分析算法

通过一系列称为"GC Roots"的对象作为起始点,从这些节点往下搜索,搜索走过的路径称为引用链(Reference Chain)。当一个对象不在任何引用链上的时候,就表示这个对象不可达,不可用了。

可作为GC Roots的对象包括:

1、虚拟机栈中引用的对象

2、方法区中静态变量和常量引用的对象

3、Native方法中引用的对象

一、标记清除算法

标记清除(mark-sweep)算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。先标记,再清除。

有2个缺点:

1、效率问题。标记和清除两个过程的效率都不高。

2、空间问题。标记清除后会产生大量不连续的内存碎片,碎片太多可能会导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集操作。

二、标记整理算法

标记整理算法和标记清除算法类似,不同的是,标记整理算法在标记完对象后,不是直接对可回收对象进行清除,而是先让所有存活的对象都往一端移动,然后再清除掉边界以外的内存。

相对于标记清除算法,标记整理算法解决了内存碎片的问题,但效率不高的问题依然存在。

三、复制算法

复制算法可以解决效率问题。它将可用内存分成大小相等的两块,每次只使用其中的一块,当这一块用完了,就将还存活着的对象复制到另一块上面,然后再把原来半块的对象全部清理掉。这样,每次都是对整个半区进行内存回收,内存分配时也不用考虑内存碎片的情况,按顺序分配即可。

复制算法的优点是效率高,没有内存碎片。但也有2个缺点:

1、浪费一半的内存空间。

2、在对象存活率较高的情况下,会有较多的复制操作,效率会变低。

四、分代收集算法

根据对象存活周期的不同,将内存分为几块,一般是把Java堆分为新生代和老年代,然后根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集都有大批对象死去,只有少量存活,就选用复制算法。而老年代对象存活率高,必须采用标记清除算法或者标记整理算法来回收内存。

新生代又可细分为一块较大的Eden空间和两块较小的Survivor空间(HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,即Eden空间占堆内存的80%,两个Survivor空间各占10%),每次只使用Eden空间和一块Survivor空间。对象优先在Eden空间分配内存,如果对象过大,则会分配到老年代空间。新生代回收时,会把Eden空间和Survivor空间中存活的对象复制到另一块Survivor空间,然后清理掉Eden空间和之前Survivor空间的对象。当然,如果在复制的时候,新的Survivor空间不够,则会把多出来的对象复制到老年代空间。同时,新生代中存活时间较长的对象也会进入老年代。

判断Java对象存活的算法、垃圾回收算法的更多相关文章

  1. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  2. Java对象的"后事处理"——垃圾回收(二)

    1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. ——< ...

  3. 判断Java对象死亡的两种常用算法

    当对象不馁引用的时候,这个对象就是死亡的,等待GC进行回收. 1.引用计数法 概念: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就增加1:当应用失效时,计数器值就减1:任何时刻计数器 ...

  4. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  5. Java虚拟机运行时数据区域及垃圾回收算法

    程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...

  6. JVM常见垃圾回收算法

    jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称 ...

  7. 谈谈JVM垃圾回收机制及垃圾回收算法

    一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制 ...

  8. JVM03——四种垃圾回收算法,你都了解了哪几种

    在之前的文章中,已经为各位带来了JVM的内存结构与堆内存的相关介绍,今天将为为各位详解JVM垃圾回收与算法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 如何确定垃圾 想要回收垃圾, ...

  9. C/C++中几种经典的垃圾回收算法

    1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1:当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明 ...

随机推荐

  1. eclipse code recommenders cannot download its model repository index

    Cent OS 7 运行 eclipse oxygen 代码提示出现标题所示的错误,解决办法,将网络提供程序设置为手动即可解决. Window->Preference->General-& ...

  2. 20191127 Spring Boot官方文档学习(4.11)

    4.11.使用NoSQL技术 Spring Data提供了其他项目来帮助您访问各种NoSQL技术,包括: Redis MongoDB Neo4J Solr Elasticsearch Cassandr ...

  3. 【Go语言】map在goroutine通信中的使用问题

    简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...

  4. 华南理工大学 “三七互娱杯” G HRY and tree

    https://ac.nowcoder.com/acm/contest/874/G 题目大意:对于一个连通图,现在定义两个点的贡献为连接两点的路径上最大的权值 求任意两个点贡献的和 这个题看懂花了我很 ...

  5. [Web 前端] 021 js 初识 Javascript

    1. Javascript 简介 1.1 定位 JS 是运行在浏览器端的脚本语言 1.1.1 关于浏览器 JS 由浏览器解释执行 JS 通常被直接嵌入 HTML 页面 1.1.2 关于脚本语言 JS ...

  6. 【Linux 源码】Linux源码比较重要的目录

    (1)arch arch是architecture的缩写.内核所支持的每一种CPU体系,该目录下都有对应的子目录. 每个CPU的子目录,又进一步分解为boot.mm.kernel等子目录,分别包含控制 ...

  7. SET ANSI_NULL ON 和 SET QUOTED_IDENTIFIFR ON

    本文转自:https://blog.csdn.net/qq112212qq/article/details/84578263 SET ANSI_NULL ON : 判断非空:where colunm ...

  8. CentOS7中MySQL跨机器数据迁移

    1.概况 在CentOS7环境下,使用命令方式将MySQL数据从源端主机迁移到目标端主机上. 2.迁移全部数据库 1)源端备份: [root@hadoop102 /]# mysqldump -u ro ...

  9. 各类最新Asp .Net Core 项目和示例源码

    1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...

  10. Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤分享

    启用 Mod_rewrite 模块:sudo a2enmod rewrite 另外,也可以通过将 /etc/apache2/mods-available/rewrite.load 连接到 /etc/a ...