创建网站的代码,南京网站建设公司哪家好,wap是什么意思啊,网站建设 常用字体目录 1 什么是垃圾2 为什么需要回收3 哪些对象被判定为垃圾呢3.1 引用计数法3.2 可达性分析算法#xff1a;GC Roots根 1 什么是垃圾
垃圾是指在运行程序中没有任何指针指向的对象#xff0c;就是需要被回收的。
2 为什么需要回收 执行程序会不断地分配内存空间#xff0c… 目录 1 什么是垃圾2 为什么需要回收3 哪些对象被判定为垃圾呢3.1 引用计数法3.2 可达性分析算法GC Roots根 1 什么是垃圾
垃圾是指在运行程序中没有任何指针指向的对象就是需要被回收的。
2 为什么需要回收 执行程序会不断地分配内存空间如果不进行回收内存迟早都会被消耗完。 除了释放没用的对象垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端以便JVM将整理出来的内存分配给新的对象
3 哪些对象被判定为垃圾呢
在堆空间和元空间中GC这条守护线程会对这些空间开展垃圾回收⼯作那么GC如何判断这些空间的对象是否是垃圾有两种算法引用计数法和可达性分析算法
3.1 引用计数法
每个对象有个引用计数器属性记录被引用的情况。对象被引⽤则计数器1如果计数器是0那么对象将被判定为是垃圾于是被回收。
这种算法实现简单判定效率高。但缺点是需要需要单独的字段存储计数器每次赋值都需要更新计数器增加了空间和时间的开销。缺最严重的是无法解决循环依赖问题。因此JVM⽬前的主流⼚商Hotspot没有使⽤这种算法。
注什么是循环依赖问题
如下图所示p引用了A对象A间接引用了CC又引用了A。方法执行完p不再需要引用A但A和C的引用没有消失引用计数器还都是1不会被回收。
3.2 可达性分析算法GC Roots根
该算法的基本思想就是 通过一系列被称为「GC Roots」的根对象作为起始节点集从这些节点开始通过引用关系向下搜寻搜寻走过的路径称为「引用链」如果某个对象到GC Roots没有任何引用链相连就说明该对象不可达即可以被回收。 哪些会被认定为GC Roots根呢
方法区静态属性引用的对象 全局对象的一种Class对象本身很难被回收回收的条件非常苛刻只要Class对象不被回收静态成员就不能被回收。方法区常量池引用的对象 也属于全局对象例如字符串常量池常量本身初始化后不会再改变因此作为GC Roots也是合理的。方法栈中栈帧局部变量表引用的对象 属于执行上下文中的对象线程在执行方法时会将方法打包成一个栈帧入栈执行方法里用到的局部变量会存放到栈帧的局部变量表中。只要方法还在运行还没出栈就意味这局部变量表的对象还会被访问GC就不应该回收所以这一类对象也可作为GC Roots。本地方法栈中引用的对象 和上一条本质相同无非是一个是Java方法栈中的变量引用一个是native方法(C、C)方法栈中的变量引用。被同步锁持有的对象 被synchronized锁住的对象也是绝对不能回收的当前有线程持有对象锁呢GC如果回收了对象锁不就失效了。
五种变量的位置如下 静态变量会在方法区中存一个引用市级指向堆内存局部变量表也是如此。 总结
可达性分析就是JVM首先枚举根节点找到一些为了保证程序能正常运行所必须要存活的对象然后以这些对象为根根据引用关系开始向下搜寻存在直接或间接引用链的对象就存活不存在引用链的对象就回收。
GC再扫描堆空间的某个节点时会向上遍历看看能不能遍历到gc roots根节点如果不能那么意味着这个对象是垃圾。
例如下图对象4、5、6都没有和GC Root根节点相连会被判定为垃圾回收。