摘要:前言語言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮框架系統(tǒng)程序基本都會(huì)自己造輪子開發(fā)各種內(nèi)存管理模塊也不例外,它通過和方法的訪問級(jí)別以及重載和方法來管理虛擬機(jī)內(nèi)部對(duì)象的內(nèi)存內(nèi)存管理相關(guān)的基類定義了幾個(gè)基類來作為大部分對(duì)象的基類顧名思義,它們只能
前言
C++ 語言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮 C++ 框架 or 系統(tǒng)程序基本都會(huì)自己 "造輪子" 開發(fā)各種內(nèi)存管理模塊. hotspot 也不例外,它通過 new 和 delete 方法的訪問級(jí)別以及重載 new 和 delete 方法來管理虛擬機(jī)內(nèi)部 C++ 對(duì)象的內(nèi)存.
內(nèi)存管理相關(guān)的基類hotspot 定義了幾個(gè)基類來作為大部分 C++ 對(duì)象的基類:
StackObj
_ValueObj
MetaspaceObj
AllStatic
StackObjStackObj 顧名思義,它們只能在 棧 上分配,StackObj 將 new 和 delete 運(yùn)算符申明成 private 禁止外部訪問,外部類嘗試在堆上分配 StackObj 類型的對(duì)象都會(huì)編譯期報(bào)錯(cuò),內(nèi)部在調(diào)用 new,delete 會(huì)拋出異常
// 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(元對(duì)象空間?)對(duì)象的基類,調(diào)用 delete 函數(shù)進(jìn)行析構(gòu)會(huì)拋出異常
// 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 類型的,所以在 構(gòu)造 和 析構(gòu) 函數(shù)中直接拋出異常
// allocation.hpp class AllStatic { public: AllStatic() { ShouldNotCallThis(); } ~AllStatic() { ShouldNotCallThis(); } };總結(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69856.html
摘要:假設(shè)源代碼目錄為函數(shù)函數(shù)在,它處理完命令行參數(shù)后跳轉(zhuǎn)到函數(shù)處理命令行選項(xiàng)函數(shù)在,它調(diào)用加載這個(gè)就是編譯的產(chǎn)出在系統(tǒng)下在使用加載動(dòng)態(tài)庫并獲取函數(shù)入口地址在系統(tǒng)下在熟悉的同學(xué),對(duì)下面的代碼應(yīng)該會(huì)感到很親切創(chuàng)建對(duì)象,并將控制流跳轉(zhuǎn)到呵呵,在 假設(shè) openjdk 源代碼目錄為 jdk9dev main函數(shù) main 函數(shù)在 jdk9dev/jdk/src/java.base/share/na...
摘要:前言網(wǎng)上各路大神總結(jié)過各種關(guān)于內(nèi)部實(shí)現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒一次的底褲數(shù)據(jù)結(jié)構(gòu)在分析源代碼之前需要了解相關(guān)概念,比如等,參考網(wǎng)絡(luò)上各種解說或者之前系列文章,這里重點(diǎn)介紹一下,,每個(gè)在內(nèi)部都有一個(gè)的對(duì)象與之對(duì)應(yīng) 前言 網(wǎng)上各路大神總結(jié)過各種關(guān)于 hotspot jvm synchronized 內(nèi)部實(shí)現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒...
摘要:準(zhǔn)備工作假設(shè)源代碼目錄為編譯時(shí)啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機(jī)入口中設(shè)斷點(diǎn),然后在的方法中設(shè)置斷點(diǎn)通過宏獲取當(dāng)前,然后創(chuàng)建第個(gè)棧幀,然后進(jìn)入解釋執(zhí)行字節(jié)碼 準(zhǔn)備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時(shí)啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...
摘要:前言本文從類的方法的內(nèi)部實(shí)現(xiàn)入手,分析多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)類和原理類方法類的方法用于啟動(dòng)線程,方法內(nèi)部調(diào)用了方法在源代碼中搜索,可以看到對(duì)應(yīng)函數(shù)在源代碼中搜索函數(shù)核心代碼計(jì)算線程堆棧大小創(chuàng)建對(duì)象初始化啟動(dòng)線程在創(chuàng)建時(shí)傳入了一個(gè)函數(shù)指針, 前言 本文從 Java Thread 類的 start 方法的內(nèi)部實(shí)現(xiàn)入手,分析 Hotspot JVM 多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類)和原理 Threa...
摘要:拆解虛擬機(jī)的基本步聚如下首先,要等待到自身成為唯一一個(gè)正在運(yùn)行的非守護(hù)線程時(shí),在整個(gè)等待過程中,虛擬機(jī)仍舊是可工作的。將相應(yīng)的事件發(fā)送給,禁用,并終止信號(hào)線程。 本文簡(jiǎn)單介紹HotSpot虛擬機(jī)運(yùn)行時(shí)子系統(tǒng),內(nèi)容來自不同的版本,因此可能會(huì)與最新版本之間(當(dāng)前為JDK12)存在一些誤差。 1.命令行參數(shù)處理HotSpot虛擬機(jī)中有大量的可影響性能的命令行屬性,可根據(jù)他們的消費(fèi)者進(jìn)行簡(jiǎn)...
閱讀 3335·2021-11-19 11:36
閱讀 2940·2021-09-27 13:34
閱讀 2001·2021-09-22 15:17
閱讀 2409·2019-08-30 13:49
閱讀 764·2019-08-26 13:58
閱讀 1364·2019-08-26 10:47
閱讀 2543·2019-08-23 18:05
閱讀 605·2019-08-23 14:25