我是靠谱客的博主 整齐春天,最近开发中收集的这篇文章主要介绍Java GC工作机制 //TODO,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

感谢 千古壹号 公众号的分享

以下为自己看了这篇文章后的整理记录,方便记忆及复习。

GC的概念

GC:Garbage Collections 字面意思是垃圾回收器,释放垃圾占用的空间。让创建的对象不需要像c、c++那样需要程序员手动的delete、free掉 。对于c、c++的开发人员来说内存是开发人员分配的,也就是说还要对内存进行维护和释放。对于Java程序员来说,一个对象的内存分配是在虚拟机的自动内存分配机制的帮助下完成的,而对于在虚拟机中不再需要的对象,Java也有一套专门回收内存的垃圾处理机制,这就是GC(垃圾收集器)

引用计数器算法

引用计数器算法是垃圾收集器中的早期策略。其核心思想是给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;
当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

在这种方法中,堆中每个对象实例都有一个引用计数。当一个对象被创建时,就将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。

引用计数算法的实现简单,判定效率也高,大部分情况下是一个不错的算法。但是,主流的java虚拟机并没有选用引用计数算法来管理内存,其中最主要的原因是:它很难解决对象之间相互循环引用的问题。

比如下面的代码就会造成循环引用,从而不能被GC回收:

Object objectA = new Object();
Object objectB = new Object();
objectA.field = objectB;
objectB.field = objectA;

根搜索算法

因为引用计数器算法存在重大缺陷,所以JVM一般会采用一种新的算法,叫做根搜索算法。

它的处理方式就是,设立若干种根对象(GC roots),当任何一个根对象到某一个对象均不可达(即不再GC roots的引用链内)时,则认为这个对象是可以被回收的。

在java中,以下对象可以被称作GC roots对象:

1、栈(栈帧中的本地变量表)中引用的对象。
2、方法区中的静态成员。
3、方法区中的常量引用的对象(全局变量)
4、本地方法栈中JNI(一般说的Native方法)引用的对象。

其中:第一和第四种都是指的方法的本地变量表,第三种主要指的是声明为final的常量值。

在根搜索算法的基础上,又拓展了三种算法,他们分别是标记-清除复制标记-整理

标记-清除
复制
标记-整理

分代收集算法(存活时间短的新生代,和存活时间长的老生代)

最后

以上就是整齐春天为你收集整理的Java GC工作机制 //TODO的全部内容,希望文章能够帮你解决Java GC工作机制 //TODO所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部