前言

C++ 语言可以精确控制对象内存分配,出于性能考虑 C++ 框架 or 系统程序基本都会自己 "造轮子" 开发各种内存管理模块. hotspot 也不例外,它通过 new 和 delete 方法的访问级别以及重载 new 和 delete 方法来管理虚拟机内部 C++ 对象的内存.

内存管理相关的基类

hotspot 定义了几个基类来作为大部分 C++ 对象的基类:

  • StackObj

  • _ValueObj

  • MetaspaceObj

  • AllStatic

StackObj

StackObj 顾名思义,它们只能在 栈 上分配,StackObj 将 new 和 delete 运算符申明成 private 禁止外部访问,外部类尝试在堆上分配 StackObj 类型的对象都会编译期报错,内部在调用 new,delete 会抛出异常

// allocation.hpp

class StackObj ALLOCATION_SUPER_CLASS_SPEC {
 private:
  void* operator new(size_t size) throw();
  void* operator new [](size_t size) throw();
#ifdef __IBMCPP__
 public:
#endif
  void  operator delete(void* p);
  void  operator delete [](void* p);
};

_ValueObj

// allocation.hpp

class _ValueObj {
 private:
  void* operator new(size_t size) throw();
  void  operator delete(void* p);
  void* operator new [](size_t size) throw();
  void  operator delete [](void* p);
};

MetaspaceObj

MetaspaceObj 是所有在 meta space(元对象空间?)对象的基类,调用 delete 函数进行析构会抛出异常

// allocation.hpp

class MetaspaceObj {
    ...
    void* operator new(size_t size, ClassLoaderData* loader_data,
                       size_t word_size, bool read_only,
                       Type type, Thread* thread) throw();
                       // can't use TRAPS from this header file.
    void operator delete(void* p) { ShouldNotCallThis(); }
}

AllStatic

AllStatic 类及其子类的所有字段和方法都是 static 类型的,所以在 构造 和 析构 函数中直接抛出异常

// allocation.hpp

class AllStatic {
 public:
  AllStatic()  { ShouldNotCallThis(); }
  ~AllStatic() { ShouldNotCallThis(); }
};

总结


xingpingz
122 声望64 粉丝

博学,审问,慎思,明辨,力行