Java虚拟机常量池和本地变量表自己定义的数值自动装入常量池

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java虚拟机常量池和本地变量表自己定义的数值自动装入常量池相关的知识,希望对你有一定的参考价值。

从此文可以大体了解,

    https://blog.csdn.net/bcbobo21cn/article/details/109108970

自己的程序中定义的数值,像 int a=999; ,这样的,999这个值是自动装入虚拟机常量池的;下面来看一下具体情况是不是;

hello4.java;此程序只是定义数值,啥也不做;然后反汇编之;

public class hello4 
    public static void main(String[] args)     
        int a11 = -21474999;
        int a16 = -32769;
        int a07 = 32768;
        int a08 = 65535;
        int a09 = 65536;
        int a10 = 21474999;
    

构建;反汇编;

看一下对于每个定义的数值执行了2条指令:ldc,istore_n;

ldc: 从运行时常量池中提取数据并压入操作数栈;
istore_<n>: 将一个int类型数据保存到本地变量表中;

    也就是说,自己程序给定的数值,是自动装入了虚拟机常量池;然后用ldc放入操作数栈,用istore指令在本地变量表中再存一份;

    常量池在网上资料有很多解释;什么是本地变量表,还有一个词叫局部变量表,目前还不清楚二者的区别;

看一下下图的描述;

从这图看;每个线程有一个java虚拟机实例,其中包含一个虚拟机栈;各个类的方法调用的栈帧在虚拟机栈中;一个具体的栈帧中包含本地变量表、操作数栈等这些;本地变量表就放各种具体类型的数值; 

使用如下命令可以查看常量池;javap -verbose hello4

看 Constant pool:后面;自己程序给定的数值都在常量池中,这是自动装入的;常量池中还有一些固定的符号,如 hello4 这些;

此命令还有如下输出;

    还有一个叫行号表,LineNumberTable ,的东西;先到这里;

以上是关于Java虚拟机常量池和本地变量表自己定义的数值自动装入常量池的主要内容,如果未能解决你的问题,请参考以下文章

11.JDK8内存模型本地方法栈虚拟机栈栈帧结构(局部变量表操作数栈方法出口虚拟机栈与本地方法栈的关系寄存器方法区堆(Heap)jvm中的常量池Metaspace(元空间))

JVM第一卷

JVM常量池和运行时常量池

Java 虚拟机原理Class 字节码二进制文件分析 七 ( 局部变量表分析 )

JVM

JVM:Java内存区域