摘要:前言语言可以精确控制对象内存分配,出于性能考虑框架系统程序基本都会自己造轮子开发各种内存管理模块也不例外,它通过和方法的访问级别以及重载和方法来管理虚拟机内部对象的内存内存管理相关的基类定义了几个基类来作为大部分对象的基类顾名思义,它们只能
前言
C++ 语言可以精确控制对象内存分配,出于性能考虑 C++ 框架 or 系统程序基本都会自己 "造轮子" 开发各种内存管理模块. hotspot 也不例外,它通过 new 和 delete 方法的访问级别以及重载 new 和 delete 方法来管理虚拟机内部 C++ 对象的内存.
内存管理相关的基类hotspot 定义了几个基类来作为大部分 C++ 对象的基类:
StackObj
_ValueObj
MetaspaceObj
AllStatic
StackObjStackObj 顾名思义,它们只能在 栈 上分配,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(); } };总结
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69856.html
摘要:假设源代码目录为函数函数在,它处理完命令行参数后跳转到函数处理命令行选项函数在,它调用加载这个就是编译的产出在系统下在使用加载动态库并获取函数入口地址在系统下在熟悉的同学,对下面的代码应该会感到很亲切创建对象,并将控制流跳转到呵呵,在 假设 openjdk 源代码目录为 jdk9dev main函数 main 函数在 jdk9dev/jdk/src/java.base/share/na...
摘要:前言网上各路大神总结过各种关于内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒一次的底裤数据结构在分析源代码之前需要了解相关概念,比如等,参考网络上各种解说或者之前系列文章,这里重点介绍一下,,每个在内部都有一个的对象与之对应 前言 网上各路大神总结过各种关于 hotspot jvm synchronized 内部实现,看别人的文章总觉得不过瘾,所以有了这篇文章,尝试再扒...
摘要:准备工作假设源代码目录为编译时启用了解释器参考编译和调试调用栈先在函数参考虚拟机入口中设断点,然后在的方法中设置断点通过宏获取当前,然后创建第个栈帧,然后进入解释执行字节码 准备工作 假设 openjdk 源代码目录为 jdk9dev 编译 openjdk 时启用了 zero 解释器(参考 OpenJDK9 Hotspot Mac OSX 编译和调试) 调用栈 先在 JavaMai...
摘要:前言本文从类的方法的内部实现入手,分析多线程相关的数据结构类和原理类方法类的方法用于启动线程,方法内部调用了方法在源代码中搜索,可以看到对应函数在源代码中搜索函数核心代码计算线程堆栈大小创建对象初始化启动线程在创建时传入了一个函数指针, 前言 本文从 Java Thread 类的 start 方法的内部实现入手,分析 Hotspot JVM 多线程相关的数据结构(类)和原理 Threa...
摘要:拆解虚拟机的基本步聚如下首先,要等待到自身成为唯一一个正在运行的非守护线程时,在整个等待过程中,虚拟机仍旧是可工作的。将相应的事件发送给,禁用,并终止信号线程。 本文简单介绍HotSpot虚拟机运行时子系统,内容来自不同的版本,因此可能会与最新版本之间(当前为JDK12)存在一些误差。 1.命令行参数处理HotSpot虚拟机中有大量的可影响性能的命令行属性,可根据他们的消费者进行简...
阅读 3303·2021-11-19 11:36
阅读 2897·2021-09-27 13:34
阅读 1942·2021-09-22 15:17
阅读 2373·2019-08-30 13:49
阅读 660·2019-08-26 13:58
阅读 1296·2019-08-26 10:47
阅读 2442·2019-08-23 18:05
阅读 583·2019-08-23 14:25