Java虚拟机内存模型

    Java虚拟机内存模型使Java程序运行的基础,毕竟所有的程序都需要使用内存,这就需要Java虚拟机专门设计内存使用方式。Java虚拟机在执行Java程序的过程会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。
     Java虚拟机将其内存数据分为程序计数器,虚拟机栈,本地方法栈,Java堆,方法区等五个部分。

    程序计数器用于存放下一条运行的指令。                    
    虚拟机栈和本地方法栈用于存放函数调用信息。

    Java堆用于存放Java程序运行时所需的对象等数据。
    方法区用于存放程序的类单元数据信息。

    线程共享区域:堆内存区,方法区,运行时常量池。
多线程:当线程数量超过CPU数量时,线程之间会自动根据时间片轮询方式抢夺CPU资源。

 Java虚拟机规范允许Java栈的大小时动态的或者是固定不变的。在Java虚拟机规范中定义了两种异常跟栈空间有关。即StackoverFlowError和OutofMemoryError。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度。则程序运行过程会抛出StackoverFlowError异常。如果Java栈可用动态开展,而在开展栈的过程中没有足够的内存空间来支持栈的发展,则程序运行过程会抛出OutofMemoryError异常。
    Java虚拟机栈内部结构:

            栈帧:保存上下文数据。存放了局部变量表,操作数栈,动态连接方法和返回地址等信息。
       栈帧有三部分组成。即局部变量区,操作数栈和帧数据区。
            局部变量区被定义为一个从0开始的数字数组。byte,short,char在存储前被转化为int,Boolean也被转换为int,0表示false,其他表示true,long和double占两个字长。局部变量区是通过数组下标访问的。
    操作数站也被组织为一个数字数组,但他不是通过数组下标访问的。而是通过pop和push操作。前一个操作push进的数据可用被下一个pop出来使用。

    帧数据区作用:
            解析常量池里面的数据。
          方法执行完后处理方法返回,恢复调用现场。
        方法执行过程中抛出异常时的异常处理。存储在一个异常表。当出现异常时虚拟机查找相应的异常表是否有对应的Catch语句,如果没有就抛出异常终止这个方法调用。
     函数嵌套调用的次数由站的大小决定。栈越大,函数嵌套调用次数越多,对一个函数而言,它的参数越多,内部局部变量越多,他的栈帧越大,其嵌套调用次数会越少。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值