最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?RAII在HotSpot?VM中的重要應(yīng)用解析

 更新時(shí)間:2023年09月22日 11:29:05   作者:鳩摩(馬智)  
RAII技術(shù)被認(rèn)為是C++中管理資源的最佳方法,進(jìn)一步引申,使用RAII技術(shù)也可以實(shí)現(xiàn)安全、簡(jiǎn)潔的狀態(tài)管理,編寫(xiě)出優(yōu)雅的異常安全的代碼,這篇文章主要介紹了C++?RAII在HotSpot?VM中的重要應(yīng)用,需要的朋友可以參考下

RAII(Resource Acquisition Is Initialization),也稱為“資源獲取就是初始化”,是C++語(yǔ)言的一種管理資源、避免泄漏的慣用法。C++標(biāo)準(zhǔn)保證任何情況下,已構(gòu)造的對(duì)象最終會(huì)銷毀,即它的析構(gòu)函數(shù)最終會(huì)被調(diào)用。簡(jiǎn)單的說(shuō),RAII的做法是使用一個(gè)對(duì)象,在其構(gòu)造時(shí)獲取資源,在對(duì)象生命期控制范圍之下對(duì)資源的訪問(wèn)始終保持有效,最后在對(duì)象析構(gòu)的時(shí)候釋放資源。
在HotSpot VM中,RAII對(duì)內(nèi)存資源的管理和釋放、明確定義范圍鎖及記錄重要信息等方面起到了非常重要的作用。下面詳細(xì)介紹一下。

1、定義范圍鎖

在HotSpot VM中,整個(gè)系統(tǒng)正確的運(yùn)轉(zhuǎn)需要非常多的鎖,這些鎖很多都是通過(guò)RAII技術(shù)來(lái)管理的。
舉個(gè)例子,如下:

class MutexLocker {
private:
    pthread_mutex_t *_mtx;
public:
    MutexLocker(pthread_mutex_t *mtx) {
        if (mtx) {
            _mtx = mtx;
            pthread_mutex_lock(_mtx);
        }
    }
    ~MutexLocker() {
        if (_mtx)
            pthread_mutex_unlock(_mtx);
    }
};

在類的構(gòu)造和析構(gòu)函數(shù)中對(duì)互斥量進(jìn)行加載和釋放鎖。也就是說(shuō),當(dāng)對(duì)象創(chuàng)建的時(shí)候會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),當(dāng)對(duì)象超出作用域的時(shí)候會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。

現(xiàn)在我們通過(guò)如上的類將一段代碼保護(hù)起來(lái),防止產(chǎn)生并發(fā)問(wèn)題:

// 初始化互斥鎖
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void init(){
    MutexLocker locker(&mutex);
    // 整個(gè)方法都會(huì)在同步鎖的保護(hù)下執(zhí)行
}

我們還可以通過(guò)匿名塊來(lái)進(jìn)一步細(xì)化鎖控制的范圍。當(dāng)進(jìn)入作用域范圍時(shí),C++會(huì)自動(dòng)調(diào)用MutexLocker的構(gòu)造函數(shù),當(dāng)出了作用域范圍時(shí),會(huì)調(diào)用MutexLocker析構(gòu)函數(shù)。這樣通過(guò)類來(lái)管理鎖資源,將資源和對(duì)象的生命周期綁定。在Java中有個(gè)類似的、飽受詬病的一種釋放資源的辦法,重寫(xiě)finalize()方法,由于開(kāi)發(fā)人員無(wú)法對(duì)Java對(duì)象的生命周期進(jìn)行精確控制,而是托管給了Java虛擬機(jī)GC,所以對(duì)象什么時(shí)候回收是一個(gè)未知數(shù),為應(yīng)用程序埋下了一個(gè)定時(shí)炸彈。不過(guò)另外一個(gè)類似的語(yǔ)法try-with-resources提倡使用。
在HotSpot VM中,在runtime/mutex.hpp文件中定義了互斥量Mutex,這個(gè)互斥量繼承自Monitor,HotSpot VM內(nèi)部的并發(fā)非常依賴Monitor。在runtime/mutexLocker.hpp文件中定義了MutexLocker、MutexLockerEx等類來(lái)控制鎖范圍。

2、管理內(nèi)存資源

管理內(nèi)存資源的一些類有HandleMark、ResourceMark等,HandleMark用來(lái)管理句柄,ResourceMark用來(lái)管理臨時(shí)使用的內(nèi)存。
HandleMark我在之前已經(jīng)介紹的非常詳細(xì)了,可參考如下文章:

http://m.fzitv.net/article/115051.htm

http://m.fzitv.net/program/297764rfl.htm

ResourceMark的實(shí)現(xiàn)也非常類似。
由于Java類常量池中的字符串、還有一些公共字符串在HotSpot VM中都用Symbol實(shí)例來(lái)表示,如果想要看某個(gè)Klass實(shí)例表示的具體的類名稱,我有時(shí)候會(huì)這樣做:

{
 ResourceMark rm;
 Symbol *sym = _klass->name();
 const char *klassName = (sym->as_C_string());
 // ...
}

調(diào)用的as_C_string()函數(shù)實(shí)現(xiàn)如下:

char* Symbol::as_C_string() const {
  int len = utf8_length();
  char* str = (char*) resource_allocate_bytes( (len + 1) * sizeof(char) );
  return as_C_string(str, len + 1);
}
extern char* resource_allocate_bytes(size_t size, AllocFailType alloc_failmode) {
  ResourceArea* ra = Thread::current()->resource_area();
  return ra->allocate_bytes(size, alloc_failmode);
}

