JVM规范,HotSpot,JVM内存管理,方法区,元空间,程序计数器,虚拟机栈,

什么是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规范我们啥也没讲啊?你当我傻逼了?垃圾教程,请继续看下去

  • 如果让你开发一个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规范,他指导你如何写一个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 的区域

这边文章写了很久,可能语言什么的组织的不好,如果大家觉得文章还可以,麻烦点个赞吧,给点动力。今天真的累,今天就到此为止吧下次再写

原创作品,引用请注明出处!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值