老李分享:jvm结构简介 2

2.2.4 Program counter regsiters:程序计数器

            类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined

    

    

2.2.5 Java stack:虚拟机栈

    虚拟机栈也是线程私有的,创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。

       如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常

    每一个线程都会

    栈帧:

       1.局部变量区

        局部变量区被组织一个一个从0开始的字数组,byte、short、char在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true,long和double占据两个字长。

       2.操作数栈

        操作数栈也被组织为一个字数组,但不同于局部变量区,它不是通过数组下标访问的,而是能过栈的Push和Pop操作,前一个操作Push进的数据可以被下一个操作Pop出来使用。

       3.栈数据区

                    a)         常量池中的数据解析

                    b)        方法执行完后处理方法返回,会恢复调用方法现场

                    c) 方法执行过程中抛出异常时的异常处理,存储有一个异常表,当出现异常时虚拟机查找相应的异常表看是否有对应的Catch语句,如果没有就抛出异常终止

      

2.3  Execution Engine 运行引擎

             JIT Compiler: just-in-time Compiler及时编译

             Garbage Collector:垃圾回收

三.JVM运行

        这里非常粗糙的模拟下jvm的运行方式

原文地址:https://www.cnblogs.com/poptest/p/5064116.html