您的位置:首页 > 编程语言 > Java开发

深入理解java虚拟机之java内存区域划分-学习笔记1

2019-02-11 10:52 183 查看

运行时数据区域

Java虚拟机在运行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁时间。
java内存模型

各区域介绍

  1. 程序计数器
    它可以看作当前线程所执行的字节码的行号指示器,是线程私有的,生命周期跟线程相同。如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址,如果正在执行的是Native 方法,则这个技术器值为空(Undefined),此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。(当执行Native 方法,方法是大多是通过C实现并未编译成需要执行的字节码指令所以在计数器中是空)。
  2. 虚拟机栈
    同程序计数器一样,Java虚拟机栈也是线程私有的生命周期与线程相同。java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用户存储局部变量表、操作数栈、动态链接、方法出口等信息。
    局部变量表:局部变量表是一组变量值存储空间,用以存储方法参数与方法内部定义的局部变量。在工作和学习过程中,java程序员会把java内存分为堆内存和栈内存,这种划分方式只能说明大多数程序员最为关注的与对象分配关系最为密切的区域是这两块,实际的划分要复杂的多。其中的堆在后面再说,这里所说的栈就是java虚拟机栈,更准确的说应该是虚拟机栈中的局部变量表。
    操作数栈:当一个方法刚刚开始的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是入栈和出栈操作。
    动态链接:每一个栈帧内部都包含一个指向运行时常量池的引用来支持当前方法的代码实现动态链接。在 Class 文件里面,描述一个方法调用了其他方法,或者访问其成员变量是通过符号引用来表示的,动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。
  3. 本地方法栈
    本地方法栈(Native Method Stack) 与虚拟机栈所发挥的作用非常相似,它们的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
  4. Java堆
    Java堆是Java虚拟机所管理的内存中最大的一块,被所有线程所共享在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  5. 方法区
    所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量,即编译器编译后的代码信息,它有个别名叫做Non-Heap(非堆),目的是与Java堆区分开来。运行时常量池是方法去的一部分,用于存放编译期生成的各种字面量和符号引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: