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

接地气的方式认识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大致有什么,在代码运行时的都在背后做了什么,下一节再讲讲这个类加载器,码字不易点一个赞吧

相关文章:

  • 通过teamcity cloud创建你的一个build
  • 【C语言】详解 指针
  • Java开发之定时器学习
  • 欧拉角转为旋转矩阵
  • 二叉树的锯齿形层序遍历——灵活跳跃的层次结构解析
  • w~视觉~合集6
  • 自我觉察是成长的第一步,如何构建内心的平静
  • 【线程与进程区别】
  • Spring AI框架快速入门
  • 华为OD机试真题——最佳的出牌方法(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • SAR ADC 比较器的offset 校正
  • 加密协议知多少
  • STP(生成树协议)原理与配置
  • AD-PCB--元件库介绍及电阻电容模型的创建 DAY4
  • SQLiteStudio - 免费开源、轻量高效,跨平台的 SQLite 数据库管理工具,代替 Navicat for SQLite
  • 数据结构与算法:数位dp
  • ORB-SLAM2学习笔记:ComputeKeyPointsOctTree分析过程记录
  • Vision + Robot New Style
  • IP证书的作用与申请全解析:从安全验证到部署实践
  • day39 pythonCNN网络
  • 做网站需要的知识/网站seo推广seo教程
  • 山东鲁桥建设有限公司网站/品牌运营公司
  • 中国人民银行网站官网/友情链接平台站长资源
  • 网站开发 简历/网站查询平台官网
  • 网站效果图怎么做/百度seo点击
  • 您的网站未备案 或者原备案号被取消/网站是怎么建立起来的