java运行时数据区域,堆、栈、方法区、寄存器内容

JVM内存模型包含如下几块:
程序计数器:
JVM为每个线程维护一个程序计数器,这块区域属于线程独立享有,线程之间互不影响,如果调用的是java方法,则程序计数器中存储的是下一个要执行的字节码指令的地址
栈:
也属于线程私有的内容,描述的是JVM方法的内存模型,每执行一个方法时都会往栈中压入一个帧,这个帧中存储了方法的局部变量表,操作数栈,动态链接和方法出口等信息。我们常说得虚拟机栈指的是局部变量表部分,局部变量表中存储了各种编译期可知的基本类型,引用类型和returnAddress(指向一条字节码指令的地址)。局部变量表所需的空间在编译期间完成分配,运行期间不会改变局部变量表的大小
堆:
属于线程共享的内容,在JVM规范中描述道所有的对象和数组都在此分配。但随着JIT的优化,栈上分配、标量替换等技术的成熟,这个理论也变得不那么绝对了。由于垃圾收集器都采用分代收集法,所以堆又分为了新生代和老年代,新生代又分为Eden,from survivor和to survivor区。从内存分配的角度看,又可以划分出多个线程私有的分配缓冲区。当然,无论怎么划分,堆中存储的依然是对象实例,划 分只是为了更好的进行对象内存分配以及对象内存回收
    方法区:
        和java堆一样,也属于线程共享的区域,存放的是java的类型信息,静态变量,常量以及jit编译后的代码等数据
        运行时常量池:
    class文件中除了包含类的版本,类名,字段,方法,接口等信息,还包含了常量池,这里面存放了编译期产生的各种 字面量以及符号引用,在类加载后进入方法区的运行时常量池中,运行时常量池相对于class常量池一个重要的特征是动态性,在运行期间也可以将新的常量放入其中,用的较多的就是String的intern方法

                       符号引用:类接口的全限定名,字段和方法的名称以及描述符;在对java文件进行编译的过程中,并不会向C语言那样有连接这一步,也就是说class文件中不会存储方法、字段的最终内存布局信息,所以符号引用是不能被虚拟机直接使用的,虚拟机会在加载类时动态的去获取常量池中的符号引用,然后解析到对应的内存地址中,才可以使用

                        字面量:比较接近于常量的概念,如文本字符串,声明为final的常量值等。

    

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/80597045