Jvm分区,运行时数据区域

运行时数据区域:

  1. 方法区(Method Area)
  2. 虚拟机栈(VM Stack)
  3. 本地方法栈(Native Method Stack)
  4. 堆(Heap)
  5. 程序计数器(Program Counter Register)

程序计数器

相当于一块小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器就是通过改变这个计数器的值来选取下一条的要执行的字节码指令,包括分支,循环,异常处理等。

java中多线程任务是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何时刻,一个处理器都只会执行一个线程中的指令,因此,为了线程切换后能找到正确的执行位置,每一条线程都需要一个独立的程序计数器,各个程序计数器间互不影响,独立存储。

虚拟机栈

虚拟机栈与程序计数器一样,都是线程私有的,他的生命周期与线程相同。

虚拟机描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,存储局部变量表,操作数栈,动态链接等。局部变量表中存放了编译期可知的基本数据类型(byte,short,int long,float,double,char,boolean),对象引用(reference类型)和returnAddress类型(指向了一条字节码指令的地址)。

本地方法栈

本地方法栈与虚拟机栈所发挥的作用相似,但是虚拟机栈中执行的是Java方法(字节码)服务,而本地方法栈为虚拟机使用的Native(本地)方法服务。

堆是java虚拟机所管理的内存中最大的一块,java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一作用是存放实例对象。(某种程度上可以说所有的实例对象以及数组都要在堆上分配)

堆是垃圾收集器管理的主要区域,也成为GC堆。从内存回收的角度看,采用分代收集算法:新生代和老年代。从内存分配的角度看,线程共享的java堆可能划分出多个线程私有的分配缓冲区。但是无论如何划分,都与存放内容无关,存储的都是实例对象。进一步的划分只是为了更好的回收。

java堆可以处理物理上的不连续内存空间,只要逻辑上是连续的即可。

方法区

方法区与堆一样,是各个线程共享的内存区域,存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码,很多人成方法区为永久代,本质上是不一样的,只是使用永久代来实现方法区,这样可以像管理堆一样管理这部分内存,省去专门为方法区编写管理内存代码的工作。

运行时常量池:

他也是方法区的一部分,Class文件中除了有类的版本,字段方法,接口等,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,这部分经过类加载后进入方法区的运行时常量池存放运行时常量池还具有动态性,并不要求常量在编译期才能产生,在运行时也可以将新的常量放入池中,用的较多的是String类中的intern()方法。

   

猜你喜欢

转载自blog.csdn.net/weixin_43844810/article/details/85624566