前言
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(); }
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。