java回收机制的原理是什么?
展开全部
垃圾回收是java与c/c++的最大不同。有了jvm的自动垃圾收集机制,就可以让程序员专注于程序逻辑开发,而不是花费大量的时间是考虑变量应该在什么时候去释放。
首先我们要知道要,jvm是如何判断一个对象已经变成了”垃圾“的呢?
一般用的是两个方法:
1)引用记数法:
为每个对象保存一个引用的数量,每增加一个引用这个值就加1,每减少一个引用就减1.如果这个记数变为0了,就说明这个对象已经不再被使用了。那么jvm就认为这个对象是可以回收的了。
但是这个方法有一个缺点,就是无法解决循环引用的问题。A引用B,B也引用A,如果A,B两个对象都不再被使用了,那么这两个对象其实都是可以被回收的,但是他们的引用记数不为0.所以用这个办法就没有办法回收了。
2)根搜索算法:
从一系列的”GC Roots“对象开始向下搜索,搜索走过的路径称为引用链。当一个对象到”GC Roots“之间没有引用链时,被称为引用不可达。引用不可到的对象被认为是可回收的对象。
java中可以当做为”GC Roots“对象的包括:
1:jvm虚拟机栈(栈帧中的局部变量表)中引用的对象
2:方法区中的类静态属性引用的对象
3:常量池中的常量引用的对象
4:本地方法栈JNI(native方法)中的引用的对象
首先我们要知道要,jvm是如何判断一个对象已经变成了”垃圾“的呢?
一般用的是两个方法:
1)引用记数法:
为每个对象保存一个引用的数量,每增加一个引用这个值就加1,每减少一个引用就减1.如果这个记数变为0了,就说明这个对象已经不再被使用了。那么jvm就认为这个对象是可以回收的了。
但是这个方法有一个缺点,就是无法解决循环引用的问题。A引用B,B也引用A,如果A,B两个对象都不再被使用了,那么这两个对象其实都是可以被回收的,但是他们的引用记数不为0.所以用这个办法就没有办法回收了。
2)根搜索算法:
从一系列的”GC Roots“对象开始向下搜索,搜索走过的路径称为引用链。当一个对象到”GC Roots“之间没有引用链时,被称为引用不可达。引用不可到的对象被认为是可回收的对象。
java中可以当做为”GC Roots“对象的包括:
1:jvm虚拟机栈(栈帧中的局部变量表)中引用的对象
2:方法区中的类静态属性引用的对象
3:常量池中的常量引用的对象
4:本地方法栈JNI(native方法)中的引用的对象
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询