【玩转jvm系列 01】Java虚拟机的基本结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/damienzhong/article/details/82779797

Java虚拟机架构图

image

Java虚拟机基本结构思维导图

image

类加载子系统

  • 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。

Java堆

  • Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  • 对于绝大多数应用,Java堆是Java虚拟机所管理的内存中最大的一块。
  • Java堆是垃圾收集器管理的主要区域,因此也被称为“GC堆”。
  • Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。
  • 在实现时,既可以实现成固定大小的,也可以是可扩展的,主流虚拟机都是按照可扩展的(通过-Xmm和-Xms控制)。
  • 如果在堆中没有内存完成实例分配,并且堆也无法再扩展,将会抛出OutOfMemoryError异常。

Java虚拟机栈(Java栈)

  • Java虚拟机栈是线程私有的,它的生命周期与线程相同。
  • 每个方法在执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  • Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。
  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

本地方法栈

  • 本地方法栈与虚拟机栈所发挥的作用非常类似,最大的不同在于虚拟机栈用于Java方法的调用,而本地方法栈则用于本地方法的调用。

程序计数器(PC寄存器)

  • 程序计数器是一块较小的内存空间,可以看做是当前线程的字节码的行号指示器。
  • 程序计数器也是每个线程私有的空间,Java虚拟机会为每个Java线程创建程序计数器。
  • 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。
  • 此内存区域是唯一一个再Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

方法区

  • 方法区是各个线程共享的内存区域。
  • 用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 它有一个别名叫做Non-Heap(非堆),用于与Java堆的区分。
  • 可以选择不实现垃圾收集。

运行时常量池

  • 运行时常量池是方法区的一部分。
  • Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生产的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池。

垃圾回收系统

  • 垃圾回收器可以对方法区、Java堆和直接内存进行回收。
  • Java堆是垃圾收集器的工作重点。

执行引擎

  • 负责执行虚拟机的字节码。

直接内存

  • 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
  • 直接内存的分配不会受到Java堆大小的限制,但是会受到本机总内存以及处理器寻址空间的限制。
  • 访问直接内存的速度会优于Java堆。因此,在读写频繁的场合可能会考虑直接使用直接内存。

呆萌钟, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明【玩转jvm系列 01】Java虚拟机的基本结构! 

猜你喜欢

转载自blog.csdn.net/damienzhong/article/details/82779797