jvm学习-内存模型

原创
2016/05/30 17:54
阅读数 276

内存划分

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同区域,这些区域都有各自用他,以及创建销毁时间,有的区域随进程的启动而存在,有的依赖用户线程的启动和结束而建立和销毁,它有如下几个区域,如下图:

jdk8方法区变成了metaspace

数据区域

程序计数器:    每一个线程都有一个程序计数器,记录着正在执行的虚拟机字节码指令的地址,如果执行的是native方法,这个计数器为空;
Java虚拟机栈:每一个线程都有一个Java虚拟机栈,每个方法执行的时候都创建一个栈帧,方法执行的时候就是一个栈帧在在虚拟机栈中的入栈出栈
本地方法栈:    根据虚拟机栈非常相似,区别就是它里面执行的是本地方法
堆:                  所有线程共享区域,又称GC堆,此区域的唯一目的就是存放生成的对象实例,它里面又分为年轻代,年老代方便内存分配和垃圾回收,这也是内存调优最核心的区域
方法区:           存储每一个类的结构信息、常量、静态变量,算是堆的一个逻辑部分(可以叫成永久代)

栈帧

每个栈帧都有自己的局部变量表、操作数栈和指向当前方法所属的类的运行常量池的引用,一条线程中只有一个栈帧是正在活动的,称为当前栈帧。

局部变量表:长度由编译期决定,long和double需要两个局部变量保存,局部变量表可以完成方法调用时的参数传递,第0个局部变量一定是用来存放被调用对象的引用(this)

操作数栈:    存放部分执行结果的数据,操作数栈也被用来准备方法参数以及接收方法结果

动态链接:   字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化称为静态解析,

                      另外一部分将在每一次的运行期间转  化为直接引用,这部分称为动态连接。

返回地址:  方法退出后要返回到方法被调用的位置,正常退出返回栈帧的内容就可以帮助调用者恢复执行状态,异常退出需要异常处理器处理确定。

内存异常

栈异常 :如果线程请求分配的容量大于Java虚拟机允许的最大容量,Java虚拟机就会抛一个StackOverflowError

               如果虚拟机栈可以动态扩展,并且扩展动作已经尝试过,但无法申请到足够的内存则抛出OutOfMemoryError

堆异常 :如果堆中无法申请到内存则抛OutOfMemoryError

方法区:如果方法区中的内存不能满足内存分配请求,那么抛出 OutOfMemoryError

 

展开阅读全文
jvm
加载中

作者的其它热门文章

打赏
0
5 收藏
分享
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部