java虚拟机学习-内存结构
java虚拟机内存结构其实就是指java虚拟机运行时数据去,如上图所示。
java虚拟机运行时数据区分为五部分,其中方法区、堆为虚拟机共享区,其他未线程私有区。
1、程序计数器
程序计数器是一块较小的内存,可以看做是当前线程执行字节码指令的行号指示器,字节码指令解释器在工作时通过改变程序计数器来确定下一条要执行的字节码指令。程序在跳转、分支、循环、异常等操作时都需要程序计数器来完成。
程序计数器为何被设置为线程私有内存:java虚拟机多线程是通过现场轮流切换并分配处理器处理时间片来实现,一个处理器在任何时刻只能执行一条线程,因此为了保证在切换后内正常回到原来线程,每一条线程必须有一个独立的私有的程序计数器。
程序计数器是java中惟一一个没有规定内存溢出(OutOfMemoryError)的内存区域
2、java虚拟机栈
java虚拟机栈也是线程私有的内存区域,生命周期与线程相同,java虚拟机栈时用来描述java方法执行的内存模式:java中每一个方法执行时都会创建一个栈帧用来存放局部变量表、操作数、动态链接,方法出口等信息。每一个方法的执行就对应着一个栈帧在虚拟机入栈出栈的过程。
局部变量表存放了八种原始数据类型(byte、short、int、long、float、double、boolean、char),引用类型、方法返回类型returnAddress,局部变量表长度是在编译期间决定的,存储于类和接口的二进制表中,既通过方法的Code属性保存及提供给栈帧使用。
操作数栈所属的栈帧刚被创建的时候,操作数栈式空的,虚拟机提供了一些指令,从局部变量表或者对象实例字段复制常量或者变量到操作数栈中,也提供一些指令从操作数栈中取走数据
每一个栈帧中都包含一个指向运行时常量池的引用来支持方法在运行时动态链接。
3、本地方法栈
本地方法栈与java虚拟机栈非常相似,区别是本地方法栈是在java虚拟机调用操作系统本地方法执行时使用,Java虚拟机栈是在虚拟机执行Java方法时服务
4、堆
堆内存是java虚拟机中最大的一块内存,被所有线程共享,在java虚拟机启动时创建,主要用来存放java引用对象实例。
5、方法区
方法区与堆内存一样是被所有线程共享的一块内存区域,用来存储已经被虚拟机加载的类、静态变量、常量、即时编译器编译的数据等。方法区中一个重要的区域运行时常量池,存放编译期间产生的字面变量、符号引用、直接引用、类在加载的时候将这些内容存放到运行时常量池中。

浙公网安备 33010602011771号