[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fsM4ex5TMpfDDpNrCjrD3HjnfS0nPiMWO0ood8v5hWL0":3,"markdown-ayi5":32},{"enableAds":4,"enableAdsVpn":4,"enableAdsVps":4,"ads":5,"userConfig":30,"bookConfig":31},null,[6,12,18,24],{"id":7,"title":8,"description":9,"link":10,"image":11},2,"全球最便宜的VPS云服务器(13元/月)","1核1G内存30G SSD，每月1TB流量，美国节点，可以用来部署专属VPN、小型网站、博客。","https://cgfw.top/selfvpn.html","https://alltool.top/image/detail/cloudcone_favicon.png",{"id":13,"title":14,"description":15,"link":16,"image":17},1,"阿里云99元/年服务器专享购买链接","2核2G内存40G SSD云服务器，3M带宽，1个外网IPv4地址，超高性价比！","https://www.cnblogs.com/haws/p/18582641/aliyun79","https://img.alicdn.com/tfs/TB1_ZXuNcfpK1RjSZFOXXa6nFXa-32-32.ico",{"id":19,"title":20,"description":21,"link":22,"image":23},5,"EPUB、PDF电子书阅读器下载","免费下载电子书阅读器，支持Windows、安卓、IOS、MacOS等系统","https://pan.xunlei.com/s/VOLZuDZRhtvQUgIxeq96Mu9pA1?pwd=abn7","https://alltool.top/image/detail/ebook.png",{"id":25,"title":26,"description":27,"link":28,"image":29},3,"Adobe Acrobat Pro 2025破解版","最强PDF工具，支持编辑、签名、加密、OCR识别等25种功能。","https://www.cnblogs.com/haws/p/18686608/adobeAcrobat","https://alltool.top/image/detail/adobe_acrobat.png","{\"enableResourceRequest\":true,\"enableAds\":true,\"enableAdsVpn\":false,\"enableAdsVps\":true,\"indexTopCount\":15,\"indexTopLatestCount\":15,\"indexStickCount\":10,\"indexLatestCount\":20}","{\"bookQa\":[{\"question\":\"不知道提取码？\",\"answer\":\"点击下载会自动复制“提取码”，弹窗里也会显示“提取码”\"},{\"question\":\"如何下载？\",\"answer\":\"先将文件夹转存到自己的网盘（一定要转存整个文件夹，否则文件更新不会提醒），然后在网盘下载文件\"},{\"question\":\"不知道下载哪种格式？\",\"answer\":\"移动端阅读推荐EPUB格式；电脑端如果阅读技术书籍，推荐PDF，阅读文学作品推荐EPUB格式。\"},{\"question\":\"个别PDF文档预览一直提示“文档打开失败”\",\"answer\":\"网盘自身问题，下载后可正常阅读。也可先转存到自己的网盘，再用客户端预览。\"},{\"question\":\"每天的下载次数是多少？\",\"answer\":\"每人每天可以下载5本不同的书籍，已经下载过的不占用下载次数。⚠️通过技术手段恶意频繁下载会被封禁！\"}]}",{"ast":33,"blog":824},{"data":34,"body":36,"toc":816},{"title":35,"description":35},"",{"type":37,"children":38},"root",[39,77,85,91,96,104,109,116,129,134,140,153,180,196,202,207,219,224,266,271,276,318,324,336,354,360,372,380,392,409,422,432,443,450,463,468,481,494,498,512,517,531,552,558,592,617,659,684,690,706,724,741,752,758,789,800],{"type":40,"tag":41,"props":42,"children":43},"element","blockquote",{},[44,51],{"type":40,"tag":45,"props":46,"children":47},"p",{},[48],{"type":49,"value":50},"text","参考内容：",{"type":40,"tag":52,"props":53,"children":54},"ul",{},[55,68],{"type":40,"tag":56,"props":57,"children":58},"li",{},[59],{"type":40,"tag":60,"props":61,"children":65},"a",{"href":62,"rel":63},"https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html#jvms-2.5",[64],"nofollow",[66],{"type":49,"value":67},"《Java Se11 虚拟机规范》",{"type":40,"tag":56,"props":69,"children":70},{},[71],{"type":40,"tag":60,"props":72,"children":74},{"href":73},"/book/4a7b1e927469414e95d81782f45ead63#blog",[75],{"type":49,"value":76},"《深入理解Java虚拟机-JVM高级特性与最佳实践 第3版》- 周志明",{"type":40,"tag":41,"props":78,"children":79},{},[80],{"type":40,"tag":45,"props":81,"children":82},{},[83],{"type":49,"value":84},"本文基于Java Se 11讲解，后续版本 JVM （JDK 17、JDK 21 等）内存区域结构没有发生过变化。",{"type":40,"tag":86,"props":87,"children":89},"h3",{"id":88},"总览",[90],{"type":49,"value":88},{"type":40,"tag":45,"props":92,"children":93},{},[94],{"type":49,"value":95},"根据《Java虚拟机规范》的规定，Java虚拟机所管理的内存将会包括以下几个运行时数据区域：",{"type":40,"tag":45,"props":97,"children":98},{},[99],{"type":40,"tag":100,"props":101,"children":103},"img",{"alt":35,"src":102},"https://alltool.top/image/blog/ayi5/1537734-20221109211236619-559927445.png",[],{"type":40,"tag":45,"props":105,"children":106},{},[107],{"type":49,"value":108},"对于不同的虚拟机实现，在运行时数据区的实现上并不完全相同。对于常用的HotSpot虚拟机来说，它的运行时数据区如下：",{"type":40,"tag":45,"props":110,"children":111},{},[112],{"type":40,"tag":100,"props":113,"children":115},{"alt":35,"src":114},"https://alltool.top/image/blog/ayi5/1537734-20221109211341739-1038440267.png",[],{"type":40,"tag":45,"props":117,"children":118},{},[119,121,127],{"type":49,"value":120},"主要区别在于，HotSpot使用了直接使用本地内存（即机器本身内存）的",{"type":40,"tag":122,"props":123,"children":124},"strong",{},[125],{"type":49,"value":126},"元空间",{"type":49,"value":128},"（metaspace）来实现方法区。",{"type":40,"tag":45,"props":130,"children":131},{},[132],{"type":49,"value":133},"下面针对每个具体的数据区域进行详细的介绍。",{"type":40,"tag":86,"props":135,"children":137},{"id":136},"_1-程序计数器",[138],{"type":49,"value":139},"1. 程序计数器",{"type":40,"tag":45,"props":141,"children":142},{},[143,145,151],{"type":49,"value":144},"程序计数器（",{"type":40,"tag":146,"props":147,"children":148},"em",{},[149],{"type":49,"value":150},"Program Counter Register",{"type":49,"value":152},"）是一块较小的内存空间，它可以看作是当前线程所执行的字节码的行号指示器。",{"type":40,"tag":45,"props":154,"children":155},{},[156,158,170,172,178],{"type":49,"value":157},"JVM可以同时支持多个执行线程。每个Java虚拟机线程都有自己的pc（程序计数器）寄存器。在任何时候，每个Java虚拟机线程都在执行单个方法的代码，即该线程的当前方法。",{"type":40,"tag":122,"props":159,"children":160},{},[161,163],{"type":49,"value":162},"如果该方法不是native方法，则pc寄存器包含当前正在执行的Java虚拟机指令的地址。如果线程当前正在执行的方法是native的，则pc寄存器的值为",{"type":40,"tag":164,"props":165,"children":167},"code",{"className":166},[],[168],{"type":49,"value":169},"undefined",{"type":49,"value":171},"。Java虚拟机的pc寄存器足够宽，可以容纳特定平台上的",{"type":40,"tag":164,"props":173,"children":175},{"className":174},[],[176],{"type":49,"value":177},"returnAddress",{"type":49,"value":179},"或native指针。",{"type":40,"tag":45,"props":181,"children":182},{},[183,194],{"type":40,"tag":122,"props":184,"children":185},{},[186,188],{"type":49,"value":187},"此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何",{"type":40,"tag":164,"props":189,"children":191},{"className":190},[],[192],{"type":49,"value":193},"OutOfMemoryError",{"type":49,"value":195}," 情况的区域。",{"type":40,"tag":86,"props":197,"children":199},{"id":198},"_2-java虚拟机栈",[200],{"type":49,"value":201},"2. Java虚拟机栈",{"type":40,"tag":45,"props":203,"children":204},{},[205],{"type":49,"value":206},"与程序计数器一样，是线程私有的，生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型。",{"type":40,"tag":45,"props":208,"children":209},{},[210,212,217],{"type":49,"value":211},"「虚拟机栈」里面的每条数据就是「",{"type":40,"tag":122,"props":213,"children":214},{},[215],{"type":49,"value":216},"栈帧",{"type":49,"value":218},"」，在 Java 方法执行的时候则创建一个「栈帧」并入栈「虚拟机栈」。调用结束则「栈帧」出栈。",{"type":40,"tag":45,"props":220,"children":221},{},[222],{"type":49,"value":223},"每个栈帧包含四个区域：",{"type":40,"tag":225,"props":226,"children":227},"ol",{},[228,238,248,258],{"type":40,"tag":56,"props":229,"children":230},{},[231,236],{"type":40,"tag":122,"props":232,"children":233},{},[234],{"type":49,"value":235},"局部变量表",{"type":49,"value":237},"：存储了方法执行过程中需要用到的所有局部变量",{"type":40,"tag":56,"props":239,"children":240},{},[241,246],{"type":40,"tag":122,"props":242,"children":243},{},[244],{"type":49,"value":245},"操作数栈",{"type":49,"value":247},"：暂存变量，通过变量的入栈、出栈等操作来执行计算",{"type":40,"tag":56,"props":249,"children":250},{},[251,256],{"type":40,"tag":122,"props":252,"children":253},{},[254],{"type":49,"value":255},"动态连接",{"type":49,"value":257},"：翻译符号引用为直接引用，即把一个字面量翻译为运行时的一个地址引用",{"type":40,"tag":56,"props":259,"children":260},{},[261],{"type":40,"tag":122,"props":262,"children":263},{},[264],{"type":49,"value":265},"返回地址",{"type":40,"tag":45,"props":267,"children":268},{},[269],{"type":49,"value":270},"每个线程拥有一个「虚拟机栈」，每个「虚拟机栈」拥有多个「栈帧」，而栈帧则对应着一个方法。每个「栈帧」包含局部变量表、操作数栈、动态链接、方法返回地址。方法运行结束则意味着该「栈帧」出栈。",{"type":40,"tag":45,"props":272,"children":273},{},[274],{"type":49,"value":275},"在《Java虚拟机规范》中，对这个内存区域规定了两类异常状况：",{"type":40,"tag":225,"props":277,"children":278},{},[279,292],{"type":40,"tag":56,"props":280,"children":281},{},[282,284,290],{"type":49,"value":283},"如果线程请求的栈深度大于虚拟机所允许的深度，将抛出",{"type":40,"tag":164,"props":285,"children":287},{"className":286},[],[288],{"type":49,"value":289},"StackOverflowError",{"type":49,"value":291},"异常；",{"type":40,"tag":56,"props":293,"children":294},{},[295,297,302,304,309,311,316],{"type":49,"value":296},"如果Java虚拟机栈容量可以动态扩展(HotSpot虚拟机的栈容量不能动态扩展)，",{"type":40,"tag":122,"props":298,"children":299},{},[300],{"type":49,"value":301},"当栈尝试扩展时无法申请到足够的内存",{"type":49,"value":303},"，",{"type":40,"tag":122,"props":305,"children":306},{},[307],{"type":49,"value":308},"或为一个新线程初始化JVM栈时没有足够的内存时",{"type":49,"value":310},"会抛出",{"type":40,"tag":164,"props":312,"children":314},{"className":313},[],[315],{"type":49,"value":193},{"type":49,"value":317},"异常。",{"type":40,"tag":86,"props":319,"children":321},{"id":320},"_3-本地方法栈",[322],{"type":49,"value":323},"3. 本地方法栈",{"type":40,"tag":45,"props":325,"children":326},{},[327,329,334],{"type":49,"value":328},"本地方法栈（Native Method Stacks）与虚拟机栈所发挥的作用是非常相似的，其区别只是虚拟机栈为虚拟机执行Java方法（也就是字节码）服务，而",{"type":40,"tag":122,"props":330,"children":331},{},[332],{"type":49,"value":333},"本地方法栈则是为虚拟机使用到的本地（Native）方法服务",{"type":49,"value":335},"。",{"type":40,"tag":45,"props":337,"children":338},{},[339,341,346,348,353],{"type":49,"value":340},"《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规定，因此具体的虚拟机可以根据需要自由实现它，甚至有的Java虚拟机（譬如Hot-Spot虚拟机）直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样，本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出",{"type":40,"tag":164,"props":342,"children":344},{"className":343},[],[345],{"type":49,"value":289},{"type":49,"value":347},"和",{"type":40,"tag":164,"props":349,"children":351},{"className":350},[],[352],{"type":49,"value":193},{"type":49,"value":317},{"type":40,"tag":86,"props":355,"children":357},{"id":356},"_4-java堆",[358],{"type":49,"value":359},"4. Java堆",{"type":40,"tag":45,"props":361,"children":362},{},[363,365,370],{"type":49,"value":364},"所有线程共享，虚拟机启动时创建。",{"type":40,"tag":122,"props":366,"children":367},{},[368],{"type":49,"value":369},"唯一的目的是用于存放对象实例和数组",{"type":49,"value":371},"，绝大部分对象实例在堆上分配内存。",{"type":40,"tag":41,"props":373,"children":374},{},[375],{"type":40,"tag":45,"props":376,"children":377},{},[378],{"type":49,"value":379},"在 Java 中，数组也是对象。",{"type":40,"tag":45,"props":381,"children":382},{},[383,385,390],{"type":49,"value":384},"现代垃圾收集器大部分基于",{"type":40,"tag":122,"props":386,"children":387},{},[388],{"type":49,"value":389},"分代收集理论",{"type":49,"value":391},"设计。“新生代”、“老年代”这些名词仅仅是一部分GC的设计风格，而不是《Java虚拟机规范》定义的。而从G1收集器出现之后，出现了不采用分代设计的新垃圾收集器。",{"type":40,"tag":45,"props":393,"children":394},{},[395,408],{"type":40,"tag":122,"props":396,"children":397},{},[398,400,406],{"type":49,"value":399},"JDK8之后Class对象、",{"type":40,"tag":164,"props":401,"children":403},{"className":402},[],[404],{"type":49,"value":405},"static",{"type":49,"value":407},"变量、字符串常量池都放在堆里",{"type":49,"value":335},{"type":40,"tag":41,"props":410,"children":411},{},[412],{"type":40,"tag":45,"props":413,"children":414},{},[415,420],{"type":40,"tag":164,"props":416,"children":418},{"className":417},[],[419],{"type":49,"value":405},{"type":49,"value":421},"变量作为类的信息，存储在Class对象里。",{"type":40,"tag":45,"props":423,"children":424},{},[425,427],{"type":49,"value":426},"Java 的对象可以分为基本数据类型和普通对象。普通对象会在堆上分配。**对于基本数据类型，如果是局部变量，则会在栈上分配。**其他情况，通常在在堆上分配，",{"type":40,"tag":122,"props":428,"children":429},{},[430],{"type":49,"value":431},"逃逸分析的情况下可能会在栈分配。",{"type":40,"tag":45,"props":433,"children":434},{},[435,437,442],{"type":49,"value":436},"如果在Java堆中没有内存完成实例分配，并且堆也无法再扩展时，Java虚拟机将会抛出",{"type":40,"tag":164,"props":438,"children":440},{"className":439},[],[441],{"type":49,"value":193},{"type":49,"value":317},{"type":40,"tag":444,"props":445,"children":447},"h4",{"id":446},"_41-字符串常量池",[448],{"type":49,"value":449},"4.1 字符串常量池",{"type":40,"tag":45,"props":451,"children":452},{},[453,455,461],{"type":49,"value":454},"字符串常量池是由",{"type":40,"tag":164,"props":456,"children":458},{"className":457},[],[459],{"type":49,"value":460},"String",{"type":49,"value":462},"类维护的一个字符串池。是一种池化思想的实现，是为了节省重复创建字符串对象的性能开销和内存空间。",{"type":40,"tag":45,"props":464,"children":465},{},[466],{"type":49,"value":467},"每当代码创建字符串常量时，JVM会首先检查字符串常量池。如果字符串已经存在池中，就返回池中的实例引用。如果字符串不在池中，就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的，可以不用担心数据冲突进行共享。",{"type":40,"tag":41,"props":469,"children":470},{},[471],{"type":40,"tag":45,"props":472,"children":473},{},[474,479],{"type":40,"tag":122,"props":475,"children":476},{},[477],{"type":49,"value":478},"字符串常量池",{"type":49,"value":480},"从JDK7开始挪到了堆中。",{"type":40,"tag":45,"props":482,"children":483},{},[484,486,492],{"type":49,"value":485},"可以通过调用",{"type":40,"tag":164,"props":487,"children":489},{"className":488},[],[490],{"type":49,"value":491},"String.intern()",{"type":49,"value":493},"方法把一个字符串对象放到字符串常量池中。如果池中已经存在相等的对象，则会返回已存在对象的引用；否则会把这个字符串对象加入到池中，并返回新加入的字符串对象的引用。",{"type":40,"tag":495,"props":496,"children":497},"hr",{},[],{"type":40,"tag":45,"props":499,"children":500},{},[501],{"type":40,"tag":122,"props":502,"children":503},{},[504,510],{"type":40,"tag":164,"props":505,"children":507},{"className":506},[],[508],{"type":49,"value":509},"String s = new String(\"hello\")",{"type":49,"value":511},"会创建几个对象？",{"type":40,"tag":45,"props":513,"children":514},{},[515],{"type":49,"value":516},"如果字符串常量池中没有\"hello\"，则生成2个，否则只生成一个。",{"type":40,"tag":45,"props":518,"children":519},{},[520],{"type":40,"tag":122,"props":521,"children":522},{},[523,529],{"type":40,"tag":164,"props":524,"children":526},{"className":525},[],[527],{"type":49,"value":528},"String s = new String(\"abc\"); System.out.println((s.intern() == s));",{"type":49,"value":530},"打印结果是什么？",{"type":40,"tag":45,"props":532,"children":533},{},[534,536,542,544,550],{"type":49,"value":535},"打印结果为false。",{"type":40,"tag":164,"props":537,"children":539},{"className":538},[],[540],{"type":49,"value":541},"s",{"type":49,"value":543},"指向的是堆中的对象，",{"type":40,"tag":164,"props":545,"children":547},{"className":546},[],[548],{"type":49,"value":549},"s.intern()",{"type":49,"value":551},"返回的是字符串常量池中的对象的引用。",{"type":40,"tag":444,"props":553,"children":555},{"id":554},"_42-字面量和常量",[556],{"type":49,"value":557},"4.2 字面量和常量",{"type":40,"tag":45,"props":559,"children":560},{},[561,566,568,574,576,582,584,590],{"type":40,"tag":122,"props":562,"children":563},{},[564],{"type":49,"value":565},"字面量(literal)",{"type":49,"value":567}," ：用于表达源码中的一个固定值的符号(notation)。如整数、浮点数及字符串等。如",{"type":40,"tag":164,"props":569,"children":571},{"className":570},[],[572],{"type":49,"value":573},"1",{"type":49,"value":575},"、",{"type":40,"tag":164,"props":577,"children":579},{"className":578},[],[580],{"type":49,"value":581},"0x01",{"type":49,"value":583},"是整数字面量，",{"type":40,"tag":164,"props":585,"children":587},{"className":586},[],[588],{"type":49,"value":589},"Hello World",{"type":49,"value":591},"是字符串字面量。",{"type":40,"tag":45,"props":593,"children":594},{},[595,600,602,608,610,615],{"type":40,"tag":122,"props":596,"children":597},{},[598],{"type":49,"value":599},"常量",{"type":49,"value":601},"：在java中，",{"type":40,"tag":164,"props":603,"children":605},{"className":604},[],[606],{"type":49,"value":607},"final",{"type":49,"value":609},"修饰的变量也可以被称为是常量。任何具有不变性的东西都可以称为常量。如",{"type":40,"tag":164,"props":611,"children":613},{"className":612},[],[614],{"type":49,"value":460},{"type":49,"value":616},"对象是常量。",{"type":40,"tag":45,"props":618,"children":619},{},[620,625,627,633,635,641,643,649,651,657],{"type":40,"tag":122,"props":621,"children":622},{},[623],{"type":49,"value":624},"对象池",{"type":49,"value":626},"：是Java语言层面实现的，如",{"type":40,"tag":164,"props":628,"children":630},{"className":629},[],[631],{"type":49,"value":632},"Integer.valueOf()",{"type":49,"value":634},"（",{"type":40,"tag":164,"props":636,"children":638},{"className":637},[],[639],{"type":49,"value":640},"Integer i = 10",{"type":49,"value":642},"也会调该方法）会使用",{"type":40,"tag":164,"props":644,"children":646},{"className":645},[],[647],{"type":49,"value":648},"IntegerCache",{"type":49,"value":650},"的缓存对象。如果使用",{"type":40,"tag":164,"props":652,"children":654},{"className":653},[],[655],{"type":49,"value":656},"new Integer(10)",{"type":49,"value":658},"则不会使用对象池中的实例。",{"type":40,"tag":45,"props":660,"children":661},{},[662,666,668,674,676,682],{"type":40,"tag":122,"props":663,"children":664},{},[665],{"type":49,"value":478},{"type":49,"value":667},"：类似于对象池，但它是JVM层面的技术。字符串常量池的实现是c++实现的",{"type":40,"tag":164,"props":669,"children":671},{"className":670},[],[672],{"type":49,"value":673},"StringTable",{"type":49,"value":675},"，实际上是一个固定容量的",{"type":40,"tag":164,"props":677,"children":679},{"className":678},[],[680],{"type":49,"value":681},"Hashtable",{"type":49,"value":683},"，每一个bucket包含一系列相同hash码的字符串。",{"type":40,"tag":86,"props":685,"children":687},{"id":686},"_5-方法区",[688],{"type":49,"value":689},"5. 方法区",{"type":40,"tag":45,"props":691,"children":692},{},[693,698,700,705],{"type":40,"tag":122,"props":694,"children":695},{},[696],{"type":49,"value":697},"用于存储被JVM加载的class的元数据信息",{"type":49,"value":699},"，比如类的结构、运行时的常量池、字段、常量、方法数据、方法构造函数以及接口初始化等特殊方法。",{"type":40,"tag":122,"props":701,"children":702},{},[703],{"type":49,"value":704},"还有JIT编译器编译后的代码缓存等数据",{"type":49,"value":335},{"type":40,"tag":45,"props":707,"children":708},{},[709,711,722],{"type":49,"value":710},"JDK8之前，HotSpot采用永久代的概念实现方法区，JDK8开始废弃了永久代的概念，改用在",{"type":40,"tag":122,"props":712,"children":713},{},[714,716,721],{"type":49,"value":715},"本地内存(Native Memory)",{"type":40,"tag":122,"props":717,"children":718},{},[719],{"type":49,"value":720},"中实现的",{"type":49,"value":126},{"type":49,"value":723},"(Meta-space)来代替。",{"type":40,"tag":45,"props":725,"children":726},{},[727,729,734,735,740],{"type":49,"value":728},"方法区的GC比较少出现，回收目标主要是",{"type":40,"tag":122,"props":730,"children":731},{},[732],{"type":49,"value":733},"针对常量池的回收",{"type":49,"value":347},{"type":40,"tag":122,"props":736,"children":737},{},[738],{"type":49,"value":739},"对类型的卸载",{"type":49,"value":335},{"type":40,"tag":45,"props":742,"children":743},{},[744,746,751],{"type":49,"value":745},"根据《Java虚拟机规范》的规定，如果方法区无法满足新的内存分配需求时，将抛出",{"type":40,"tag":164,"props":747,"children":749},{"className":748},[],[750],{"type":49,"value":193},{"type":49,"value":317},{"type":40,"tag":444,"props":753,"children":755},{"id":754},"_51-运行时常量池",[756],{"type":49,"value":757},"5.1 运行时常量池",{"type":40,"tag":45,"props":759,"children":760},{},[761,766,768,773,775,780,782,787],{"type":40,"tag":122,"props":762,"children":763},{},[764],{"type":49,"value":765},"运行时常量池（Runtime Constant Pool）是方法区的一部分",{"type":49,"value":767},"。Class文件中除了有类的版本、字段、方法、接口等描述信息外，还有一项信息是",{"type":40,"tag":122,"props":769,"children":770},{},[771],{"type":49,"value":772},"常量池表",{"type":49,"value":774},"（Constant Pool Table），用于存放编译期生成的各种",{"type":40,"tag":122,"props":776,"children":777},{},[778],{"type":49,"value":779},"字面量",{"type":49,"value":781},"与",{"type":40,"tag":122,"props":783,"children":784},{},[785],{"type":49,"value":786},"符号引用",{"type":49,"value":788},"，这部分内容将在类加载后存放到方法区的运行时常量池中。",{"type":40,"tag":45,"props":790,"children":791},{},[792,794,799],{"type":49,"value":793},"一般来说，",{"type":40,"tag":122,"props":795,"children":796},{},[797],{"type":49,"value":798},"除了保存Class文件中描述的符号引用外，还会把由符号引用翻译出来的直接引用也存储在运行时常量池中",{"type":49,"value":335},{"type":40,"tag":45,"props":801,"children":802},{},[803,805,810,812],{"type":49,"value":804},"既然运行时常量池是方法区的一部分，自然受到方法区内存的限制，当常量池无法再申请到内存时会抛出",{"type":40,"tag":164,"props":806,"children":808},{"className":807},[],[809],{"type":49,"value":193},{"type":49,"value":811},"异常。\n",{"type":40,"tag":100,"props":813,"children":815},{"alt":35,"src":814},"https://alltool.top/image/blog/ayi5/1537734-20221109211359949-959800504.png",[],{"title":35,"searchDepth":7,"depth":7,"links":817},[818,819,820,821,822,823],{"id":88,"depth":25,"text":88},{"id":136,"depth":25,"text":139},{"id":198,"depth":25,"text":201},{"id":320,"depth":25,"text":323},{"id":356,"depth":25,"text":359},{"id":686,"depth":25,"text":689},{"code":825,"title":826,"seoTitle":4,"tags":827,"categoryIds":828,"categoryNames":831,"description":834,"seoDescription":4,"estimateReadingMinutes":835,"publishDate":836,"createTime":837,"updateTime":838,"coverImageUrl":839,"author":4,"pv":840,"seoKeywords":4},"ayi5","JVM11运行时数据区域详解",[],[829,830],772,775,[832,833],"编程","Java开发","本文基于Java Se 11讲解。根据《Java虚拟机规范》的规定，Java虚拟机所管理的内存将会包括以下几个运行时数据区域：对于不同的虚拟机实现，在运行时数据区的实现上并不完全相同。对于常用的HotSpot虚拟机来说，它的运行时数据区如下：主要区别在于，HotSpot使用了直接使用本地内存（即机器本身内存）的元空间（metaspace）来实现方法区。",13,"2025-06-30","2025-06-30 12:25:52","2025-08-07 15:29:55","/image/blog/ayi5/1537734-20221109211236619-559927445.png",9]