JVM学习笔记——内存结构篇

JVM学习笔记——内存结构篇在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分
【JVM学习笔记——内存结构篇】我们会分为以下几部分进行介绍:

  • JVM整体介绍
  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 方法区
  • 直接内存
JVM整体介绍我们在正式开始学习JVM之前当然需要先简单认识一下JVM了
JVM简述首先我们给出JVM的定义:
  • Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)
JVM的优点:
  • 一次编写,到处运行
  • 自动内存管理 , 垃圾回收功能
  • 数组下标越界检查
  • 多态
常见JVM展示我们下面给出常见的JVM视图展示:
JVM学习笔记——内存结构篇

文章插图
目前我们所讲述的JVM知识基本都是基于HotSpot类型的JVM
JVM总体路线我们给出JVM的整体框架,而该框架也是我们学习JVM的总体路线:
JVM学习笔记——内存结构篇

文章插图
我们的学习顺序如下:
  • JVM内存结构
  • GC垃圾回收
  • Java Class
  • ClassLoader
  • JIT Compiler
JVM,JRE,JDK比较我们顺便介绍一个面试常见问题:
  • 请给出JVM,JRE,JDK之间的区别
我们首先采用一张图进行解释:
JVM学习笔记——内存结构篇

文章插图
我们来做出简单介绍:
  • JVM是我们的Java程序最基本的底层架构,我们通过JVM来实现Java源代码和操作系统之间的交互
  • JRE在JVM的基础上添加了我们平时所使用的基础类库 , 包括有Net Framekwork的核心类库等相关库
  • JDK在JRE的基础上又添加了编译工具,包括有jar打包工具,Java运行工具 , Javac编译工具,Javadoc文档工具等
  • JavaSE程序在JDK的基础上又添加了我们常用的开发工具,市面上我们常见的IDEA或者VS等系列工具
  • JavaEE是在 JavaSE 的基础上构建的 , 它提供Web 服务,通信 API等,可以用来实现企业级的面向服务和Web 3.0应用程序 。
程序计数器首先我们先来介绍JVM内存结构中的程序计数器
程序计数器简述首先我们给出程序计数器的简单定义:
  • Program Counter Register 程序计数器(寄存器)
然后我们给出程序计数器的主要作用:
  • 程序计数器主要用于记录下一条jvm指令的执行地址
程序计数器具有以下特点:
  • 程序计数器默认情况下不可能出现内存溢出
  • 程序计数器是一块较小的内存空间,它通常采用寄存器代替
  • 程序计数器绑定线程 , 每个线程有且只有一个程序计数器,它随着线程创建而创建,随着线程销毁而销毁
程序计数器详细介绍我们给出一些代码来进行简单介绍:
0: getstatic #20// PrintStream out = System.out;3: astore_1// --4: aload_1// out.println(1);5: iconst_1// --6: invokevirtual #26// --9: aload_1// out.println(2);10: iconst_2// --11: invokevirtual #26 // --14: aload_1// out.println(3);15: iconst_3// --16: invokevirtual #26// --19: aload_1// out.println(4);20: iconst_4// --21: invokevirtual #26// --24: aload_1// out.println(5);25: iconst_5// --26: invokevirtual #26// --29: return我们下面进行简单解释:
  • 首先我们的注释部分是Java的源代码,左侧部分是我们的二进制字节码即jvm指令
  • jvm指令中前面的位置是我们的执行地址(物理地址),中间是相关执行指令,最后面带#是常量地址(我们后面会讲到)
  • 我们的jvm代码是不能直接与cpu交互的 , 我们需要通过解释器将jvm代码编程机器码,才可以与cpu进行交互
  • 但是我们的jvm代码的位置不是顺序排列的,所以这时我们每个线程都需要一个程序计数器来记录下一个jvm的位置
  • 我们将该jvm指令传给解释器后,解释器将其处理的同时程序计数器也接收到下一个地址 , 进行jvm位置更新
同时我们也强调一点:
  • 程序计数器只是逻辑上的概念,我们通常采用寄存器来充当一个程序计数器
  • 因为寄存器的读取速度是最快的 , 我们可以快速保存并且读出物理地址位置来进行交互
虚拟机栈这小节我们来介绍JVM内存结构中的虚拟机栈
栈简介我们首先来回顾栈的概念:
JVM学习笔记——内存结构篇

文章插图
我们的栈先进后出,用于存储程序中的部分信息

推荐阅读