一个java程序运行时,数据都是存放在内存中的,要记住,是运行时,编译的时候(非运行时),数据是存放在class文件中的。
运行时数据区分为以下几个:
1、方法区
方法区是线程共享的,运行时,里面存放的是类加载时的信息,常量,静态变量,JIT编译后的代码数据。它包含了另一个东西-运行时常量池。运行时常量池存放字面量和符号引用
2、方法栈(虚拟机栈)
方法栈是线程私有的,运行时,没运行一个方法,就生成一个栈帧,每个栈帧里面存放着这个方法的局部变量表,操作数栈、动态链接、方法出口等信息。
4、程序计数器
程序计数器是线程私有的,任何一个确定的时候,jvm只会执行一条指令(单核),它表示当前线程下一条要执行的指令的地址。
5、堆
其中,线程私有的区域有 程序计数器 、 方法栈 2个。
这里要说到一个 运行时常量池和class常量池的区别,编译期间,数据都存放在class文件中,class文件中包含一个东西,就是常量池。当程序运行时,class文件中的常量池内容放到运行时常量池中。String的intern能够在运行时把新的常量放入运行时常量池中。