#heap #vm #garbage-collection #automatic #gc

managed-heap

受JVM等虚拟机启发的虚拟堆实现。目前支持自动垃圾回收,但不支持碎片整理

6个版本

0.1.5 2018年12月29日
0.1.4 2018年12月23日

#667 in 内存管理

26每月下载量

MIT许可协议

43KB
1K SLoC

Build Status

Managed Heap

受JVM等虚拟机启发的虚拟堆实现。目前支持自动垃圾回收,但不支持碎片整理。

用法

由于该crate仍在开发中,没有文档。您可以通过查看src/managed.rs中的测试模块来获取示例。


lib.rs:

受JVM等虚拟机启发的虚拟堆实现。您可以在Rust中创建自己的虚拟机时使用它。

要使用它,您必须实现跟踪模块中的特性。

示例

extern crate managed_heap;

use managed_heap::managed::*;
use managed_heap::trace::*;
use managed_heap::address::*;

struct MockGcRoot {
    used_elems: Vec<IntegerObject>,
}

impl MockGcRoot {
    pub fn new(used_elems: Vec<IntegerObject>) -> Self {
        MockGcRoot { used_elems }
    }

    pub fn clear(&mut self) {
        self.used_elems.clear();
    }
}

unsafe impl GcRoot<IntegerObject> for MockGcRoot {
    fn children<'a>(&'a mut self) -> Box<Iterator<Item = &'a mut IntegerObject> + 'a> {
        Box::new(self.used_elems.iter_mut())
    }
}

#[derive(Debug)]
struct IntegerObject(Address);

impl IntegerObject {
    pub fn new(heap: &mut ManagedHeap, value: isize) -> Self {
        // reserve one usize for mark byte
        let mut address = heap.alloc(2).unwrap();

        address.write(false as usize);
        (address + 1).write(value as usize);

        IntegerObject(address)
    }

    pub fn get(&self) -> isize {
        *(self.0 + 1) as isize
    }
}

impl From<Address> for IntegerObject {
    fn from(address: Address) -> Self {
        IntegerObject(address)
    }
}

impl Into<Address> for IntegerObject {
    fn into(self) -> Address {
        self.0
    }
}

unsafe impl Traceable for IntegerObject {
    fn mark(&mut self) {
        self.0.write(true as usize);
    }

    fn unmark(&mut self) {
        self.0.write(false as usize);
    }

    fn is_marked(&self) -> bool {
        (*self.0) != 0
    }
}

let mut heap = ManagedHeap::new(100);
let mut i = IntegerObject::new(&mut heap, -42);

assert_eq!(-42, i.get());
assert_eq!(false, i.is_marked());

i.mark();
assert_eq!(true, i.is_marked());

无运行时依赖