Java培训班教程系列分享JVM模型的介绍一,Java内存分配:JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。
Java按照内存使用区域可以分为四个部分:堆、栈、方法区和程序计数器;其中栈又可以分为两大部分:Java虚拟机栈和本地方法栈;下面我将通过自己的学习与别人总结的参考见解来介绍下jvm
图片1
程序计数器
程序计数器是一块较小的内存空间,它被用来记录当前指令执行程序的位置,在内部通过改变计数器的位置来确定下一条指令执行程序的位置;
我们知道Java多线程的实质是通过线程轮流切换并分配处理执行事件来实现的,而在任何一个确定的时刻,一个处理器只会执行一个线程中的一条指令。为了能让线程切换后仍然能恢复到原来的位置,每个线程都需要有一个独立的程序计数器,他们之间互不影响,所以,程序计数器是线程私有的内存区域
如果一个线程正在执行一个Java方法,那么程序计数器记录的就是正在执行的虚拟机字节码指令的地址;如果正在执行一个native方法,那么程序计数器的值就为空;
程序计数器是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,在四个区域中只有它不会出现内存溢出的情况
栈之Java虚拟机栈
Java虚拟机栈描述的是Java方法的内存模型;每个方法在被执行的同时都会创建一个Java虚拟机栈(栈帧),用于存储局部变量表、操作栈、动态链接和方法出口等信息,因此Java虚拟机栈也是线程私有的;
类似于动画是由一栈一栈的栈帧切换产生的,程序的执行也是由栈帧的切换产生的,只是这些栈帧中存放的是方法的局部变量、操作栈、动态链接和方法出口等信息;每一个方法被调用直至执行完成的过程,就是一个栈帧在虚拟机栈中从入栈到出栈的过程;
对于执行引擎来说,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧关联的方法称为当前方法,执行引擎所有的字节码指令都值针对当前栈帧进行操作;
通常我们所说的变量存储在栈中是不严谨的,在Java虚拟机栈中存放的是对应方法的局部变量,而且这些局部变量存放在Java虚拟机中的局部变量表中;对于保存的局部变量分类:Java中的基本数据类型变量的值存放在局部变量表,而对于引用类型变量来说,局部变量表只会存放对象的引用,真正的值存放在堆中;
Java虚拟机是使用局部变量表来完成参数值到参数变量表的传递过程的,系统不会为局部变量赋予初始值(对于实例变量和类变量都会赋予初始值)
在Java虚拟机规范中,对Java虚拟机栈规定了两种异常情况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈动态扩展时无法申请到足够的内存时,会抛出OutOfMemoryError 异常
以上就是小编介绍的"Java培训班分享的内容,希望对大家有帮助,如有疑问还可以点击进入Java视频教程进行学习。
Java培训班:http://Java.qfedu.com/