课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java虚拟机是程序员在学习java编程开发语言的时候需要重点掌握的一个编程知识,下面我们就通过案例分析来了解一下,java虚拟机数据类型都有哪些。
运行时区域主要分为:
线程私有:
程序计数器:ProgramCountRegister,线程私有,没有垃圾回收
虚拟机栈:VMStack,线程私有,没有垃圾回收
本地方法栈:NativeMethodStack,线程私有,没有垃圾回收
线程共享:
方法区:MethodArea,以HotSpot为例,JDK1.8后元空间取代方法区,有垃圾回收。
堆:Heap,垃圾回收重要的地方。
和这个代码相关的主要是虚拟机栈,也叫方法栈,是每一个线程私有的。
生命周期和线程一样,主要是记录该线程Java方法执行的内存模型。虚拟机栈里面放着好多栈帧。注意虚拟机栈,对应是Java方法,不包括本地方法。
一个Java方法执行会创建一个栈帧,一个栈帧主要存储:
局部变量表
操作数栈
动态链接
方法出口
每一个方法调用的时候,就相当于将一个栈帧放到虚拟机栈中(入栈),方法执行完成的时候,就是对应着将该栈帧从虚拟机栈中弹出(出栈)。
每一个线程有一个自己的虚拟机栈,这样就不会混起来,如果不是线程独立的话,会造成调用混乱。
大家平时说的java内存分为堆和栈,其实就是为了简便的不太严谨的说法,他们说的栈一般是指虚拟机栈,或者虚拟机栈里面的局部变量表。
局部变量表一般存放着以下数据:
基本数据类型(boolean,byte,char,short,int,float,long,double)
对象引用(reference类型,不一定是对象本身,可能是一个对象起始地址的引用指针,或者一个代表对象的句柄,或者与对象相关的位置)
returAddress(指向了一条字节码指令的地址)
局部变量表内存大小编译期间确定,运行期间不会变化。空间衡量我们叫Slot(局部变量空间)。64位的long和double会占用2个Slot,其他的数据类型占用1个Slot。
上面的方法调用的时候,实际上栈帧是这样的,调用main()函数的时候,会往虚拟机栈里面放一个栈帧,栈帧里面我们主要关注局部变量表,传入的参数也会当成局部变量,所以一个局部变量就是参数args,由于这个是static方法,也就是类方法,所以不会有当前对象的指针。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。