zoukankan      html  css  js  c++  java
  • 垃圾回收与算法

    垃圾回收与算法

    一、垃圾回收机制

    1.1、引用计数法

      在java中引用和对象是有关联的。如果要操作对象必须用引用进行。因此。很简单的办法是通过引用计数来判断一个对象是否可以回收。即一个对象如果没有任何与之关联的引用,即他们的引用计数都为0,则说明对象没有被引用,即不可达对象,就是可回收对象

      引用计数存在循环引用的问题,写一个类,创建两个对象,

    MyObject myObject1 = new MyObject();
    MyObject myObject2 = new MyObject();
    myObject1、myObject2分别记录了对象的地址,所以对象被创建出来,引用计数就是1,再让他们互为引用,那么这两个对象的引用计数都是2,他们就无法被回收。

    1.2、可达性分析

      为了解决引用计数的循环引用问题,java使用了可达性分析的方法。通过一系列的“GC ROOT”对象作为起点搜索。如果在“GC ROOT”和一个对象之间没有可达路径,则称该对象是不可达的。

       GC ROOT:VM栈中的引用、方法区中的静态引用、JNI(本地方法调用,与其他语言的通信)中的引用

    二、垃圾回收算法

    标记清楚、复制、标记整理、分代收集

    标记清除:

      最基础的清除算法,先扫描一轮,标记出需要清除的数据,第二轮,清除掉标记的数据,这种方法,会造成碎片化,后续大的对象可能找不到地方存储。

    复制算法:

      始终有一块空白空间,是用来存储复制过来的所有的存活的对象。然后将其余空间的对象全部清除就好了,这种算法简单方便,而且不会有碎片化,但是可用内存被压缩了,而且对象增多的话,复制效率会下降。

    标记整理:

      标记后,不清理对象,而是将存活对象移向内存的一端,然后清除端边界外的对象,也就是存活对象和可回收对象,进行位置的替换和移动,直到存活对象被整理到最左端,然后再清除掉存活对象边界以外的可回收对象。

    分代收集算法

      即新生代使用复制算法,老年代使用标记整理算法

  • 相关阅读:
    这是一篇通过open live writer发布的博文
    网卡重启失败
    2020年1月目标
    二、安装docker
    JS中的数据类型,包含ES6,set和map等等
    关于prototype和__proto__,最好的一些解释
    JS中call,apply和bind方法的区别和使用场景
    ThinkPHP5生成word文档代码库
    js/jquery操作iframe
    PHP技术--思维导图
  • 原文地址:https://www.cnblogs.com/gushiye/p/13945101.html
Copyright © 2011-2022 走看看