GC垃圾回收器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GC垃圾回收器相关的知识,希望对你有一定的参考价值。

在.NetFrameWork中有一个垃圾回收器,用于管理应用程序内存分配释放

想要了解垃圾回收机制,要先知道托管堆堆栈

堆栈和托管堆都在线程的虚拟内存中, 堆:顺序随意  栈:先进后出

值类型存储在堆栈上,引用类型都存储在托管堆中

在使用new关键字创建类的对象时,分配给对象的内存单元就位于托管堆中,此时对于这个类只是一个引用,而没有真正的把它拿过来

而每一次在使用new关键字创建类的对象时,运行库都从托管堆为该对象分配内存,只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间

但是,托管堆的空间并不是无限大的,最终,必须要执行回收来释放一些内存。

实例化新对象过程

技术分享

 

计算字段所需空间

对象所需空间:包括两部分,同步快索引和类型对象指针

分配物理内存,新对象指针对象指向下一个可用内存区域

垃圾回收过程:

技术分享

 

标记阶段:从根标记遍历到的对象

压缩阶段:释放没有标记的对象内存,调整存在对象的位置

 

 ,是CLR垃圾收集器的一种机制,它存在的唯一目的就是提高应用程序性能

CLR支持三代内存,第0代:256K  第1代:2M  第2代:10M

每次实例化对象时,都会在第0代添加对象,

当第0代对象放满之后,就会执行垃圾回收器,将第0代的无用资源释放掉,然后把第0代的剩余有效资源放置到第1代对象中

下一次实例化新对象时,依然会放置在第0代中

技术分享

 

知道第1代内存也满了之后,才会对第1代内存执行垃圾回收,释放无用内存,然后将第1代的剩余有效资源放置到第2代对象中

垃圾回收器时.NetFrameWork在托管堆内存满了之后自动执行的,当然,也可以手动执行,使用  

GC.Collection();  释放当前托管堆中的无用资源

 

以上是关于GC垃圾回收器的主要内容,如果未能解决你的问题,请参考以下文章

53.垃圾回收算法的实现原理启动Java垃圾回收Java垃圾回收过程垃圾回收中实例的终结对象什么时候符合垃圾回收的条件GC Scope 示例程序GC OutOfMemoryError的示例

一篇文章让你了解GC垃圾回收器

17_1_垃圾回收器_GC分类与性能指标概述SerialParNewParallelCMS面试

java中是怎样进行垃圾回收的?

jvm基础--GC垃圾回收机制

从垃圾回收GCDetails看JVM GC原理