没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
学习学习JVM之之java内存区域与异常内存区域与异常
关于JVM内存区域的知识对于初学者来说其实是很重要的,了解Java内存分配的原理,这对于以后JAVA的学习
会有更深刻的理解。下面来看看详细介绍。
一、前言一、前言
java是一门跨硬件平台的面向对象高级编程语言,java程序运行在java虚拟机上(JVM),由JVM管理内存,这点是和C++最
大区别;虽然内存有JVM管理,但是我们也必须要理解JVM是如何管理内存的;JVM不是只有一种,当前存在的虚拟机可能达
几十款,但是一个符合规范的虚拟机设计是必须遵循《java 虚拟机规范》的,本文是基于HotSpot虚拟机描述,对于和其它虚
拟机有区别会提到;本文主要描述JVM中内存是如何分布、java程序的对象是如何存储访问、各个内存区域可能出现的异常。
二、二、JVM中内存分布中内存分布(区域区域)
JVM在执行java程序的时会把内存分为多个不同的数据区域进行管理,这些区域有着不一样的作用、创建和销毁时间,有的区
域是在JVM进程启动时分配,有的区域则与用户线程(程序本身的线程)的生命周期相关;按照JVM规范,JVM管理的内存区
域分为以下几个运行时数据区域:
1、虚拟机栈、虚拟机栈
这块内存区域是线程私有的,随线程启动而创建、线程销毁而销毁;虚拟机栈描述的java方法执行的内存模型:每个方法在执
行开始会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈,动态链接、方法出口等。每个方法的调用执行和返
回结束,都对应有一个栈帧在虚拟机栈入栈和出栈的过程。
局部变量表顾名思义是存储局部变量的内存区域:存放编译器期可知的基本数据类型(8种java基本数据类型)、引用类型、
返回地址;其中占64位的long和double类型数据会占用2个局部变量空间,其它数据类型只占用1个;由于类型大小确定、变
量数量编译期可知,所以局部变量表在创建时是已知大小,这部分内存空间能在编译期完成分配,并且在方法运行期间不需要
修改局部变量表大小。
在虚拟机规范中,对这块内存区域规定了两种异常:
1.如果线程请求的栈深度大于虚拟机所允许的深度(?),将抛出StackOverflowError异常;
2.如果虚拟机可以动态扩展,当扩展是无法申请到足够内存,将抛出OutOfMemory异常;
2、本地方法栈、本地方法栈
本地方法栈同样也是线程私有,而且和虚拟机栈作用几乎是一样的:虚拟机栈是为java方法执行提供出入栈服务,而本地方法
栈则是为虚拟机执行Native方法提供服务。
在虚拟机规范中,对本地方法栈实现方式没有强制规定,可以由具体虚拟机自由实现;HotSpot虚拟机是直接把虚拟机栈和本
地方法栈合二为一实现;对于其他虚拟机实现这一块的方法,读者有兴趣可以自行查询相关资料;
与虚拟机栈一样,本地方法栈同样会抛出StackOverflowError和OutOfMemory异常。
3、程序计算器、程序计算器
程序器计算器也是线程私有的内存区域,可以认为是线程执行字节码的行号指示器(指向一条指令),java执行时通过改变计
数器的值来获的下一条需要执行的指令,分支、循环、跳转、异常处理、线程恢复等执行顺序都要依赖这个计数器来完成。虚
资源评论
weixin_38665822
- 粉丝: 9
- 资源: 933
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功