• 关于垃圾回收的一些基本原理及技术解析


    关于垃圾回收的一些基本原理及技术解析

    什么是垃圾,为什么要垃圾回收?

      垃圾回收是很大一块,在java虚拟机一些资料描述中,jvm大致干三件大事儿,1>加载class 2>分配存储空间 3>执行垃圾回收;可见垃圾回收在高级语言中所占的分量。(不好意思,扯远了~),简单点儿说就是:在程序运行时刻,产生的一直未能删除的或不能被引用的对象数据称之为垃圾,如果一直未能通过有效的方式回收会导致内存泄露(通俗点就是内存撑爆了).

    关于人工回收的一些问题:

      在C或C++语言中,程序员可显示地安排数据回收,当然在理想的情况下 任何不会再被访问的的存储都应该会被删除,同样,任何可能还会被引用的存储对象都不能被删除。但事实上,由于本身的回收困难之处以外还存在不少技术难点。简单点儿说就是 A>如果一直未能删除不能被引用的内存数据会使0内存占用过大,导致内存泄露 B>如果程序引用了一个已经被删除(回收的)的数据 会导致空指针引用

    垃圾回收的一般要求:
      基本要求是类型安全,但不是所有语言都适合进行自动垃圾回收。为了使垃圾回收器正常工作,它必须知道给定的数据元素或元素的分量(是否或可用作)一个指向某块已分配存储空间的指针。但是数据元素或分量在一些高级语言中又是类型不安全的,比如在C或C++中可以对存储地址进行任意操作。

    垃圾回收的性能代价:
      A>运行时间:      垃圾回收的速度可能较慢,容易增加一个应用程序的总运行时间

      B>存储空间使用  需要避免内存碎片,极大地利用可用内存空间

      C>停顿时间    垃圾回收过程会在没有任何预警的情况下突然启动,导致应用程序突然停顿,所以缩小停顿时间很重要

      D>程序局部性   由于垃圾回收控制了数据的放置,因此影响了将要执行的代码的数据局部性。此时需要通过释放或复用空间改善时间局部性,通过重新放置移动一起使用的数据改善空间局部性

    垃圾回收的一般方法:
      垃圾回收分为:A>基于引用计数的垃圾回收 B>基于跟踪的垃圾回收 C>短停顿式垃圾回收

        引用式的垃圾回收:

          概述:对应每个对象都维护一个对象的引用计数,当计数为0的时候,该对象会被确认为垃圾随即被删除。

          缺点:它不能回收不可达的循环数据结构,因为每次引用赋值都会增加一个额外运算,遂开销比较大。

        跟踪的垃圾回收:

          概述:标记所有可达对象并移入空闲列表,然后清扫整个堆区,此类型的垃圾回收会周期地(空闲空间耗尽或空闲空间低于某个阀值时)运行

          缺点:很难找到堆区的不可达对象,导致清扫的代价较大,清扫时程序会全面停顿

           短停顿式垃圾回收:

          概述:每次只做部分垃圾回收工作,从而减少一次停顿的长度,按时间(增量式回收)或空间(部分式回收)分割回收任务

          缺点:增量式垃圾回收在回收之后会留下漂浮垃圾,部分式垃圾回收会造成停顿较长或回收无效垃圾

    原创博客,转载请注明出处:http://cnblogs.com/funnyzpc

  • 相关阅读:
    CUDA教程三、cuda的随机数生成
    python 使用element tree 解析 xml
    [转载] Shell正则表达式大全
    git 更新项目中子模块的版本
    git 切换到本地不存在但远端存在的分支
    vue.js3:在css中使用变量(vue@3.2.6)
    mybatis做update:动态传入要更新的字段名和字段值(mybatis 3.5.7)
    npm全局安装和非全局安装的区别(node v16.13.1 / npm 8.4.1)
    vue.js3:用mitt发送接收事件消息(vue@3.2.6 / mitt@3.0.0)
    vue3: 动态修改favicon(网站的ico 图标)(vue@3.2.26)
  • 原文地址:https://www.cnblogs.com/funnyzpc/p/7225999.html
Copyright © 2020-2023  润新知