编程语言虚拟机(三)

垃圾回收的时候还是有几个问题需要解决。

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的方法,虽然可能影响效率。

转载于:https://my.oschina.net/chunquedong/blog/751624

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值