可以看到從ResourceArea中申請(qǐng)了內(nèi)存,那就必須要記錄,完成調(diào)用之后恢復(fù)調(diào)用之前的樣子,這樣才不會(huì)讓內(nèi)存處在不一致的狀態(tài),從而導(dǎo)致崩潰,所以必須要使用ResourceMark。

3、保存重要信息

閱讀HotSpot VM源代碼的人一定會(huì)對(duì)JavaCalls::call_helper()函數(shù)中的如下這段代碼不陌生:

從HotSpot VM內(nèi)部調(diào)用Java方法時(shí),通常會(huì)調(diào)用到call_helper()函數(shù),所以這也是HotSpot VM調(diào)用Java主類main()方法的關(guān)鍵入口,在這個(gè)函數(shù)中我們能夠看到HandleMark的使用,另外還有一個(gè)JavaCallWrapper,這個(gè)類主要有2個(gè)作用:
(1)管理內(nèi)存資源,在 http://m.fzitv.net/article/75222.htm已經(jīng)詳細(xì)介紹過(guò),這里不再介紹。
(2)記錄Java調(diào)用棧的重要信息,退棧等操作非常依賴這些信息。
變量名叫l(wèi)ink非常貼切,它的起用就是將Java棧連接起來(lái),其大概的實(shí)現(xiàn)過(guò)程如下圖所示。

后面我們?cè)诮榻B具體的知識(shí)點(diǎn)時(shí)再詳細(xì)介紹這些內(nèi)容。

RAII技術(shù)被認(rèn)為是C++中管理資源的最佳方法,進(jìn)一步引申,使用RAII技術(shù)也可以實(shí)現(xiàn)安全、簡(jiǎn)潔的狀態(tài)管理,編寫(xiě)出優(yōu)雅的異常安全的代碼。它利用棧對(duì)象在離開(kāi)作用域后自動(dòng)析構(gòu)的語(yǔ)言特點(diǎn),將受限資源的生命周期綁定到該對(duì)象上,當(dāng)對(duì)象析構(gòu)時(shí)以達(dá)到自動(dòng)釋放資源的目的。

簡(jiǎn)單而言RAII就是指資源在我們拿到時(shí)就已經(jīng)初始化,一旦不在需要該資源就可以自動(dòng)釋放該資源。

到此這篇關(guān)于C++ RAII在HotSpot VM中的重要應(yīng)用的文章就介紹到這了,更多相關(guān)C++ RAII應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ move semantic移動(dòng)語(yǔ)義介紹

    C++ move semantic移動(dòng)語(yǔ)義介紹

    首先,移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來(lái)使用。本篇會(huì)從C++的值類型,到移動(dòng)拷貝與移動(dòng)賦值來(lái)理解移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)
    2022-08-08
  • c++ 中__declspec 的用法詳解

    c++ 中__declspec 的用法詳解

    這篇文章主要介紹了c++ 中__declspec 的用法詳解,對(duì)初學(xué)者有一定的幫助,有需要的可以了解一下。
    2016-11-11
  • pthread_cond_wait() 用法深入分析

    pthread_cond_wait() 用法深入分析

    以下是對(duì)pthread_cond_wait的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • C++?typedef常見(jiàn)用法詳解

    C++?typedef常見(jiàn)用法詳解

    這篇文章主要介紹了C++?typedef用法詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++單例設(shè)計(jì)模式詳細(xì)講解

    C++單例設(shè)計(jì)模式詳細(xì)講解

    單例模式(Singleton Pattern)是最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建
    2022-06-06
  • C++中RAII資源獲取即初始化

    C++中RAII資源獲取即初始化

    RAII通過(guò)構(gòu)造/析構(gòu)自動(dòng)管理資源生命周期,確保安全釋放,本文就來(lái)介紹一下C++中的RAII技術(shù)及其應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-06-06
  • C語(yǔ)言時(shí)間函數(shù)的ctime()和gmtime()你了解嗎

    C語(yǔ)言時(shí)間函數(shù)的ctime()和gmtime()你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言時(shí)間函數(shù)的ctime()和gmtime(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++泛型編程綜合講解

    C++泛型編程綜合講解

    泛型編程與面向?qū)ο缶幊痰哪繕?biāo)相同,即使重用代碼和抽象通用概念的技術(shù)更加簡(jiǎn)單。但是面向?qū)ο缶幊虖?qiáng)調(diào)編程的數(shù)據(jù)方面,泛型編程強(qiáng)調(diào)的是獨(dú)立于特定數(shù)據(jù)類型
    2022-12-12
  • C++獲得文件狀態(tài)信息的方法

    C++獲得文件狀態(tài)信息的方法

    這篇文章主要介紹了C++獲得文件狀態(tài)信息的方法,包括文件狀態(tài)信息、文件所在磁盤盤符、文件創(chuàng)建時(shí)間、訪問(wèn)時(shí)間及修改日期等,需要的朋友可以參考下
    2015-07-07
  • C語(yǔ)言的循環(huán)小練習(xí)詳解

    C語(yǔ)言的循環(huán)小練習(xí)詳解

    這篇文章主要為大家介紹了C語(yǔ)言的循環(huán)小練習(xí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01

最新評(píng)論

柘城县| 浮梁县| 集贤县| 乌拉特前旗| 麦盖提县| 新宁县| 井冈山市| 家居| 芦山县| 前郭尔| 璧山县| 新邵县| 普安县| 泰顺县| 吴旗县| 卫辉市| 石渠县| 福贡县| 海盐县| 达拉特旗| 泽库县| 依兰县| 封开县| 泾阳县| 淮阳县| 福州市| 新建县| 壤塘县| 西华县| 永宁县| 东乌| 伊宁市| 通州市| 尼木县| 鄂托克前旗| 闻喜县| 杭州市| 澄迈县| 台湾省| 洮南市| 屏南县|