ldc

根據(jù) bytecodeInterpreter.cpp 找到 ldc 指令:

CASE(_ldc):
        {
          u2 index;
          bool wide = false;
          int incr = 2; // frequent case
          if (opcode == Bytecodes::_ldc) {
            index = pc[1];
          } else {
            index = Bytes::get_Java_u2(pc+1);
            incr = 3;
            wide = true;
          }

          ConstantPool* constants = METHOD->constants();
          switch (constants->tag_at(index).value()) {
          case JVM_CONSTANT_Integer:
            SET_STACK_INT(constants->int_at(index), 0);
            break;

          case JVM_CONSTANT_Float:
            SET_STACK_FLOAT(constants->float_at(index), 0);
            break;

          case JVM_CONSTANT_String:
            {
              oop result = constants->resolved_references()->obj_at(index);
              if (result == NULL) {
                CALL_VM(InterpreterRuntime::resolve_ldc(THREAD, (Bytecodes::Code) opcode), handle_exception);
                SET_STACK_OBJECT(THREAD->vm_result(), 0);
                THREAD->set_vm_result(NULL);
              } else {
                VERIFY_OOP(result);
                SET_STACK_OBJECT(result, 0);
              }
            break;
            }

          case JVM_CONSTANT_Class:
            VERIFY_OOP(constants->resolved_klass_at(index)->java_mirror());
            SET_STACK_OBJECT(constants->resolved_klass_at(index)->java_mirror(), 0);
            break;

          case JVM_CONSTANT_UnresolvedClass:
          case JVM_CONSTANT_UnresolvedClassInError:
            CALL_VM(InterpreterRuntime::ldc(THREAD, wide), handle_exception);
            SET_STACK_OBJECT(THREAD->vm_result(), 0);
            THREAD->set_vm_result(NULL);
            break;

          default:  ShouldNotReachHere();
          }
          UPDATE_PC_AND_TOS_AND_CONTINUE(incr, 1);
        }

執(zhí)行流程:
(1)根據(jù) ldc 的操作數(shù)值,也就是運(yùn)行時(shí)常量池中某項(xiàng)常量的索引值,到常量池中獲取到對(duì)應(yīng)的常量,這里可能是 JVM_CONSTANT_Integer较幌、JVM_CONSTANT_FloatJVM_CONSTANT_StringJVM_CONSTANT_Class御毅、JVM_CONSTANT_UnresolvedClassJVM_CONSTANT_UnresolvedClassInError怜珍。
(2)根據(jù)不同類型的常量端蛆,執(zhí)行不同的邏輯。

接下來著重看下 JVM_CONSTANT_Integer酥泛、JVM_CONSTANT_Float今豆、JVM_CONSTANT_String 這幾種類型常量的執(zhí)行邏輯。

JVM_CONSTANT_Integer柔袁、JVM_CONSTANT_Float 這兩個(gè)類似:
(1)直接獲取常量中保存的 intfloat 值呆躲;
(2)將 intfloat 值壓入操作數(shù)棧;

JVM_CONSTANT_String
(1)判斷該常量是否已經(jīng)解析過捶索,如果已經(jīng)解析過直接返回常量池中保存的 String對(duì)象 引用插掂;
(2)否則進(jìn)行解析:調(diào)用 StringTable::intern 判斷是否字符串常量池已有相同值的 String 對(duì)象引用,有就直接返回引用情组,沒有則根據(jù)對(duì)應(yīng)字符串值創(chuàng)建對(duì)象并把引用保存在 StringTable 中燥筷,并發(fā)這個(gè)引用保存到 ConstantPoolresolved_references 中箩祥,最后返回這個(gè)引用院崇。
resolved_referencesConstantPool 中的一個(gè) objArrayOop 對(duì)象,
所以雖然 Constant_String_info 稱為字符串字面量袍祖,但它同樣有解析過程底瓣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕉陋,隨后出現(xiàn)的幾起案子捐凭,更是在濱河造成了極大的恐慌,老刑警劉巖凳鬓,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茁肠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缩举,警方通過查閱死者的電腦和手機(jī)垦梆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門匹颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托猩,你說我怎么就攤上這事印蓖。” “怎么了京腥?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赦肃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我公浪,道長(zhǎng)他宛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任欠气,我火速辦了婚禮堕汞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晃琳。我一直安慰自己讯检,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布卫旱。 她就那樣靜靜地躺著人灼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾翼。 梳的紋絲不亂的頭發(fā)上投放,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音适贸,去河邊找鬼灸芳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拜姿,可吹牛的內(nèi)容都是我干的烙样。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蕊肥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谒获!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起壁却,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤批狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后展东,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赔硫,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盐肃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爪膊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向胡。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惊完,靈堂內(nèi)的尸體忽然破棺而出僵芹,到底是詐尸還是另有隱情,我是刑警寧澤小槐,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布拇派,位于F島的核電站,受9級(jí)特大地震影響凿跳,放射性物質(zhì)發(fā)生泄漏件豌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一控嗜、第九天 我趴在偏房一處隱蔽的房頂上張望茧彤。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)珠洗。三九已至,卻和暖如春若专,著一層夾襖步出監(jiān)牢的瞬間许蓖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工调衰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膊爪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓嚎莉,卻偏偏與公主長(zhǎng)得像米酬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萝喘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 本文首發(fā):windCoder.com 上篇介紹了一些String的基礎(chǔ)與簡(jiǎn)單的創(chuàng)建方式淮逻,本篇引入它的intern(...
    蜜汁炒酸奶閱讀 426評(píng)論 0 0
  • ??需要說明的一點(diǎn)是琼懊,這篇文章是以《深入理解Java虛擬機(jī)》第二版這本書為基礎(chǔ)的阁簸,這里假設(shè)大家已經(jīng)了解了JVM的運(yùn)...
    Geeks_Liu閱讀 14,004評(píng)論 5 44
  • 前言 不知道大家有沒有這樣一種感覺启妹,程序員的數(shù)量井噴了∽淼可能是因?yàn)榛ヂ?lián)網(wǎng)火了饶米,也可能是各家培訓(xùn)機(jī)構(gòu)為我們拉來了大量...
    活這么大就沒飽過閱讀 2,716評(píng)論 6 26
  • 本文跟大家聊聊JVM的內(nèi)部結(jié)構(gòu)桨啃,從組件中的多線程處理,JVM系統(tǒng)線程檬输,局部變量數(shù)組等方面進(jìn)行解析 JVM JVM ...
    認(rèn)真期待閱讀 467評(píng)論 0 1
  • 這篇文章解釋了Java 虛擬機(jī)(JVM)的內(nèi)部架構(gòu)照瘾。下圖顯示了遵守Java SE 7 規(guī)范的典型的 JVM 核心內(nèi)...
    飲墨饗書閱讀 656評(píng)論 0 1