Java垃圾回收器如何工作

    java对于对象内存的分配都是在堆中进行的,而堆中分配内存的代价要高于在堆栈中分配内存。但是在Thinking in Java 中提到某些java虚拟机对于堆内存的分配甚至要快于其它语言在堆栈中分配内存(自己没验证过。。。)。这是因为在某些java虚拟机中,堆内存的分配有点类似于传送带,每分配一个对象,传送带向前进一步,这样可以避免查找对象内存这样的“大”操作。但是,如果单纯的只这样进行分配,就有可能进行频繁的内存分页调度。为了解决这样的问题,有的JVM(java虚拟机)的垃圾回收器介入了进来,清理内存中的垃圾,并且紧缩内存空间,这样可以保证java以“传送带”的方式快速的进行内存的分配。垃圾回收器的工作模式有下面两种:

    1.stop-and-copy模式

    这种模式的基本工作思路是垃圾回收时先暂停当前程序的运行,根据一定的方法确定出还“存活”的对象,然后将存活的对象从一个堆复制到另外一个堆,新复制的对象在另一个堆中一个接一个的排列着。这样就可以按上面的“传送带”的方式分配内存了。但是,这样也存在的效率的问题。垃圾回收器把复制对象需要两个堆,这样就比原来要耗费两倍以上的内存。为了解决这个问题,我们可以在一个堆中分出两个较大的内存块,在两个内存块之间进行复制。可是程序稳定运行的时候,往往很少产生垃圾,如果一味的采用stop-and-copy模式的话,反而会影响速度。这就产生了第二种模式。

    2.mark-and-sweep模式

    一般JVM检测到程序很少产生垃圾之后就会采用第二种模式,它的思想是先标记内存中“存活”的对象,但是不进行清理。直到所有的内存都标记完之后,才进行清理操作(不进行复制操作)。这时内存中的对象是分散的,还得进行内存的紧缩。在垃圾很少产生时,这种模式效率更好。貌似这种模式运行时也会暂时中断程序的运行。

    JVM垃圾回收器的特点就如Thinking in Java所说,是“自适应(会自己调整模式)、分代(不同JVM很可能不一样)、stop-and-copy、mark-and-sweep”

(上面的这几种模式,在不同的虚拟机中可能会不一样。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值