垃圾回收的时候还是有几个问题需要解决。
Stop The World问题
之前为了简单期间直接用锁来代替。现在修改为在每个循环回跳的时候检查安全点,来暂停所有线程。
有个问题就是在遇到阻塞的时候,例如阻塞到网络IO操作,或者sleep等操作的时候需要特殊处理。在阻塞的期间虽然没有到达safe point,但还是需要允许垃圾回收。在退出阻塞的时候要立即检查safe point。
类型tag问题
在垃圾收集的时候需要扫描栈上的指针类型,来作为根对象。为此要知道栈上数据表示的类型,如果不是指针而是整形或者浮点型变量,就忽略掉。栈上的变量类型在字节码里面是有的,但是操作数栈上的值不值得类型,或者说操作数栈的值类型随时都是变化的。怎么判断操作数栈上的值是否为指针类型呢。例如:
union value {
int i;
double d;
void *p;
}
我们不知道value的类型,有一种简单的方法就是带一个类型tag,如下:
struct tagValue {
enum valueType {
vInt, vDouble, vPointer
} type;
union value {
int i;
double d;
void *p;
};
};
我看了Jamvm实现,它是使用猜测的方法,如果数值在堆上分配内存的范围内,且4字节对齐就认为是指针。但是考虑到将来可能会有内存整理的需求,如果只凭猜测的话,不敢进行指针重定向操作。所有还是采用的带类型tag的方法,虽然可能影响效率。