脚本宝典收集整理的这篇文章主要介绍了OpenJDK9 Hotspot 虚拟机内部对象内存管理,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
前言
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(); }
};
总结
以上是脚本宝典为你收集整理的OpenJDK9 Hotspot 虚拟机内部对象内存管理全部内容,希望文章能够帮你解决OpenJDK9 Hotspot 虚拟机内部对象内存管理所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。