gomicollector is a simple mark-sweep garbage collector in Rust.
gomicollector collects garbage when the heap is full.
Since pointer operation is difficult in Rust, I implemented a gomicollector by thinking of the heap as a vector of object and the pointer as the index of the vector.
Initialize a heap.
Rust
let mut heap = Heap::<String>::new(4);
Allocate an object to the heap. when you call heap.allocate(), gc collects garabage if the heap is full and return allocated memory address.
Rust
let obj1_id = heap.allocate("Obj1".to_string());
Set the root object to point to the obj1
Rust
heap.root_set.insert(obj1_id.unwrap());
Set the head of obj1 to point to obj3
Rust
let obj3_id = heap.allocate("Obj3".to_string());
heap.heap[obj1_id.unwrap()].set_head(obj3_id);
change the object data
Rust
heap.heap[obj1_id.unwrap()].set_data("changed data".to_string());
$ git clone https://github.com/speed1313/gomicollector.git
$ cd gomicollector
$ cargo run
mark and sweep
obj1 allocated Object { head: None, tail: None, marked: false, id: 3, data: Some("Obj1") }
tmp0 will be allocated
tmp1 will be allocated
tmp2 will be allocated
tmp3 will be allocated
mark and sweep
droped "tmp2"
droped "tmp1"
droped "tmp0"
obj2 allocated: Object { head: None, tail: None, marked: false, id: 1, data: Some("Obj2") }
tmp0 will be allocated
tmp1 will be allocated
mark and sweep
droped "tmp0"
droped "Obj2"
droped "tmp3"
tmp2 will be allocated
tmp3 will be allocated
mark and sweep
droped "tmp3"
droped "tmp2"
droped "tmp1"
obj3 allocated: Object { head: None, tail: None, marked: false, id: 2, data: Some("Obj3") }
tmp0 will be allocated
tmp1 will be allocated
tmp2 will be allocated
mark and sweep
droped "tmp1"
droped "tmp0"
tmp3 will be allocated
heap: Heap {
heap: [
Object {
head: None,
tail: None,
marked: false,
id: 0,
data: Some(
"tmp3",
),
},
Object {
head: None,
tail: None,
marked: false,
id: 1,
data: Some(
"tmp2",
),
},
Object {
head: None,
tail: None,
marked: true,
id: 2,
data: Some(
"Obj3",
),
},
Object {
head: Some(
2,
),
tail: None,
marked: true,
id: 3,
data: Some(
"changed data",
),
},
],
root: Some(
3,
),
size: 4,
free_list: [],
}