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我们下面进行简单解释: