本文主要用Swift
來模擬定義對(duì)象混埠、頭揍堰、域鹏浅、堆以及空閑鏈表,并實(shí)現(xiàn)標(biāo)記與清除兩個(gè)階段算法來幫助理解屏歹,簡單實(shí)現(xiàn)mark-sweep
算法思路隐砸,不包含對(duì)象分配過程。完整代碼見mark-sweep.swift
參考文章 推薦
頭信息定義
class HeaderInfo {
var name: String
var size: Int
var marked: Bool
init(_ name: String, size: Int) {
self.name = name
self.size = size
marked = false
}
}
對(duì)象定義
class Obj {
var head: HeaderInfo //頭信息
var field: Obj? //域
init(_ headInfo: HeaderInfo) {
head = headInfo
}
}
堆定義: 用來模擬內(nèi)存中堆狀態(tài)
class Heap {
var usedSize: Int = 0
var maxSize: Int
private var _objs: [Obj] = [] //記錄堆中對(duì)象
init(_ maxSize: Int) {
self.maxSize = maxSize
}
var objs: [Obj] {
get {return _objs}
}
func appendObj(_ obj: Obj) {
usedSize += obj.head.size
_objs.append(obj)
}
}
空閑鏈表定義:
class Node {
var next: Node?
var data: Obj?
}
標(biāo)記階段:
private func markPhase() {
for obj in roots {
mark(obj)
}
}
// 標(biāo)記對(duì)象
private func mark(_ obj: Obj) {
if obj.head.marked == false {
obj.head.marked = true
if let child = obj.field {
mark(child)
}
}
}
清除階段:
private func sweepPhase() {
for obj in heap.objs {
if obj.head.marked {
obj.head.marked = false
} else {
//非活動(dòng)對(duì)象加入到空閑列表
obj.head.name = "FreeChunk" //需要被重新分塊的對(duì)象
let freeNode = Node()
freeNode.data = obj
freeNode.next = freeList
freeList = freeNode
}
}
}