JVM学习系列(二)——JAVA内存区域

来源:互联网 发布:win10 linux子系统界面 编辑:程序博客网 时间:2024/06/08 13:11

前言:上一节总结性的概括了JAVA技术体系、JDK与JRE、JVM三者的区别与差异。这节正式开始JVM的学习,主要讲解JVM内存模块的划分以及每个模块的作用。

  1. JVM内存总体框架图
    这里写图片描述
  2. 内存分块分析
    总体分析:由上图看到,运行时数据区主要分为五部分:方法区,堆、虚拟机栈、本地方法栈、程序计数器。此处是对JVM内存细分,粗分为堆和栈。运行时数据区类似于操作系统的内存结构,主要功能是给程序分配内存,然后可以正确的执行。方法区和堆是线程公共区域,方法区存放类Class的基本信息,堆存放实例,类似于java代码中的class类和class实例。虚拟机栈、本地方法栈和程序计数器都是线程私有的,虚拟机栈存放线程方法调用执行的顺序以及方法的局部变量与参数;本地方法栈存放JVM调用操作系统的本地方法;程序计数器类似于PC计数器,用于指示程序执行顺序。线程公有原因:一次程序执行,可以有多个线程,方法区存放类的模板,堆存放创建的实例,这样做到内存空间的节省;虚拟机栈、本地方法栈和程序计数器随着不同线程是不同的,每一个线程都是不同的,所以是私有的。所以,线程公有即为共有部分,线程私有即为不同的部分。

  3. 方法区
    方法区是一块所有线程共享的区域。用于保存系统的类信息(类名、常量池、字段描述、方法描述等)所有类的一切信息。方法区的大小决定了系统可以保存类的数量。
    运行时常量池是方法区的一部分,主要作用是存放编译期间生成的各种字面量和符号引用(class文件中描述的符号引用)。


  4. java 堆(java Heap)也是一块线程共享的区域,同时也是内存管理中最大的一块内存(由java面向对象的特点决定的,正因为面向对象,所以实例最多)。

  5. 虚拟机栈
    虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候会创建一个栈帧用于存储局部变量表、动态连接数、方法出口等信息。每一个方法的调用到执行完成对应着一个栈帧在虚拟机中入栈和出栈的过程。
    局部变量表存放了在编译期可知的各种基本数据类型、引用对象。局部变量表所需的内存空间在便宜期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的变量空间是完全确定的,当方法运行期间是不会改变局部变量表的大小。

  6. 本地方法栈
    本地方法栈和虚拟机栈所发挥的作用基本一致,只是虚拟机方法栈执行的是java方法(字节码),而本地方法栈执行的是native方法。

  7. 程序计数器
    程序计数器和PC计数器类似,在内存中占有很小的一块内存,它可以看作当前线程所执行的字节码的行号指示器。由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(单核处理器)都只会执行一条线程中的指令,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器。
    如果程序执行的是java方法,这个计数器是正在执行的虚拟字节码指令的地址。如果是native方法,这个计数器是null。

0 0
原创粉丝点击