国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Hotspot源碼解析-第十九章-ClassLoaderData、符號表、字符串表的初始化

這篇具有很好參考價值的文章主要介紹了Hotspot源碼解析-第十九章-ClassLoaderData、符號表、字符串表的初始化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

第十九章-ClassLoaderData初始化

講解本章先從一張圖開始
Hotspot源碼解析-第十九章-ClassLoaderData、符號表、字符串表的初始化,Java虛擬機,java

眾所周知,Java類的相關(guān)信息都是存儲在元空間中的,但是是怎么存儲的,相信很多讀者是不清楚的,這里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData(簡稱CLD)和Klass的概念及他們四者的關(guān)系,這里簡單描述下他們的概念,具體細(xì)節(jié)放到類加載器那一張來講解。

InstanceKlass(繼承自Klass):每個被加載的類在虛擬機中的表示為一個InstanceKlass

ClassLoaderData:類加載器加載類后,存儲數(shù)據(jù)的對象,也就是說被加載的類最終都存儲在ClassLoaderData指向的地方,一個CLD可以存入很多被加載的類InstanceKlass,多個InstanceKlass之間通過鏈表形式存儲,且鏈表頭永遠(yuǎn)是最新加載的類

ClassLoader:類加載器,每個ClassLoader都有一個CLD

ClassLoaderDataGraph:這是CLD的總?cè)肟?,把所有CLD通過鏈表管理起來

19.1 根加載器CLD的創(chuàng)建

19.1.1 universe.cpp

19.1.1.1 ClassLoaderData::init_null_class_loader_data
static void init_null_class_loader_data() {
    // 驗證重復(fù)初始化
    assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
    assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");

    // 創(chuàng)建ClassLoaderData對象,第一個加載器的參數(shù)是NULL,因為在Java中,沒有對根加載器的實現(xiàn),這個是由虛擬機自身來實現(xiàn)加載的,所以相對Java,這是一個NULL,實現(xiàn)看`章節(jié)19.1.2`
    _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false, Dependencies());
    // 創(chuàng)建完后,賦值給ClassLoaderDataGraph::_head,表示第一個CLD
    ClassLoaderDataGraph::_head = _the_null_class_loader_data;
    assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
    if (DumpSharedSpaces) { // 不涉及多Java進程共享,這一步不會走
      _the_null_class_loader_data->initialize_shared_metaspaces();
    }
  }

19.1.2 classLoaderData.cpp

19.1.2.1 ClassLoaderData構(gòu)造函數(shù)

發(fā)現(xiàn)這個構(gòu)造函數(shù),啥也沒做,就是對字段賦初始值

ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
  _class_loader(h_class_loader()),
  _is_anonymous(is_anonymous),
  // An anonymous class loader data doesn't have anything to keep
  // it from being unloaded during parsing of the anonymous class.
  // The null-class-loader should always be kept alive.
  _keep_alive(is_anonymous || h_class_loader.is_null()),
  _metaspace(NULL), _unloading(false), _klasses(NULL),
  _claimed(0), _jmethod_ids(NULL), _handles(), _deallocate_list(NULL),
  _next(NULL), _dependencies(dependencies),
  _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {

  JFR_ONLY(INIT_ID(this);)
}

19.2 符號表和字符串表

先了解下什么是符號表,什么是字符串表?

SymbolTable(符號表):符號是指字節(jié)碼中產(chǎn)生的各種元數(shù)據(jù)的utf-8字符表示,所以符號表就是用來存放這些utf-8字符的

StringTable(字符串表):就是存放Java中String對象的,把StringTable表中的數(shù)據(jù)都可以想像成與Java中String對應(yīng)

先這么理解吧,在類加載器那一章節(jié)會更細(xì)致的講這兩個概念。

以下是函數(shù)的部分內(nèi)容,該函數(shù)是universe.cpp->universe_init()

// 創(chuàng)建符號表,把它想像成java里的HashMap
SymbolTable::create_table();
// 創(chuàng)建字符串表,把它想像成java里的HashMap
StringTable::create_table();
// 創(chuàng)建包信息表,也可以想像成一個HashMap,包信息用到的時候再講
ClassLoader::create_package_info_table();

SymbolTable類的定義:
	// 模板類,key為Symbol,value為mtSymbol
    class SymbolTable : public RehashableHashtable<Symbol*, mtSymbol> 
StringTable類的定義:
    // 模板類,key為oop,value為mtSymbol
    class StringTable : public RehashableHashtable<oop, mtSymbol> 
        
SymbolTable:key是Symbol,Symbol可以理解為utf8編碼的字符信息
SymbolTable:value是mtSymbol,這是一個枚舉值,僅僅表示內(nèi)存的類型解釋,不起實際作用
        
