Java 垃圾回收器1

垃圾回收器的工作原理1

「首先明确java垃圾回收器的目的(或是作用):不仅仅是释放存储空间,同时提高对象在堆上的分配效率」


其它系统的垃圾回收机制

“引用计数”
    这是一种简单但速度很慢的垃圾回收技术。每个对象都有一个引用计数器,当有引用连接至对象时,引用计数器加一;当引用离开作用域或是被置为null时,引用计数器减一。垃圾回收器在含有所有对象的列表上遍历,当发现引用计数器为零的的对象时,就释放它所占用的空间。
    ps:这种方式还有一个问题,就是当对象之间存在循环引用的现象时,就会出现“对象应该被回收,但其引用计数却不为零”。虽然有方法可以定位这样相互引用的对象,但开销极大。

java 的垃圾回收机制

“停止—复制”
    将当前所有对象从旧堆剪切到新堆,没有被复制的全都是垃圾。而且,但对象被复制到新堆时,它们是“一个挨着一个”的,即新堆保持紧凑排列,所以新的堆就可以简单快速的非配空间了。
    这种方式有两个弊端:其一,在两个堆间来回倒腾,会使得对内存空间的消耗其实是实际需求的两倍开外;其二,程序在“稳定状态”时,即只产生少量垃圾的时候,这种回收方式还是将所有内容从一处复制到另一处,这很浪费。
    「优化」在java虚拟机中内存被非配以较大的“块”为单位。某些较大的对象,会占用单独的块。每个块都用相应的代数来记录它是否还存活。通常,如果块被某处引用,其代数加一。这之后,垃圾回收器在回收时就可以往废弃的块中拷贝对象了。
“标记—清扫”
    遍历所有的引用,进而找出所有存货的对象,每当找到一个存活的对象,就会给对象设置一个标记,这个过程不清理任何对象。只有在标记工作结束后,才会将没有被标记的对象进行释放。
    所以,剩下的堆空间是不连续的。
java 采取的“自适应”技术
  java虚拟机会进行监视, 所有对象都很稳定的时候会切换到“标记—清扫”模式;要是对象创建销毁不稳定或是堆空间出现很多碎片,就会切回“停止—复制”模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值