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

認(rèn)識(shí)Java中的Stub與StubQueue

 更新時(shí)間:2021年09月09日 17:08:57   作者:HotSpot-Researcher  
StubQueue是用來保存生成的本地代碼的Stub隊(duì)列,隊(duì)列每一個(gè)元素對(duì)應(yīng)一個(gè)InterpreterCodelet對(duì)象,InterpreterCodelet對(duì)象繼承自抽象基類Stub,下面我們介紹一下StubQueue類及相關(guān)類Stub、InterpreterCodelet類和CodeletMark類。需要的的下伙伴可以參考下面文字內(nèi)容

在文章開始前先簡單介紹TemplateInterpreter::initialize()函數(shù),在這個(gè)函數(shù)中會(huì)調(diào)用TemplateTable::initialize()函數(shù)初始化模板表,隨后會(huì)使用new關(guān)鍵字初始化定義在AbstractInterpreter類中的_code靜態(tài)屬性,如下:

static StubQueue* _code;

由于TemplateInterpreter繼承自AbstractInterpreter,所以在TemplateInterpreter中初始化的_code屬性其實(shí)就是AbstractInterpreter類中定義的_code屬性。

在initialize()函數(shù)中初始化_code變量的代碼如下

// InterpreterCodeSize是在平臺(tái)相關(guān)
// 的templateInterpreter_x86.hpp中
// 定義的,64位下是256 * 1024
int code_size = InterpreterCodeSize;
_code = new StubQueue(
                new InterpreterCodeletInterface, 
                code_size, 
                NULL,
                "Interpreter");


StubQueue是用來保存生成的本地代碼的Stub隊(duì)列,隊(duì)列每一個(gè)元素對(duì)應(yīng)一個(gè)InterpreterCodelet對(duì)象,InterpreterCodelet對(duì)象繼承自抽象基類Stub,包含了字節(jié)碼對(duì)應(yīng)的本地代碼以及一些調(diào)試和輸出信息。下面我們介紹一下StubQueue類及相關(guān)類StubInterpreterCodelet類和CodeletMark類。

1、InterpreterCodelet與Stub類

Stub類的定義如下:

class Stub VALUE_OBJ_CLASS_SPEC { ... };


InterpreterCodelet類繼承自Stub類,具體的定義如下

class InterpreterCodelet: public Stub {
 private:
  int                _size;         // the size in bytes
  const char*        _description;  // a description of the codelet, for debugging & printing
  Bytecodes::Code    _bytecode;     // associated bytecode if any
 
 public:
  // Code info
  address code_begin() const  {
     return (address)this + round_to(sizeof(InterpreterCodelet), CodeEntryAlignment);
  }
  address code_end() const {
     return (address)this + size();
  }
 
  int size() const {
     return _size;
  }
  // ...
  int code_size() const { 
     return code_end() - code_begin();  
  }
  // ...
};


InterpreterCodelet實(shí)例存儲(chǔ)在StubQueue中,每個(gè)InterpreterCodelet實(shí)例都代表一段機(jī)器指令(包含了字節(jié)碼對(duì)應(yīng)的機(jī)器指令片段以及一些調(diào)試和輸出信息),如每個(gè)字節(jié)碼都有一個(gè)InterpreterCodelet實(shí)例,所以在解釋執(zhí)行時(shí),如果要執(zhí)行某個(gè)字節(jié)碼,則執(zhí)行的就是由InterpreterCodelet實(shí)例代表的機(jī)器指令片段。

類中定義了3個(gè)屬性及一些函數(shù),其內(nèi)存布局如下圖所示。

 

在對(duì)齊至CodeEntryAlignment后,緊接著InterpreterCodelet的就是生成的目標(biāo)代碼。

2、StubQueue類

StubQueue是用來保存生成的本地機(jī)器指令片段的Stub隊(duì)列,隊(duì)列每一個(gè)元素都是一個(gè)InterpreterCodelet實(shí)例。

StubQueue類的定義如下:

class StubQueue: public CHeapObj<mtCode> {
 private:
  StubInterface* _stub_interface;     // the interface prototype
  address        _stub_buffer;        // where all stubs are stored
 
  int            _buffer_size;       // the buffer size in bytes
  int            _buffer_limit;      // the (byte) index of the actual buffer limit (_buffer_limit <= _buffer_size)
 
  int            _queue_begin;       // the (byte) index of the first queue entry (word-aligned)
  int            _queue_end;         // the (byte) index of the first entry after the queue (word-aligned)
 
  int            _number_of_stubs;   // the number of buffered stubs
 
 
  bool is_contiguous() const {
      return _queue_begin <= _queue_end;
  }
  int index_of(Stub* s) const {
      int i = (address)s - _stub_buffer;
      return i;
  }
  Stub* stub_at(int i) const {
      return (Stub*)(_stub_buffer + i);
  }
  Stub* current_stub() const {
      return stub_at(_queue_end);
  }
 
  // ...
}


這個(gè)類的構(gòu)造函數(shù)如下:

StubQueue::StubQueue(
 StubInterface* stub_interface,  // InterpreterCodeletInterface對(duì)象
 int            buffer_size,     // 256*1024
 Mutex*         lock,
 const char*    name) : _mutex(lock)
{
  intptr_t     size = round_to(buffer_size, 2*BytesPerWord); // BytesPerWord的值為8
  BufferBlob*  blob = BufferBlob::create(name, size); // 在StubQueue中創(chuàng)建BufferBlob對(duì)象
 
  _stub_interface  = stub_interface;
 
  _buffer_size     = blob->content_size();
  _buffer_limit    = blob->content_size();
  _stub_buffer     = blob->content_begin();
 
  _queue_begin     = 0;
  _queue_end       = 0;
  _number_of_stubs = 0;
}


