首页 > 编程知识 正文

生活垃圾回收机制,js垃圾回收机制的理解

时间:2023-05-03 07:09:28 阅读:163861 作者:1491

在所有语言中,在运行期间都会创建许多对象,然后必须为这些对象分配内存地址。 如果不需要使用这些对象,则必须释放内存地址,以便新对象可以使用。 与对象存储器的释放相关的这个结构被称为垃圾回收机构(GC )。

在JVA中垃圾回收是自动化的,但是控制性差,内存容易溢出。 内存溢出是因为由JVM内存分配的对象太多,需要的内存超过JVM内存大小。 在Java中是自动的。 但是,程序员可以调用System.gc )来手动回收。 调用此方法会尝试释放被破坏对象占用的内存,但会附加免责声明,因为无法保证结果。 从如何确定应该回收的对象、何时回收、如何回收三个方面进行分析。

回收对象确定回收对象有引用计数法和可达性分析法两种算法。

引用计数法

对象将添加计数器,如果有新引用,则加1;如果引用无效,则减1。 但是,这种方法无法解决两个对象的循环引用问题。

可达性分析法

确定对象的引用链是否需要回收该对象。 从这些根节点开始以一系列GC Roots对象为起点向下搜索。 搜索通过的路径称为参考链(Reference Chain ),如果一个对象没有与GC Roots连接的参考链,则该对象将被证明不可用,并且必须回收该对象。

回收时间在CPU空闲时回收,堆内存已满时回收,调用System.gc ()进行回收。

回收方法标记-清除算法

首先标记需要回收的对象,然后回收; 缺点:回收速度慢,回收后产后出现大量不连续的内存碎片,后期运行中需要分配大对象时,找不到足够的连续内存,导致内存空间浪费。

复制算法

如果将内存空间平均分为两部分,一次只使用一个,将已满的仍有效的对象复制到另一个内存中,然后擦除原始区域,则不会出现内存碎片,但可用内存空间会减少一半。

标记-整理算法

不仅要整理需要回收的对象,还要整理有效对象,不会引起内存碎片。

分代收集算法

分代采集算法是一种比较智能的算法,也是目前JVM中使用最多的算法。 实际上并不是新算法,而是在具体场景中自动选择这三种算法进行垃圾对象的回收。

外向的大树一代:目的是回收生命周期短的对象,主要存储新产生的对象。 外向大树世代8:1:1划分为eden区、survivor0、survivor1,大部分对象在eden区生成,当eden填满时,将存活对象复制到survivor0 survivor0满时下一次清除eden,survivor0,在三个区域满前将库存对象复制到旧年代,旧年代也满时触发FullGC。 外向大树代的全部回收称为MinorGC,MinorGC的发生频率较高,不一定要到外向大树代满为止。

老年代:由于保存对象生命周期长,且内存约为外向大树世代的2倍,老年代生存对象生命周期长,MajorGC发生频率较低。

永久:主要存储Java类、方法等静态文件。 永久带对垃圾回收几乎没有影响,但是在应用反射、动态代理CGLib等bytecode框架等动态生成或调用的类时,需要永久保存由外向大树构成的类

总结:在外向的大树一代,每次垃圾收集都会有很多对象死亡,只有少量存活的情况下,选择复制算法。 只需要很少的幸存者复制成本就能完成收集。 在老一辈,由于对象生存率高,没有额外的空间,所以要给他分配保证,必须使用标记-清除或标记-整理。 由于持久性世代经常会出现内存不足或内存泄漏的情况,JDK1.8现在不再使用持久性世代,而是改为使用元区域(内存中直接存在可定制大小)主要存储类的元数据

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。