1.区域划分:

Java虚拟机栈
1.Java虚拟机栈也是线程私有的,它的生命周期与线程相同(随线程而生,随线程而灭)
2.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常; 如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常;(当前大部分JVM都可以动态扩展,只不过JVM规范也允许固定长度的虚拟机栈)
3. Java虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的同时会创建一个栈帧。
栈帧(Stack Frame)
栈帧(StackFrame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的java虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。
在编译程序代码的时候,栈帧中需要多大的局部变量表内存,多深的操作数栈都已经完全确定了。
因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
注意: 在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。
执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
堆
堆里存放的是对象的实例
是Java虚拟机管理内存中最大的一块
GC主要的工作区域,为了高效的GC,会把堆细分更多的子区域
线程共享
方法区域
存放了每个Class的结构信息,包括常量池、字段描述、
方法描述
GC的非主要工作区域
本地方法栈
本地方法栈(Native Method Stacks)与 Java 虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的 Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。
Navtive 方法是 Java 通过 JNI 直接调用本地 C/C++ 库,可以认为是 Native 方法相当于 C/C++ 暴露给 Java 的一个接口,Java 通过调用这个接口从而调用到 C/C++ 方法。当线程调用 Java 方法时,虚拟机会创建一个栈帧并压入 Java
虚拟机栈。然而当它调用的是 native 方法时,虚拟机会保持 Java 虚拟机栈不变,也不会向 Java
虚拟机栈中压入新的栈帧,虚拟机只是简单地动态连接并直接调用指定的 native 方法。摘自链接:https://www.jianshu.com/p/8a775d747c47
程序计数器
程序计数器(Program Counter
Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
------ 摘自《深入理解JAVA虚拟机》
实例分析1:
通过一个实例来彻底了解每部分区域的作用,并结合之前类加载器和字节码指令的知识点做相关分析
public class JText7 {
public static void main(String[] args) {
Son son = new Son();
son.Math();
}
}
class Son{
private static int a = 1;
private String str = "Hello";
private static final int b = 5;
public Son() {
}
public void Math() {
int a = 1;
int b = 2;
int c = (a + b)*
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=105030848&d=1&t=3&u=ea8640ade97a4721bb7fbcb279c70a00)
2308

被折叠的 条评论
为什么被折叠?



