用对象的情况,只需要按照“引用
—
>
对象
—
>
引用
…
”的方式一直找
下去即可完成对所有对象的跟踪。这样完成了对“垃圾”的查找。
2.2.3GC
方式
完成对“垃圾”的查找,如何对“垃圾进行清理”?垃圾清理之前,
程序需要被迫暂停,
因为
gc
不仅仅完成的是对
heap
中无用对象的清
理,同时也对对象的存储进行了整理。
2.2.3.1
垃圾清理首先采用的方式是“停止——复制”方法:
将堆中所有的“活对象”复制到另外一个堆中,原有的堆内所有对象
即可全部释放。对象被复制到另外的堆中,并且进行紧凑的排列,这
样程序在创建新对象时依赖对指针查找空闲空间即可。但是这样的
“停止——复制”
方式带来一个问题,
需要额外的多分配一倍的空间,
而且来回的在内存页中切换复制需要耗费时间,有的
JVM
采用的解
决方法是给堆分配几块大的内存页,
这样复制只需要在少数的几个内
存页中进行。
2.2.3.2
“标记——清扫”方法:
可以看出,
“停止——复制”的处理办法其实完成的是将活对象复制
保留,将整个堆内所有对象释放(无论对象是否被引用)
,然而对于
垃圾较少的情况下这种方式很浪费。
“标记——清扫”方法适用在程
序执行稳定垃圾较少的情况下,比如在完成“停止——复制”之后,