常量池:

  即class文件常量池,是class文件的一部分,用于保存编译时确定的数据。

保存的内容如下图:

  

  1. D:\java\test\out\production\test>javap -verbose mainTest
  2. Classfile /D:/java/test/out/production/test/mainTest.class
  3. Last modified 2019422日; size bytes
  4. MD5 checksum 08699c6d713bc8967a8daea381ce23c1
  5. Compiled from "mainTest.java"
  6. public class mainTest
  7. minor version:
  8. major version:
  9. flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  10. this_class: # // mainTest
  11. super_class: # // java/lang/Object
  12. interfaces: , fields: , methods: , attributes:
  13. Constant pool:
  14. # = Methodref #.# // java/lang/Object."<init>":()V
  15. # = Fieldref #.# // mainTest.age2:I
  16. # = String # // sss
  17. # = Class # // mainTest
  18. # = Class # // java/lang/Object
  19. # = Utf8 age2
  20. # = Utf8 I
  21. # = Utf8 <init>
  22. # = Utf8 ()V
  23. # = Utf8 Code
  24. # = Utf8 LineNumberTable
  25. # = Utf8 LocalVariableTable
  26. # = Utf8 this
  27. # = Utf8 LmainTest;
  28. # = Utf8 main
  29. # = Utf8 ([Ljava/lang/String;)V
  30. # = Utf8 args
  31. # = Utf8 [Ljava/lang/String;
  32. # = Utf8 name
  33. # = Utf8 Ljava/lang/String;
  34. # = Utf8 nick
  35. # = Utf8 age
  36. # = Utf8 SourceFile
  37. # = Utf8 mainTest.java
  38. # = NameAndType #:# // "<init>":()V
  39. # = NameAndType #:# // age2:I
  40. # = Utf8 sss
  41. # = Utf8 mainTest
  42. # = Utf8 java/lang/Object
  43. {
  44. public mainTest();
  45. descriptor: ()V
  46. flags: (0x0001) ACC_PUBLIC
  47. Code:
  48. stack=, locals=, args_size=
  49. : aload_0
  50. : invokespecial # // Method java/lang/Object."<init>":()V
  51. : aload_0
  52. : bipush
  53. : putfield # // Field age2:I
  54. : return
  55. LineNumberTable:
  56. line :
  57. line :
  58. LocalVariableTable:
  59. Start Length Slot Name Signature
  60. this LmainTest;
  61.  
  62. public static void main(java.lang.String[]);
  63. descriptor: ([Ljava/lang/String;)V
  64. flags: (0x0009) ACC_PUBLIC, ACC_STATIC
  65. Code:
  66. stack=, locals=, args_size=
  67. : ldc # // String sss
  68. : astore_1
  69. : ldc # // String sss
  70. : astore_2
  71. : bipush
  72. : istore_3
  73. : return
  74. LineNumberTable:
  75. line :
  76. line :
  77. line :
  78. line :
  79. LocalVariableTable:
  80. Start Length Slot Name Signature
  81. args [Ljava/lang/String;
  82. name Ljava/lang/String;
  83. nick Ljava/lang/String;
  84. age I
  85. }
  86. SourceFile: "mainTest.java"

运行时常量池:

  Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。

  类加载后,常量池中的数据会在运行时常量池中存放

  这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)

字符串常量池:

  HotSpot VM里,记录interned string的一个全局表叫做StringTable,它本质上就是个HashSet<String>。注意它只存储对java.lang.String实例的引用,而不存储String对象的内容

jdk 1.7后,移除了方法区间,运行时常量池和字符串常量池都在堆中。

JVM 常量池、运行时常量池、字符串常量池的更多相关文章

  1. JVM 内存区域 (运行时数据区域)

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性

    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...

  4. java中的编译时常量与运行时常量

    常量是程序运行期间恒定不变的量,许多程序设计语言都有某种方式,向编译器告知一块数据是恒定不变的,例如C++中的const和Java中的final. 根据编译器的不同行为,常量又分为编译时常量和运行时常 ...

  5. JVM学习笔记-运行时数据区

    不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...

  6. JVM之Java运行时数据区(线程共享区)

    JVM运行时区域各线程共享的区域包括堆区和方法区. 堆区 堆区最最主要的功能是存储对象实例[上篇也提到过],因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区.如果堆区的内存不够会出现Ou ...

  7. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...

  8. JVM内存结构——运行时数据区

    在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program C ...

  9. 1、JVM 内存模型+运行时数据区+JVM参数

    JMM(内存模型)  1.’主内存+每个线程有自己的内存 JVM运行时数据区 包含:1.程序计算器(每个线程自带):2.JAVA-STACK(每个线程自带):3.本地方法stack:4.堆:5.方法区 ...

  10. jvm内存模型(运行时数据区)

    运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...

随机推荐

  1. C# 程序异常停止后,sqlite可能变成0kb……

    解决办法就是即时备份数据库文件,启动时判断数据库文件是否为0kb,是则还原之

  2. windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 ,PING[ARC1]: Heartbeat failed to connect to standby 'orclbk'. Error is 12154

    windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 最近有需求在windows的2台oracle服务器上搭建dg,在过程中遇到了一些错误,跟在linux ...

  3. C++:函数求数根(总算写出来了。。。。)

    [问题描述] 数根问题递归求解:输入n个正整数(输入格式中第一行为整数个数n,后续行为n个整数),输出各个数的数根.数根的定义:对于一个正整数n,我们将它的各个位相加得到一个新的数字,如果这个数字是一 ...

  4. Eclipse."Courier New"字体

    1.Win 7 下eclipse添加Courier New字体 - 彦帅的博客.html(https://blog.csdn.net/theblackbeard/article/details/525 ...

  5. CentOS 6.X Python 2.6升级到Python 2.7 【转】

    前言:一些第三方框架为了降低复杂性,新的版本已经开始不支持旧版本的python,比如Django这个web框架1.8版本及以上仅仅只支持python2.7及以上版本(记忆中是这个1.8版本),pip安 ...

  6. 深入分析微博密码加密and百万级数据采集分享(登录篇)

    一.前言 此文章主要是对微博微博关键词的检索结果进行采集,但是微博的采集需要登陆,所以此程序分为登陆程序和爬虫程序两部分: 微博要实现规模性数据采集自然少不了大量账号,这就需购买大量账号以及批量登陆, ...

  7. django groupby 用法

  8. 第四周课程总结&第二次实验报告

    实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...

  9. vue组件事件(极客时间Vue视频笔记)

    vue组件核心:事件 <body> <div class="app"> <todo-list></todo-list> {{mess ...

  10. [Git] 020 stash —— Git 中的”皮姆粒子“

    0. 我准备模拟两种情况 第一种 第二种 情况简析 仓库中的最新版本发现 Bug,需要立即修复 当前在 "dev" 分支中工作到一定程度,尚不能提交,但删之可惜 ps: 在分支中没 ...