判断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. Vue中使用JSX语法

    一 项目结构 二 App组件 <template> <div id="app"> <fruit/> </div> </temp ...

  2. 【python+selenium自动化】设置Chrome启动参数

    起因:直接用selenium的webdriver启动chrome,会弹出“Chrome正在受到自动软件的控制”,并且窗口较小,是因为chrome没有加载任何配置 解决:点进selenium的Chrom ...

  3. 深入分析微博密码加密and百万级数据采集分享(登录篇)

    一.前言 此文章主要是对微博微博关键词的检索结果进行采集,但是微博的采集需要登陆,所以此程序分为登陆程序和爬虫程序两部分: 微博要实现规模性数据采集自然少不了大量账号,这就需购买大量账号以及批量登陆, ...

  4. [转帖]Twitter 宣布抛弃 Mesos,全面转向 Kubernetes

    Twitter 宣布抛弃 Mesos,全面转向 Kubernetes http://www.itpub.net/2019/05/06/1788/ 事实标准了.   作者 | 阿里云智能高级技术专家 张 ...

  5. Java - PhantomJS + EChartsConvert实现ECharts图片保存到服务端

    1.所需工具 1>phantomjs:官网下载http://phantomjs.org/download.html 国内镜像http://npm.taobao.org/dist/phantomj ...

  6. Java - Java Mail邮件开发(3)spring +Java Mail + Velocity

    1.spring + Java Mail + Velocity 项目结构: 注意:用户包中引入各包的顺序问题.如velocity-2.1. beans.xml <?xml version=&qu ...

  7. 洛谷 P5663 加工零件 & [NOIP2019普及组] (奇偶最短路)

    传送门 解题思路 很容易想到用最短路来解决这一道问题(题解法),因为两个点之间可以互相无限走,所以如果到某个点的最短路是x,那么x+2,x+4也一定能够达到. 但是如何保证这是正确的呢?比如说到某个点 ...

  8. RabbitMq学习3-工作队列(Work queues)

    工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源.时间的操作.当我们把任务(Task)当作消息发送到队列中,一个运行在后台的工作者(worker)进程就会取出任务然后 ...

  9. 打印Java main参数

    public class Main { public static void main(String args[]){ System.out.println("打印main方法中的输入参数, ...

  10. Consul服务发现在windows下简单使用

    目录 基本介绍: 服务连接: 客户端: 系列章节: 回到顶部 基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent ...