当前位置: 首页 > article >正文

接地气的方式认识JVM(一)

最近在学jvm,浮于表面的学了之后,发现jvm并没有我想象中的那么神秘,这篇文章将会用接地气的方式来说一说这些jvm的相关概念以及名词解释。
带着下面两个问题来阅读

  1. 认识了解JVM大致有什么
  2. 在代码运行时的都在背后做了什么

JVM是个啥?

抛开专业语句来说,你可以把jvm理解成一个小的电脑,运行在Linux或者windows等这样的操作系统,他直接和操作系统进行接触,不会直接操作底层的硬件,操作系统来帮我们完成与硬件的交互
在这里插入图片描述

Java文件从编写到运行,JVM内部都发生了什么?

比如我们现在写了一个 HelloWorld.java 好了,那这个 HelloWorld.java 抛开所有东西不谈,那是不是就类似于一个文本文件,只是这个文本文件它写的都是英文,而且有一定的缩进而已。
那我们的 JVM 是不认识文本文件的,所以它需要编译,让其成为一个它会读二进制文件的 HelloWorld.class,也就是字节码文件

①类加载器

如果JVM想要加载这个.class文件,就要通过类加载器这个搬运工,会把所有的.class文件都搬运进JVM里面来
在这里插入图片描述

②方法区

是用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
类加载器将 .class 文件搬过来就是先丢到这一块上
在这里插入图片描述

③堆

堆主要存放了一些存储的数据,比如对象实例,数组等,几乎所有的java对象都是分配在堆上面的,一小部分是分配在栈中的(极小部分),他和方法区都属于线程共享区域,也就是说他们都是线程不安全的

④栈

栈是我们代码运行的空间。我们编写的每一个方法都会放到栈中去运行,当一个方法进入栈时,就会有一个栈帧被压入栈中,当方法执行结束后,这个方法的栈帧就会被弹出,主打一个先进后出,后进先出

⑤程序计数器

主要就是完成一个加载工作,类似一个指针一样的,指向下一个要执行的字节码命令的地址。和栈一样,是线程独享的,就是说线程中都会有对应的每一个区域而不会存在并发和多线程的问题。
小总结
Java文件经过编译后变成 .class 字节码文件
字节码文件通过类加载器被搬运到 JVM 虚拟机中
虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行

例子

我们通过一个主函数调用一个类,来简要的说明这一整个过程都发生了什么。
这是一个简单的Student类
在这里插入图片描述
一个Main方法
在这里插入图片描述
1.编译好App.Java文件获得App.class文件后,执行App.class文件,系统会启动一个JVM进程,JVM进程会从classpath路径下找到一个名为APP.class的二进制文件,然后用类加载器,将这个二进制文件加载到运行时数据区中的方法区内,这个过程叫做App类的加载
2.JVM找到App的程序入口,执行main方法
3.这个main的第一条语句是new一个Student对象出来,那么这个时候JVM就会赶紧去方法去看看有没有这个类的信息,所以JVM立即加载Student类,把这个类的信息放到方法区中去
4.加载完Student之后,JVM会在堆中为这个对象分配一个内存,然后调用构造函数初始化对象,这个Student对象实例会将指向方法区中Student类的类型信息的引用写入自己的方法头中去
5.执行student.sayName()时,JVM会根据student的引用找到student实例,再根据student对象持有的引用定位到方法区中Student类型信息的方法表中找到对应的方法,或者这个.sayName()的字节码地址
6.执行sayName()
其实也不用管太多,只需要知道对象实例初始化时会去方法区中找类信息,完成后再到栈那里去运行方法。找方法就在方法表中找。
这就是JVM的第一部分啦,认识了解JVM大致有什么,在代码运行时的都在背后做了什么,下一节再讲讲这个类加载器,码字不易点一个赞吧

http://www.lryc.cn/news/2392225.html

相关文章:

  • 教师申报书课题——项目名称: 基于DeepSeek-R1与飞书妙记的课堂话语智能分析实践计划
  • JAVA:Kafka 消息可靠性详解与实践样例
  • 【前端】Twemoji(Twitter Emoji)
  • Electron 桌面程序读取dll动态库
  • 实时技术对比:SSE vs WebSocket vs Long Polling
  • js 手写promise
  • HTTP 与 HTTPS 深度解析:原理、实践与大型项目应用
  • QT6.9中opencv引用路径的其中一种设置
  • k8s pod启动失败问题排查
  • Java类中各部分内容的加载执行顺序
  • git提交信息错误,如何修改远程git提交的备注信息
  • API Gateway CLI 实操入门笔记(基于 LocalStack)
  • 基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法
  • 数据分析案例-基于红米和华为手机的用户评论分析
  • leetcode617.合并二叉树:递归思想下的树结构融合艺术
  • 深度学习入门:从零搭建你的第一个神经网络
  • 【HTML-13】HTML表格合并技术详解:打造专业数据展示
  • 鸿蒙OSUniApp 制作自定义的进度条组件#三方框架 #Uniapp
  • 【Python办公】Excel简易透视办公小工具
  • m1 运行renrenfastvue出现的问题和解决方案
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-Docker(二)
  • 【C/C++】记录一次麻烦的Kafka+Json体验
  • Linux系列-2 Shell常用命令收集
  • MATLAB使用多个扇形颜色变化表示空间一个点的多种数值
  • mysql:MVCC机制
  • Vue3 + Element Plus 实现树形结构的“单选 + 只选叶子节点 + 默认选中第一个子节点”
  • CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发
  • 输电线路的“智慧之眼”:全天候可视化监测如何赋能电网安全运维
  • Spring 核心知识点补充
  • 两阶段法目标检测发展脉络