日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

發布時間:2025/3/21 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 示例demo
  • 總體關系
  • 代碼示例論證
  • 反匯編

Pre

JVM - 結合代碼示例徹底搞懂Java內存區域_線程棧 | 本地方法棧 | 程序計數器

中我們探討了線程棧中的內部結構 ,大家有么有想過main方法呢? 我們繼續來看下main方法


示例demo

package com.gof.test;public class Artisan {public static final int FIVE = 5 ; // final靜態變public static User user = new User();// 靜態變量public static void main(String[] args) {Artisan artisan = new Artisan();artisan.doSomething();}public int doSomething() {int a = 1 ;int b = 2 ;int c = (a + b) * 10 ;return c;} }

final對象和static對象 ,我們知道都會存放在方法區(元空間)中的運行時常量池。 User 和 FIVE 會存放在該區域內。

方法區#運行時常量池 ,是方法區的一部分。 Class文件中的常量池表用于存放編譯期間生成的各種字面量和符號引用,這部分內容將在類加載后放到方法區的運行時常量池中。


反匯編 ,附帶附件信息

E:\Program Files\Java\jdk1.8.0_161\bin> ./javap -c -v D:\IdeaProjects\GOF23\target\classes\com\gof\test\Artisan.class > Artisan.txt PS E:\Program Files\Java\jdk1.8.0_161\bin>

可以看到 Constant Pool

Constant pool:#1 = Methodref #8.#35 // java/lang/Object."<init>":()V#2 = Class #36 // com/gof/test/Artisan#3 = Methodref #2.#35 // com/gof/test/Artisan."<init>":()V#4 = Methodref #2.#37 // com/gof/test/Artisan.doSomething:()I#5 = Class #38 // com/gof/test/User#6 = Methodref #5.#35 // com/gof/test/User."<init>":()V#7 = Fieldref #2.#39 // com/gof/test/Artisan.user:Lcom/gof/test/User;#8 = Class #40 // java/lang/Object#9 = Utf8 FIVE#10 = Utf8 I#11 = Utf8 ConstantValue#12 = Integer 5#13 = Utf8 user#14 = Utf8 Lcom/gof/test/User;#15 = Utf8 <init>#16 = Utf8 ()V#17 = Utf8 Code#18 = Utf8 LineNumberTable#19 = Utf8 LocalVariableTable#20 = Utf8 this#21 = Utf8 Lcom/gof/test/Artisan;#22 = Utf8 main#23 = Utf8 ([Ljava/lang/String;)V#24 = Utf8 args#25 = Utf8 [Ljava/lang/String;#26 = Utf8 artisan#27 = Utf8 doSomething#28 = Utf8 ()I#29 = Utf8 a#30 = Utf8 b#31 = Utf8 c#32 = Utf8 <clinit>#33 = Utf8 SourceFile#34 = Utf8 Artisan.java#35 = NameAndType #15:#16 // "<init>":()V#36 = Utf8 com/gof/test/Artisan#37 = NameAndType #27:#28 // doSomething:()I#38 = Utf8 com/gof/test/User#39 = NameAndType #13:#14 // user:Lcom/gof/test/User;#40 = Utf8 java/lang/Object

找下User和 FIVE


總體關系

Note: FIVE 是 final的,上圖少寫了


代碼示例論證

當我們執行main方法

public static void main(String[] args) {Artisan artisan = new Artisan();artisan.doSomething();}

Artisan artisan = new Artisan(); 這個對象會在堆上分配一塊內存空間用來存儲該對象。

main也是個方法,也得有方法棧, 那方法棧中的局部變量表中存放的artisan是個啥呢? 其實是 對象的引用 ,也就是對象的內存地址 。

這樣,線程棧和堆的關系就產生了。

當類在編譯階段,靜態類User , 會被分配到方法區 , 那 new User() 存放在 堆中,方法區的User 和 堆中的User 什么關系呢? 引用的關系,方法區中的User僅僅是個符號引用,指向真正的堆內存中的User對象。

這樣 方法區和堆的關系就產生了 。


反匯編

Classfile /D:/IdeaProjects/GOF23/target/classes/com/gof/test/Artisan.classLast modified 2020-6-22; size 772 bytesMD5 checksum 89d38013e132ab14203f796617191dd9Compiled from "Artisan.java" public class com.gof.test.Artisanminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER Constant pool:#1 = Methodref #8.#35 // java/lang/Object."<init>":()V#2 = Class #36 // com/gof/test/Artisan#3 = Methodref #2.#35 // com/gof/test/Artisan."<init>":()V#4 = Methodref #2.#37 // com/gof/test/Artisan.doSomething:()I#5 = Class #38 // com/gof/test/User#6 = Methodref #5.#35 // com/gof/test/User."<init>":()V#7 = Fieldref #2.#39 // com/gof/test/Artisan.user:Lcom/gof/test/User;#8 = Class #40 // java/lang/Object#9 = Utf8 FIVE#10 = Utf8 I#11 = Utf8 ConstantValue#12 = Integer 5#13 = Utf8 user#14 = Utf8 Lcom/gof/test/User;#15 = Utf8 <init>#16 = Utf8 ()V#17 = Utf8 Code#18 = Utf8 LineNumberTable#19 = Utf8 LocalVariableTable#20 = Utf8 this#21 = Utf8 Lcom/gof/test/Artisan;#22 = Utf8 main#23 = Utf8 ([Ljava/lang/String;)V#24 = Utf8 args#25 = Utf8 [Ljava/lang/String;#26 = Utf8 artisan#27 = Utf8 doSomething#28 = Utf8 ()I#29 = Utf8 a#30 = Utf8 b#31 = Utf8 c#32 = Utf8 <clinit>#33 = Utf8 SourceFile#34 = Utf8 Artisan.java#35 = NameAndType #15:#16 // "<init>":()V#36 = Utf8 com/gof/test/Artisan#37 = NameAndType #27:#28 // doSomething:()I#38 = Utf8 com/gof/test/User#39 = NameAndType #13:#14 // user:Lcom/gof/test/User;#40 = Utf8 java/lang/Object {public static final int FIVE;descriptor: Iflags: ACC_PUBLIC, ACC_STATIC, ACC_FINALConstantValue: int 5public static com.gof.test.User user;descriptor: Lcom/gof/test/User;flags: ACC_PUBLIC, ACC_STATICpublic com.gof.test.Artisan();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 4: 0LocalVariableTable:Start Length Slot Name Signature0 5 0 this Lcom/gof/test/Artisan;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=10: new #2 // class com/gof/test/Artisan3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: aload_19: invokevirtual #4 // Method doSomething:()I12: pop13: returnLineNumberTable:line 9: 0line 10: 8line 11: 13LocalVariableTable:Start Length Slot Name Signature0 14 0 args [Ljava/lang/String;8 6 1 artisan Lcom/gof/test/Artisan;public int doSomething();descriptor: ()Iflags: ACC_PUBLICCode:stack=2, locals=4, args_size=10: iconst_11: istore_12: iconst_23: istore_24: iload_15: iload_26: iadd7: bipush 109: imul10: istore_311: iload_312: ireturnLineNumberTable:line 13: 0line 14: 2line 15: 4line 16: 11LocalVariableTable:Start Length Slot Name Signature0 13 0 this Lcom/gof/test/Artisan;2 11 1 a I4 9 2 b I11 2 3 c Istatic {};descriptor: ()Vflags: ACC_STATICCode:stack=2, locals=0, args_size=00: new #5 // class com/gof/test/User3: dup4: invokespecial #6 // Method com/gof/test/User."<init>":()V7: putstatic #7 // Field user:Lcom/gof/test/User;10: returnLineNumberTable:line 6: 0 } SourceFile: "Artisan.java" 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人91免费 | 免费观看av网址 | 一级久久久久久 | 亚洲色成人网站www永久四虎 | 欧美成人午夜影院 | 国产精品1234区 | 色黄视频在线观看 | mm131美女视频| 免费伊人 | 亚洲精品国产精品乱码不卡 | 久久精彩视频 | 亚洲第一天堂影院 | 捆绑凌虐一区二区三区 | 国产精品久久久久久久av福利 | 美脚の诱脚舐め脚视频播放 | 在线看的av | 日本性欧美 | 久草网址| 成人免费看片载 | 欧美成人综合网站 | 免费黄色欧美 | 午夜两性视频 | 91久久电影 | 日本裸体xx少妇18在线 | 国产精品黄色片 | 蘑菇福利视频一区播放 | 久久久久女人精品毛片九一 | 蜜桃成人免费视频 | 四虎在线免费视频 | 国产黄色a | 午夜啪啪福利视频 | 国产乱子伦一区二区 | 日韩精品免费电影 | 黄a免费网络 | 国产精品视频入口 | 在线激情视频 | 欧美精品久久久久a | av片网 | 亚洲AV无码精品久久一区二区 | 伊人精品在线 | 麻豆影音先锋 | 人人妻人人澡人人爽人人dvd | 美女又爽又黄 | 大尺度做爰无遮挡露器官 | 一区二区三区日韩欧美 | 欧美一区二区三区黄片 | 都市豪门艳霸淫美妇 | 久久理论片 | jizz日本视频| 伊人久色| 69久久精品无码一区二区 | 波多野结衣中文字幕在线播放 | 亚洲久操 | 高跟鞋调教—视频|vk | 激情六月综合 | 人人cao | xxxxxx欧美| 青青精品 | 亚洲国产视频网站 | 国产乱淫a∨片免费观看 | 激情专区| 99热99| 中文字幕一本 | 波多野结衣黄色片 | 亚洲影院一区 | 尤物国产精品 | 91视频成人| 天堂av中文字幕 | 久久亚洲国产成人精品性色 | 国产免费av片在线观看 | 国内精品视频在线观看 | 国产色视频在线 | 免费成人美女女 | 激情五月网站 | 麻豆精品免费视频 | 四虎av| 天天干天天谢 | 一级淫片a | 久久亚洲AV无码 | 免费看的黄色网 | 黄色三级网站在线观看 | 88av网站 | 亚洲va国产va天堂va久久 | 久久av免费观看 | 欧美色图亚洲激情 | 性生交大片免费看3p | 麻豆影视网站 | 精品人妻一区二区三区久久 | 凹凸福利视频 | 久久躁日日躁aaaaxxxx | 91精品久久久久久综合五月天 | 草草影院网址 | 超碰在| 国产精品一二三四五 | 公侵犯一区二区三区 | 99久久影视 | 男人av在线| 一级少妇毛片 | www.97视频|