小马之博客初体验暨JVM基础一开篇

小马之博客初体验暨JVM基础一开篇

    • 开篇闲谈
    • JVM基础知识
      • java程序运行过程
      • JVM、JRE、JDK 的关系
      • JVM的内存区域
        • 运行时数据区
          • 虚拟机栈
          • 栈帧
    • 后记

开篇闲谈

今天是2021年2月22日,是我从机械走向程序猿的第四个年头,也是我第一篇博客的开始(小马也是在学习中,有不对的地方希望大佬指正)。写博客这个想法在我脑海里生生灭灭已经好几轮回,其实一直想着把工作中遇到的问题以及学习中的心得写下来,为什么一直没有开始呢,你懂得《懒人总有理由推脱》。废话不多说,直接开干<希望自己能坚持下来,加油,小马>。

JVM基础知识

java程序运行过程

小马之博客初体验暨JVM基础一开篇_第1张图片
过程:java文件>>>>编译器(生成.class文件)>>>> JVM(字节码)>>>> 机器码

第一步 :javac将java文件编译成 .class文件。
第二步:JVM将.class文件翻译,输出字节码,调用操作系统函数。

JVM、JRE、JDK 的关系

JVM 就是我们经常说的 java虚拟机,主要就是把.class文件翻译成机器识别的码。
JER java运行时环境,它包含JVM,除了JVM外,主要是提供很多类库(比如读写或者操作文件、连接网络、IO等等),这都是JRE提供的基础的类库。
JDK java软件开发包,它包含JRE,对我们程序猿来言,处理JRE的功能外,我们还需要打包代码,调试代码,有时候还需要反编译代码,JDK提供了一些工具(javac<编译代码>、jar<打包>、javap<反编译>)等,这就是JDK。
补充
JVM具有跨平台性<在不同的操作系统上(Linux、Windows、MacOS 等平台)执行,效果是一样>;
跨语言字节码>

JVM的内存区域

小马之博客初体验暨JVM基础一开篇_第2张图片

运行时数据区

虚拟机栈

基于线程,存储当前线程运行 java方法所需的数据,指令,返回地址。
特点:先进后出<好比手枪子弹夹上子弹,先压得子弹后出,后压得先出>

栈帧

在java方法被调用时,会创建一个栈帧,并进入栈,当方法完成相应调用,则出栈。
局部变量表
用于存储方法中的变量,比如八大基础类型,如果是局部的一些对象,比如new出的对象,则存放它的引用地址即可。

传统的操作系统 包含 CPU + 内存 + 缓存
JVM(模拟板的操作系统)想对应 JVM执行引擎(CPU) + 堆、栈 (内存) + 操作数栈(缓存)

操作数栈
它本质上是执行引擎的一个工作区,用于存放java方法的操作数的。如果代码不执行,操作数栈就是空的。

动态链接
符号引用和直接引用在方法运行时进行解析和链接的过程,叫动态链接
比如一个方法调用另一个方法时,或者一个类使用另一个类的成员变量时,首先我们得知道其名字,
符号引用呢就相当于名字,这些被调用者的名字就存放在java字节码文件里(.class文件)
当程序运行起来,怎么通过这个名字(符号引用)找到相应的类和方法,是通过解析成相对应的直接引用,利用直接引用来准确的找到。

完成出口<返回地址>
正常返回:调用程序计数器中的地址作为返回
异常返回:通过异常处理器表来确定

程序计数器
主要用来记录各个线程执行的字节码的地址,比如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。
由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。 因为 JVM 是虚拟机,内部有完整的指令与执行的一套流程,所以在运行 Java 方法的时候需要使用程序计数器(记录字节码执行的地址或行号),如果是遇到本地方法(native 方法),这个方法不是 JVM 来具体执行,所以程序计数器不需要记录了,这个是因为在操作系统层面也有一个程序计数器,这个会记录本地代码的执行的地址,所以在执行 native 方法时,JVM 中程序计数器的值为空(Undefined)。 另外程序计数器也是 JVM 中唯一不会 OOM(OutOfMemory)的内存区域。

CPU时间轮转机制
小马之博客初体验暨JVM基础一开篇_第3张图片

后记

写下自己的感受,虽然说这个知识都是基础,要是口述的话,感觉没啥压力,但是呢,要一个字一个字敲到文章里,还是需要点时间的,再有每个知识点呢都需要在确认下(比较菜)生怕哪块写的不对,总体来说,自己很充裕,也算是打发时间的最好的方法,还能巩固知识,那就到这里,下章见~。

你可能感兴趣的