什么是JVM(Java Virtual Machine)规范,什么是实现
你打开这篇文章,我会猜测你有没有一种想法,就是,你在学习JVM相关知识的时候看到什么
JVM协议,又是什么JMM协议,什么垃圾回收期,回收算法,JDK,又是什么版本啊,你看到这信息的时候我估计你头都炸了。如果你符合这个想法,我想你有必要看一下我这个文章,
因为我学习的时候就是出现了这种问题我才来这里学这个文章,帮助更多人能够理清思路再去再去深入的学习JVM本文纯原创!一个知识点不会复制别人的!!
- 回归话题,什么是JVM规范
来看这个 java代码 ,大家就先想这个代码就是我们项目的全部代码,再也没有其他代码,不要想得太复杂
package vmoption;
/**
* 请先看这个
* 下面的注释是我把java的语言的一些功能写出来
*/
public class JvmStandardAndImplCourse {
/**
* java定义的是final修饰的字段一旦复制不可以改变
*/
private final String str = "final修饰的字符串";
public static void main(String[] args) {
/**
* 在控制台输出 Hello World"
*/
System.out.println("Hello World");//大家都知道这是一个标准输出
}
/**
System.out.println("狗蛋爱JAVA");
* 这个方法被调用的话输出
*/
private void jvm(){
System.out.println("狗蛋爱JAVA");
}
/**
* 加载类阶段初始化阶段自动调用
*/
static {
System.out.println("这是静态代码块");
}
}
- 我们在idea上点击绿色三角按钮,这个程序就运行咯,各种输出。
- 运行? 你运行个der啊运行,你连环境都没有你运行,你要是直接使用idea,估计别人都帮你弄好环境了
这时候就去问AI,就会问AI “请问怎么才能运行java代码呢,”,AI回答“你先去csdn下载JDK,然后安装一下,配置一些环境变量”
然后AI还会说你看成功不成功你去控制台输入什么 “java-- version” 如果现实就说明环境配好了 - 好了,这会环境安装好了,狂一下一顿输出"hello world"
- 什么是环境,C语言啊,java啊 python啊都有自己的环境
- 到底什么是环境呢,到底什么是环境呢,宝宝们,想过吗,我来告诉你
- 环境就是一个软件!!!环境就是一个软件!! 看清楚了,就是一个软件
- 你说环境就是软件,怎么没界面呢?
- 真low,你是不是软件就是你打开的VSCODE? IDEA? WPS?,在一句话告诉你,如果从软件有无界面来说,无界面软件一般比有有界面的软件牛逼一万倍
- java的运行环境是谁提供的,JVM?也许对也许不对,等一下告诉你答案,不是绕弯子,是因为到这里之前这个问题不好回答
- 你们学习jvm相关知识的时候是否看到过一个词,HOtSpot,可能还有其他的,但是他占据了绝大部分,对就是这玩意,这玩意就是软件!就是java运行环境!!
在这里我不想列出来还有什么软件是java环境,因为越多越杂 - HotSpot的作用是什么呢,你看我刚刚哪个代码,hotSpot的作用就是拿到刚刚java代码,其实是一份扩展名叫做java的文件,这个文件里面写了一些java代码
- 当你点击idea绿色按钮的时候,你知道你启动的是谁吗?小老弟们?你启动的是HotSpot!!! 并且java文件给了这个HotSpot
- 什么时候给了HotSpot了?,我啥也没干啊,那是因为你用的是界面idea软件写的java代码,他自己会帮你处理,把java文件给HotSpot,然后启动HotSpot
- **这里补充一点,其实HotSpot处理的是java编译后的.class文件,这里我为什么是java文件,是为了大家好理解,大家如果知道class文件或者不知道的
这一点很容易,大家再去看,这里你使用java文件的概念就行
- 你们学习jvm相关知识的时候是否看到过一个词,HOtSpot,可能还有其他的,但是他占据了绝大部分,对就是这玩意,这玩意就是软件!就是java运行环境!!
- 运行? 你运行个der啊运行,你连环境都没有你运行,你要是直接使用idea,估计别人都帮你弄好环境了
到这里JVM规范我们啥也没讲啊?你当我傻逼了?垃圾教程,请继续看下去
- 如果让你开发一个java环境你会做吗?就是做一个类似上面的HotSpot软件,宝宝们,你会吗?不会是吧,那你会写C语言吗,你会写C++吗,你会写python吗?
- JVM规范强势登场!!!!
- 首先JVM规范他是一个规范或者协议,怎么理解,JVM就是一份指导书,他在叫你做啥,但是他啥也不想做,狗比仔,啥都不想做要你干嘛?
- 但是人家JVM规范牛逼就在于,如果你按照说地去写,我管你怎么写,不管你使用C还是C++还是python写,如果我说的你都写对了,那么你的软件就是类似于HotSpot一样了
- 牛逼不,这会我们都已经会写java环境了,上面的HotSpot叫做什么呢,他的全称叫做JVM规范的实现!记住实现两个字,他按照JVM规范,使用C++和C系开发 的一个叫做HotSpot的软件,这个软件就是我们常用的java运行环境
- JVM是一个规范,一个协议,内容是巨量的,这里我们接触一点我们要学的一些知识,什么方法去,堆,垃圾回收,熟悉不?,看到过不
- 下面列出一个协议,这个协议就是说你要写一个JVM规范的软件,你先写这样子:
- 你要写一个运行时数据区,内存区里面要有方法区,堆,虚拟栈区,程序计数器区,本地方法区,还要有垃圾回收器,这些概念属性不?这就是JVM规范的一部分,就是我i们学习重要内容
- 但是呢,JVM他是协议啊,我让你这样子,但是JVM要的是结果结果,不要过程,并不要求你具体怎么做,你怎么实现是你的事情,那么环境开发者就会根据这些信息信息开发软件了
- 下面列出一个协议,这个协议就是说你要写一个JVM规范的软件,你先写这样子:
总结
- JVM规范就是一个指导书,高级叫法叫做JVM规范,他指导你如何写一个java运行环境,Hotspot就是按照他说的实现的。
下面说一点大家学习JVM的时候一点误区,以便大家学习的时候不会懵逼
- 大家是不是在学程序计数器,java虚拟机栈(线程栈),本地方法栈,堆,方法区? 是不是学习的的时候其实还好,但是一看到版本跟新什么的直接崩溃!
- 我告诉大家,JVM规范中有一个部分内容,叫做运行时数据区 ,记住,叫做运行时数据区!!!
- 运行时数据区里面内容就是包括 程序计数器,java虚拟机栈(线程栈),本地方法栈,堆,方法区这五个!!!
- 我们重点学习的时候就是学习上面的几个东西,当然后面还有什么垃圾回收。垃圾回收更像是一个协助协议,要求说你要对这个运行时数据库进行垃圾回收
- 再解决大家一个问题,就是JVM的运行时数据区的协议非常稳定的,名字就是叫做上面的,下面看我表格
-
区域 描述 生命周期 线程隔离性 程序计数器 当前线程正在执行的字节码地址 与线程同生同灭 每线程独立 Java 虚拟机栈 存放栈帧,每个方法执行时创建 与线程同生同灭 每线程独立 本地方法栈 为 native 方法服务,结构类似 JVM 栈 与线程同生同灭 每线程独立 堆 所有对象实例和数组的内存区域 JVM 启动后创建,全局共享 所有线程共享 方法区 存储类结构、静态变量、常量池等 JVM 启动后创建,全局共享 所有线程共享
你是不是看到什么元空间啊,老年代啊,新生代啊,永久代,什么各种垃圾回收器啊,这些信息这些的具体的实现者的叫法
- 比如JDK的元空间 ,就是我们上面说的协议和实现,你JVM是协议,你告诉我我要实现这样一个效果,我实现了啊,怎么做是我的事情!!!
- 下面的一下可视化的说明,大家在这里先不要太纠结哈,现在重点是了知道JVM协议,我们学的到底是啥
JVM(规范)
├─ HotSpot / OpenJ9(实现)
│ ├─ 垃圾回收器(G1、ZGC…)
│ └─ 内存区域(堆、元空间、栈…)这里就是运行时数据区
├─ JMM(并发下的内存行为规范)
│ └─ JVM 实现需遵守 JMM(如 volatile、happens-before)
└─ 字节码规范(class 文件、指令集)
区域 | 干什么的 | 会被 GC 管吗 | 说明 |
---|---|---|---|
🟩 堆(Heap) | 存对象、数组 | ✅ 是 | GC 主要目标,新生代 + 老年代 |
🟦 方法区 / 元空间 | 存类信息、常量池、静态变量等 | ✅ 是 | JDK 8 前叫 PermGen,JDK 8 起是本地内存中的 Metaspace |
🟥 虚拟机栈 | 存方法调用栈帧、局部变量 | ❌ 不会 | 方法一调用就分配,结束就销毁 |
🟨 本地方法栈 | 调用 C/C++ 的 native 方法时用 | ❌ 不会 | 用于 JNI 调用 |
🟧 程序计数器 | 记录当前线程执行位置 | ❌ 不会 | JVM 唯一线程私有且不会 OOM 的区域 |