课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java虚拟机的学习对于大多数新手程序员来说还是有一定的难度的,下面我们就通过案例分析来了解一下,java虚拟机内存模型都有哪些类型。
一.PC寄存器(程序计数器)
概念:就像相当于一个行号指示器
JVM中的PC寄存器是对物理PC寄存器的一种抽象模型,该区域非常小,几乎可以忽略不计
每一个线程都有自己独有的PC寄存器
用来存储下一条指令的地址,执行引擎每次读取指令时都先从PC寄存器得到下一条指令(字节码指令)的地址,然后找到指令进行执行
是的一个在JVM规范中没有任何内存溢出(OutOtMemoryError)情况的区域,同时也没有GC
作用:
程序执行到哪了?因为CPU需要不停的切换各个线程,这时候切换回来,就得知道接着从哪执行。
下一步执行哪个指令?JVM的字节码解释器需要通过PC寄存器的值来明确下一条应该执行什么样的字节码文件
PC寄存器为什么被设置为线程私有?
PC寄存器主要是为了在多线程下,CPU不停的做任务切换的时候,保证可以准确的执行所有的指令。
如果在单线程下,所有指令都是按照顺序执行的,就不存在cpu做任务切换时导致指令混乱。而多线程就需要每个线程独立记录自己执行的情况,从而不会出现互相干扰。
二.栈
概念:
栈管运行,堆管存储,栈解决程序运行问题,即程序该如何执行,如何处理数据。堆解决数据存储的问题,即数据往哪放,该怎么放。
每一个线程都会创建一个虚拟机栈(独有),内部保存为一个一个栈帧,对应一个一个java方法,它保存方法的局部变量,部分结果,并参与方法的调用和返回。
存在OOM,不存在GC
栈帧的内部结构
局部变量表:是一个数字数组,主要用来存储方法参数和局部变量
slot(变量槽):在局部变量表中,每一个局部变量都放在一个slot中。32位以内的类型只占一个slot,64位的类型占两个slot(比如double,long占两个slot)
操作数栈:主要用于保存计算过程的中间结果/临时变量的存储空间
方法返回地址:存放方法返回的地址(pc寄存器的值)
方法返回时,会将调用者的pc寄存器的值作为返回地址,让方法执行完之,得到下一条指令的地址
动态链接:指向运行时常量池的方法引用
在字节码文件中,所有的变量和方法引用都作为"符号引用"保存在常量池中。
比如:调用一个方法时,就是通过常量池中指向方法的符号引用来表示。
那么,动态链接的作用就是把这些符号引用转换为调用方法的直接引用。
附加信息:例如:对程序调试提供支持的信息等...
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。