
java虚拟机栈和本地方法栈
Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。new了一个class类的过程:往栈里丢了一个英文的名字,在堆里实例化了一个类,名字指向这个类。与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是。栈:栈内存,主管程序的运行,生命周期与线程同步。Java 栈可用类比数据结构中栈,
Java 虚拟机栈
与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的线程内存模型,每次方法调用的数据
都是通过栈传递的。
Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。
实际上,Java 虚拟机栈是由一个个栈帧
组成,而每个栈帧中都拥有:局部变量表
、操作数栈
、动态链接、方法出口信息。
局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针
,也可能是指向一个代表对象的句柄
或其他与此对象相关的位置)。
Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出
。
Java 方法有两种返回方式:
- return 语句。
- 抛出异常。
Java 虚拟机栈会出现两种错误:StackOverFlowError 和 OutOfMemoryError。
- StackOverFlowError: 若 Java 虚拟机栈的内存大小
不允许动态扩展
,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。 - OutOfMemoryError: 若 Java 虚拟机栈的内存大小
允许动态扩展
,且当线程请求栈时内存用完了
,无法再动态扩展了,此时抛出 OutOfMemoryError 错误。
本地方法栈
和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
栈+堆+方法区的关系
蓝:堆 红:方法区 深蓝:常量池 绿:栈
new了一个class类的过程:往栈里丢了一个英文的名字,在堆里实例化了一个类,名字指向这个类
总结:
栈:栈内存,主管程序的运行,生命周期与线程同步。一旦线程结束,栈就over了
线程结束,栈内存也就释放了,不存在垃圾回收的问题。
栈:8大基本数据类型,对象的引用,实例的方法
栈运行的原理:栈帧。 栈满了:StackOverFlowError
更多推荐
所有评论(0)