整理一份适合自已比较适合的gc文章
一、为什么要进行垃圾回收
内存是有限制的,不可能让你一直分配内存空间而不进行回收,否则会导致oom(内存溢出:应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。)
二、如何判断一个对象是否可以被回收
2.1、 引用计数算法
对每个对象保存了一个整型的引用计数器属性。用于记录对象被引用的情况。对于一个对象A,只要有任何一个对象引用了A,A的引用计数器就+1,当引用失效时其引用计数器就-1。当其引用计数器值为0时,即表示A不再被引用,可以回收。但其无法处理循环引用的问题,导致在jvm中没有使用这类算法。
循环引用即为几个变量的引用形成一个循环,造成变量一直在被引用不被回收从而造成内存泄露。
2.2、 可达性分析算法
以GC root作为起始点,从上至下的方式搜索这些对象是否可达,搜索走过的路径为引用链**,GC roots到对象不可达时,则证明此对象是不可用的。**
堆空间外的一些结构,比如虚拟机栈、本地方法栈、方法区、字符串常量池等地方对堆空间进行引用的