JVM运行时的数据区
java虚拟机运行时的数据区总结:
1、程序计数器(线程私有):
当前线程执行的字节码的行号指示器。占用较小的内存空间。Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。
为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Nat ive)方法,这个计数器值则应为空。
2、java虚拟机栈(线程私有,生命周期与线程相同):
每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。
3、本地方法栈(线程私有):
本地方法栈与虚拟机栈所发挥的作用是非常相似的,区别:虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
4、java堆(线程共享,jvm管理的内存中最大的一块):
java堆在虚拟机启动时创建!此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的内存区域,也叫GC堆。
《Java虚拟机规范》规定:Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这点就像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。
5、方法区(线程共享)
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
6、运行时常量池(方法区的一部分):
常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,这种特性被开发人员利用得比较多的便是String 类的 intern()方法。