StringTable:key是oop,oop可以理解為指向Java對象的地址(實際上存放的就是Java的String對象的地址)
StringTable:value是mtSymbol,這是一個枚舉值,僅僅表示內(nèi)存的類型解釋,不起實際作用

兩個表的創(chuàng)建過程都非常簡單,但是符號表SymbolTable的創(chuàng)建要復(fù)雜些,增加了initialize_symbols初始化符號的操作,代碼如下:

static void create_table() {
    assert(_the_table == NULL, "One symbol table allowed.");
    _the_table = new SymbolTable();
    // 預(yù)先創(chuàng)建并分配存放符號的內(nèi)存chunk,symbol_alloc_arena_size = 360K
    initialize_symbols(symbol_alloc_arena_size);
  }

void SymbolTable::initialize_symbols(int arena_alloc_size) {
  // Initialize the arena for global symbols, size passed in depends on CDS.
  if (arena_alloc_size == 0) {
    _arena = new (mtSymbol) Arena(mtSymbol);
  } else {
    // 創(chuàng)建一個Arena對象,細(xì)節(jié)看`章節(jié)19.2.1`
    _arena = new (mtSymbol) Arena(mtSymbol, arena_alloc_size);
  }
}

19.2.1 allocation.cpp

19.2.1.1 Arena構(gòu)造函數(shù)

在JVM運行過程中,會產(chǎn)生大量的符號,為了效率在存儲時不可能來一個分配一個,所以需要提前劃出一片區(qū)域chunk來存儲,如果一塊chunk不夠了,再創(chuàng)建一塊,依此類推,Arena就是管理這些chunk的類對象,各chunk之間以鏈表的形式關(guān)聯(lián),整個JVM中對內(nèi)存的管理中,大量使用鏈表這一數(shù)據(jù)結(jié)構(gòu)來處理。順便描述下Arena的幾個字段的含義

Chunk *_first; // 第一塊 chunk
Chunk *_chunk; // 前在用的 chunk
char *_hwm, *_max; // 當(dāng)前在用的 chunk 起始點和限制點
size_t _size_in_bytes; // Arena的總大?。ㄋ衏hunk大小相加)文章來源地址http://www.zghlxwxcb.cn/news/detail-798362.html

Arena::Arena(MEMFLAGS flag, size_t init_size) : _flags(flag), _size_in_bytes(0)  {
  size_t round_size = (sizeof (char *)) - 1;
  init_size = (init_size+round_size) & ~round_size;
  // 主要看這里,創(chuàng)建了一個init_size大小的chunk塊
  _first = _chunk = new (AllocFailStrategy::EXIT_OOM, init_size) Chunk(init_size);
  _hwm = _chunk->bottom();      // 保存 hwm, max,分別指向chunk塊可操作的起始點和限制點
  _max = _chunk->top();
  MemTracker::record_new_arena(flag);
  set_size_in_bytes(init_size);
}

