Crates.io | gomicollector |
lib.rs | gomicollector |
version | 0.1.1 |
source | src |
created_at | 2023-02-03 16:20:32.248506 |
updated_at | 2023-02-03 16:39:44.836166 |
description | A simple mark-sweep garbage collector |
homepage | |
repository | https://github.com/speed1313/gomicollector |
max_upload_size | |
id | 775705 |
size | 18,534 |
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.
let mut heap = Heap::<String>::new(4);
let obj1_id = heap.allocate("Obj1".to_string());
heap.root_set.insert(obj1_id.unwrap());
let obj3_id = heap.allocate("Obj3".to_string());
heap.heap[obj1_id.unwrap()].set_head(obj3_id);
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: [],
}
allow allocated object to change its data, not via heap object.
simulate stack machine with gomicollector