java编程思想 java的垃圾回收机制

1引用计数
要理解java中的垃圾回收,先了解其他系统中的垃圾回收机制会很有帮助,引用技术是一种简单但速度很慢的垃圾回收机制。每个对象都含有一个引用计数器,当有引用连接至对象时,引用技术+1,当引用离开作用域或被置为null时,引用计数-1。当发现某个对象的引用计数为0时释放其占用空间。此方法有个缺陷,如果对象之间存在循环引用,可能会出现对象应该被回收,但引用计数却不为0的情况。对垃圾回收器而言,定位这样的交互自引用的对象组所需工作量极大。引用计数似乎从未应用于任何一种java虚拟机实现中。
2停止复制
先暂停程序的运行(不属于后台回收模式),将当前所有存活的对象从当前堆赋值到另一个堆,没有被复制的全是垃圾。
由于是复制时回收,效率会降低。首先得有两个堆,然后得再这两个分离的堆之间来回倒腾,从而维护比实际需要多一倍的空间。
第二个问题在于程序在稳定状态时可能只会产生少量的垃圾,甚至没有垃圾。尽管如此,复制式回收器仍然会把所有内存从一处复制到另一处。
3标记-清扫
为了避免复制回收在垃圾很少时浪费资源的情况,一些java虚拟机会进行检查,要是没有新垃圾的产生,就切换到标记-清扫模式。思路时从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,每个存活的对象都会被设一个标记,当全部标记工作完成的时候,清理动作才会开始,在清理过程中,没有标记的对象将会释放,没有任何复制动作,所以接下来的空间时不连续的。

猜你喜欢

转载自blog.csdn.net/shine10076/article/details/83274770