亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

1、定義范圍鎖

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

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ù)中對互斥量進(jìn)行加載和釋放鎖。也就是說,當(dāng)對象創(chuàng)建的時候會自動調(diào)用構(gòu)造函數(shù),當(dāng)對象超出作用域的時候會自動調(diào)用析構(gòu)函數(shù)。

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

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

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

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

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

http://chabaoo.cn/article/115051.htm

http://chabaoo.cn/program/297764rfl.htm

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

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

調(diào)用的as_C_string()函數(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中申請了內(nèi)存,那就必須要記錄,完成調(diào)用之后恢復(fù)調(diào)用之前的樣子,這樣才不會讓內(nèi)存處在不一致的狀態(tài),從而導(dǎo)致崩潰,所以必須要使用ResourceMark。

3、保存重要信息

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

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

后面我們在介紹具體的知識點時再詳細(xì)介紹這些內(nèi)容。

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

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

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

相關(guān)文章

  • C++ vector容器 find erase的使用操作:查找并刪除指定元素

    C++ vector容器 find erase的使用操作:查找并刪除指定元素

    這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 利用Matlab復(fù)刻兩款粒子愛心動畫效果

    利用Matlab復(fù)刻兩款粒子愛心動畫效果

    最近電視劇《點燃我,溫暖你》大火,蹭一下熱度,發(fā)一下MATLAB畫愛心的代碼,寫的比較隨意,大家可以自行調(diào)整粒子大小和顏色啥的
    2022-11-11
  • C語言實現(xiàn)黎曼和求定積分

    C語言實現(xiàn)黎曼和求定積分

    這篇文章主要為大家詳細(xì)介紹了用C語言程序?qū)崿F(xiàn)黎曼和求定積分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言循環(huán)結(jié)構(gòu)實戰(zhàn)之while和for循環(huán)基本語法詳解

    C語言循環(huán)結(jié)構(gòu)實戰(zhàn)之while和for循環(huán)基本語法詳解

    while 循環(huán)和 for 循環(huán)都是C語言中非常重要的循環(huán)結(jié)構(gòu),它們各有優(yōu)缺點和適用場景,本文將介紹C語言循環(huán)結(jié)構(gòu)實戰(zhàn)之while和for循環(huán)基本語法,感興趣的朋友一起看看吧
    2025-05-05
  • Qt之實現(xiàn)圓形進(jìn)度條的示例代碼

    Qt之實現(xiàn)圓形進(jìn)度條的示例代碼

    在平時做頁面開發(fā)時,有些時候會用到圓形進(jìn)度條,本文主要介紹了Qt之實現(xiàn)圓形進(jìn)度條的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • C語言實現(xiàn)enum枚舉

    C語言實現(xiàn)enum枚舉

    在實際編程中,有些數(shù)據(jù)的取值往往是有限的,只能是非常少量的整數(shù),并且最好為每個值都取一個名字,以方便在后續(xù)代碼中使用,比如一個星期只有七天,一年只有十二個月,一個班每周有六門課程等。 以每周七天為例,我們可以使用#define命令來給每天指定一個名字
    2021-06-06
  • 詳解C語言的隨機(jī)數(shù)生成及其相關(guān)題目

    詳解C語言的隨機(jī)數(shù)生成及其相關(guān)題目

    這篇文章主要介紹了詳解C語言的隨機(jī)數(shù)生成及其相關(guān)題目,作者還列舉了阿里巴巴的一道相關(guān)的面試題,需要的朋友可以參考下
    2015-08-08
  • C++內(nèi)存查找實例

    C++內(nèi)存查找實例

    這篇文章主要介紹了C++內(nèi)存查找實例,可實現(xiàn)Windows程序設(shè)計中的內(nèi)存查找功能,需要的朋友可以參考下
    2014-10-10
  • EasyC++全局變量

    EasyC++全局變量

    這篇文章主要介紹了EasyC++全局變量
    2021-12-12
  • C++中整形與浮點型如何在內(nèi)存中的存儲詳解

    C++中整形與浮點型如何在內(nèi)存中的存儲詳解

    大家好!這期和大家分享整形和浮點型是如何在數(shù)據(jù)是如何在內(nèi)存中存儲,下面文章具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論