jvm模型介绍

下图是jvm内存模型图。

当java程序经过编译后编程字节码(.class文件)后进入不同平台上的java虚拟机进行解释,最后在转换成不同平台上的机器码最终得到运行。

我们来一一介绍。

1.程序计数器(Program Counter Register)(线程私有)

程序计数器是用于储存每个线程下一步将执行的jvm指令。

由于java虚拟机是通过线程轮流切换并分配处理器的执行时间来实现多线程的。

在任何一个时间段,一个处理器(如果是多核心的就是一个内核)只会处理一个线程的指令。

因此为了线程切换后可以跳到上一个线程的正确位置执行。每一个线程都需要一个独立的程序

计数器。

2.jvm栈(JVM Stack)(线程私有)

jvm栈是线程私有的,创建每一个线程的同时都会创建一个jvm栈。在该栈中,每执行一个

方法就会一个栈帧(Stack Frame),里面存放的是函数调用所需要的维护信息(局部

基本变量:【byte,short,int,long,char,boolean,float,double,对象引用,returnAddress(执行一个字节码指令的地址)】

,操作栈,动态链接,方法出口等)。

3.堆(heap)(线程共享)

它是JVM用来储存对象实例以及数组值的区域,每个对象实例包含与之对应的类信息。堆在java虚拟就启动时就创建了。

堆是垃圾收集管理(gc)的主要区域。

从内存回收角度看:堆可被分为新生代和老年代,细致点有Eden空间,From Survivor空间,To Survivor空间

堆可以处于物理不连续内存空间中。

在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx

和-Xms 控制)。

4.方法区(Method Area)(线程共享)

方法区域储存了所加载的类的信息(名称,修饰符,包等),类中的静态变量,类中定义的final常量。java虚拟机规范把方法区

描述为堆的逻辑部分

5.运行时常量池(Runtime Constant Pool)

方法区的一部分,.class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池(Constant Pool Table),

用于储存编译时产生的各种字面量(由数字或字母构成的数值或字符串,出现在等式右边)和引用,这部分内容将在类加载后存放

到方法区的运行时常量池中。

6.本地方法栈(Native Method Stacks)

 本地方法栈支持native方法的执行。

猜你喜欢

转载自www.cnblogs.com/zhengxq21/p/9944414.html
今日推荐