stub_interface用來保存一個(gè)InterpreterCodeletInterface類型的實(shí)例,InterpreterCodeletInterface類中定義了操作Stub的函數(shù),避免了在Stub中定義虛函數(shù)。每個(gè)StubQueue都有一個(gè)InterpreterCodeletInterface,可以通過這個(gè)來操作StubQueue中存儲(chǔ)的每個(gè)Stub實(shí)例。

調(diào)用BufferBlob::create()函數(shù)為StubQueue分配內(nèi)存,這里我們需要記住StubQueue用的內(nèi)存是通過BufferBlob分配出來的,也就是BufferBlob其本質(zhì)可能是一個(gè)StubQueue。下面就來詳細(xì)介紹下create()函數(shù)。

BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
  // ...
  BufferBlob*    blob = NULL;
  unsigned int   size = sizeof(BufferBlob);
 
  // align the size to CodeEntryAlignment
  size = align_code_offset(size);
  size += round_to(buffer_size, oopSize); // oopSize是一個(gè)指針的寬度,在64位上就是8
 
  {
     MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     blob = new (size) BufferBlob(name, size);
  }
 
  return blob;
}


通過new關(guān)鍵字為BufferBlob分配內(nèi)存,new重載運(yùn)算符如下:

void* BufferBlob::operator new(size_t s, unsigned size, bool is_critical) throw() {
  void* p = CodeCache::allocate(size, is_critical);
  return p;
}


codeCache中分配內(nèi)存,CodeCache使用的是本地內(nèi)存,有自己的內(nèi)存管理辦法,在后面將會(huì)詳細(xì)介紹。

StubQueue的布局結(jié)構(gòu)如下圖所示。

隊(duì)列中的InterpreterCodelet表示一個(gè)小例程,比如iconst_1對(duì)應(yīng)的機(jī)器碼,invokedynamic對(duì)應(yīng)的機(jī)器碼,異常處理對(duì)應(yīng)的代碼,方法入口點(diǎn)對(duì)應(yīng)的代碼,這些代碼都是一個(gè)個(gè)InterpreterCodelet。整個(gè)解釋器都是由這些小塊代碼例程組成的,每個(gè)小塊例程完成解釋器的部分功能,以此實(shí)現(xiàn)整個(gè)解釋器。

到此這篇關(guān)于認(rèn)識(shí)Java中的Stub與StubQueue的文章就介紹到這了,更多相關(guān)Stub與StubQueue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • classpath和classpath*的區(qū)別詳解

    classpath和classpath*的區(qū)別詳解

    這篇文章主要為大家介紹了classpath和classpath*的區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Spring中的@ConditionalOnProperty作用和用法詳解

    Spring中的@ConditionalOnProperty作用和用法詳解

    這篇文章主要介紹了Spring中的@ConditionalOnProperty作用和用法詳解,在spring boot中有時(shí)候需要控制配置類是否生效,可以使用@ConditionalOnProperty注解來控制@Configuration是否生效,需要的朋友可以參考下
    2023-11-11
  • java實(shí)現(xiàn)二分法查找出數(shù)組重復(fù)數(shù)字

    java實(shí)現(xiàn)二分法查找出數(shù)組重復(fù)數(shù)字

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)二分法查找出數(shù)組重復(fù)數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Java StackTraceElement實(shí)例代碼

    Java StackTraceElement實(shí)例代碼

    這篇文章主要介紹了Java StackTraceElement實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 淺談Mybatis之參數(shù)傳遞的幾種姿勢(shì)

    淺談Mybatis之參數(shù)傳遞的幾種姿勢(shì)

    在mybatis的日常開發(fā)中,mapper接口中定義的參數(shù)如何與xml中的參數(shù)進(jìn)行映射呢?本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-09-09
  • Spring框架構(gòu)造注入type屬性實(shí)例詳解

    Spring框架構(gòu)造注入type屬性實(shí)例詳解

    這篇文章主要介紹了Spring框架構(gòu)造注入type屬性實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • gradle安裝和環(huán)境配置全過程

    gradle安裝和環(huán)境配置全過程

    本文介紹了如何安裝和配置Gradle環(huán)境,包括下載Gradle、配置環(huán)境變量、測(cè)試Gradle以及在IntelliJ IDEA中配置Gradle
    2025-01-01
  • java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

    java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

    這篇文章主要介紹了java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法,對(duì)算法感興趣的同學(xué),一定要看一下
    2021-05-05
  • Mybatis常用標(biāo)簽整理

    Mybatis常用標(biāo)簽整理

    日常開發(fā)中,MyBatis中標(biāo)簽有著舉足輕重的重要性,以下是一些MyBatis框架中常見的標(biāo)簽及案例,感興趣的朋友跟隨小編一起看看吧
    2007-02-02
  • Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    本文介紹了SpringBoot中的@DateTimeFormat和@JsonFormat注解的用法,解釋了它們?cè)谔幚砣掌诤蜁r(shí)間數(shù)據(jù)時(shí)的作用,并通過實(shí)例代碼展示了如何在REST控制器中使用這些注解,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評(píng)論

温泉县| 堆龙德庆县| 东阳市| 铜山县| 合江县| 湘潭市| 汝南县| 祁东县| 望江县| 洞头县| 张家港市| 扎囊县| 富平县| 射洪县| 江山市| 基隆市| 湖北省| 枣强县| 南雄市| 崇礼县| 长顺县| 滦南县| 邹平县| 丹凤县| 满洲里市| 大邑县| 酉阳| 竹山县| 通海县| 河北区| 鹰潭市| 东安县| 合阳县| 崇信县| 永年县| 兴城市| 阜宁县| 弋阳县| 蒲江县| 静宁县| 阿拉尔市|