到了這里,關(guān)于Hotspot源碼解析-第十九章-ClassLoaderData、符號表、字符串表的初始化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 第十九章 Unity 其他 API

    第十九章 Unity 其他 API

    本節(jié)介紹一些其他經(jīng)常使用的Unity類。首先,我們回顧一下Vector3向量類,它既可以表示方向,也可以表示大小。它在游戲中可以用來表示角色的位置,物體的移動/旋轉(zhuǎn),設(shè)置兩個游戲?qū)ο笾g的距離。在我們之前的課程中,我們講過向量的一些運算。例如向量的加法可以表示

    2024年02月05日
    瀏覽(27)
  • 第十九章:Linux中安裝MySQL

    第十九章:Linux中安裝MySQL

    查看是否安裝過 MySQL MySQL 卸載 關(guān)閉 ,ysql 服務(wù) 查詢當(dāng)前 mysql 安裝狀態(tài) 卸載上述命令【任意一條就行】查詢出的已安裝程序 注意:務(wù)必卸載干凈,反復(fù)執(zhí)行 rpm -qa | grep -i mysql 確認(rèn)是否有卸載殘留。 刪除 mysql 相關(guān)文件 刪除 my.cnf 【 MySQL 的配置文件】 檢查 /tmp 臨時目錄權(quán)限

    2024年02月13日
    瀏覽(27)
  • 【Vue3 第十九章】插槽 slot

    【Vue3 第十九章】插槽 slot

    數(shù)字化管理平臺 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus 權(quán)限系統(tǒng)-商城 個人博客地址 在某些場景中,我們可能想要為子組件傳遞一些模板片段,讓子組件在它們的組件中渲染這些片段。這就用到了插槽。 插槽是子組件中的提供給父組件使用的一個占位符,用 slot 表示,父組件可以

    2024年02月09日
    瀏覽(27)
  • 【Rust】Rust學(xué)習(xí) 第十九章高級特征

    【Rust】Rust學(xué)習(xí) 第十九章高級特征

    現(xiàn)在我們已經(jīng)學(xué)習(xí)了 Rust 編程語言中最常用的部分。在第二十章開始另一個新項目之前,讓我們聊聊一些總有一天你會遇上的部分內(nèi)容。你可以將本章作為不經(jīng)意間遇到未知的內(nèi)容時的參考。本章將要學(xué)習(xí)的功能在一些非常特定的場景下很有用處。雖然很少會碰到它們,我們

    2024年02月11日
    瀏覽(24)
  • 信安軟考 第十九章 操作系統(tǒng)安全保護

    信安軟考 第十九章 操作系統(tǒng)安全保護

    一、操作系統(tǒng)安全概述 1.1 操作系統(tǒng)安全概念與需求 操作系統(tǒng)(operating system),以下都簡稱OS 操作系統(tǒng) 負(fù)責(zé)計算機系統(tǒng)的資源管理,支撐和控制各種應(yīng)用程序運行,為用戶提供計算機系統(tǒng)管理接口 。操作系統(tǒng)是構(gòu)成信息網(wǎng)絡(luò)系統(tǒng)的核心關(guān)鍵組件,其安全可靠程度決定了計算

    2024年02月06日
    瀏覽(36)
  • TCP/IP網(wǎng)絡(luò)編程 第十九章:Windows平臺下線程的使用

    要想掌握Windows平臺下的線程,應(yīng)首先理解“內(nèi)核對象”(Kernel Objects)的概念。如果僅介紹Windows平臺下的線程使用技巧,則可以省略相對陌生的內(nèi)核對象相關(guān)內(nèi)容。但這并不能使各位深入理解Windows平臺下的線程。 內(nèi)核對象的定義 操作系統(tǒng)創(chuàng)建的資源有很多種,如進程、線程

    2024年02月16日
    瀏覽(30)
  • 【Linux命令行與Shell腳本編程】第十九章 正則表達式

    【Linux命令行與Shell腳本編程】第十九章 正則表達式

    正則表達式基礎(chǔ) 定義BRE模式 擴展正則表達式 在sed和gawk中創(chuàng)建正則表達式,以得到所需的數(shù)據(jù)。 正則表達式是一種可供Linux工具過濾文本的自定義模板,使用元字符來描述數(shù)據(jù)流中的一個或多個字符. Linux工具(比如sed或gawk)會在讀取數(shù)據(jù)時使用正則表達式對數(shù)據(jù)進行模式匹配

    2024年02月13日
    瀏覽(24)
  • 第十九章 調(diào)用Callout Library函數(shù) - 將 $ZF(-5) 與多個庫和許多函數(shù)調(diào)用一起使用

    對 $ZF(-4,1) 的調(diào)用將標(biāo)注庫 inputlibrary.dll 和 outputlibrary.dll 加載到虛擬內(nèi)存中,并為其返回系統(tǒng)定義的庫 ID 。 對 $ZF(-4,3) 的調(diào)用使用庫 ID 和函數(shù)名稱來獲取庫函數(shù)的 ID 。返回的函數(shù) ID 實際上是 ZFEntry 表序列號(請參閱上一章中的“創(chuàng)建 ZFEntry 表”)。 第一個循環(huán)使用 $ZF(-5

    2024年01月16日
    瀏覽(24)
  • 【送書福利-第十九期】《C++ Core Guidelines解析》

    【送書福利-第十九期】《C++ Core Guidelines解析》

    ?? 作者介紹:我是程序員洲洲,一個熱愛寫作的非著名程序員。CSDN全棧優(yōu)質(zhì)領(lǐng)域創(chuàng)作者、華為云博客社區(qū)云享專家、阿里云博客社區(qū)專家博主、前后端開發(fā)、人工智能研究生。公粽號:程序員洲洲。 ?? 本文專欄:本文收錄于洲洲的《送書福利》系列專欄,該專欄福利多多

    2024年02月08日
    瀏覽(30)
  • Hotspot源碼解析-第二十章-字典表創(chuàng)建和基礎(chǔ)類預(yù)加載(四)

    20.5.1 systemDictionary.cpp/hpp 20.5.1.1 SystemDictionary::initialize 20.5.1.2 initialize_preloaded_classes 這一部分也用到了很多宏定義,咱們先把宏展開后再來講解 要使用的宏已經(jīng)展開了,下面接著講正題 SystemDictionary::initialize_wk_klasses_until SystemDictionary::initialize_wk_klass

    2024年01月19日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包