前言如果在文中用词或者理解方面出现问题,欢迎指出 。此文旨在提及而不深究,但会尽量效率地把知识点都抛出来
#一、JVM的基本介绍JVM 是 JAVA Virtual machine 的缩写,它是一个虚构出来的计算机,一种规范 。通过在实际的计算机上仿真模拟各类计算机功能实现···
好,其实抛开这么专业的句子不说,就知道JVM其实就类似于一台小电脑运行在windows或者linux这些操作系统环境下即可 。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作 。
文章插图
#1.1 Java文件是如何被运行的1.1 Java文件是如何被运行的比如我们现在写了一个 HelloWorld.java 好了,那这个 HelloWorld.java 抛开所有东西不谈,那是不是就类似于一个文本文件,只是这个文本文件它写的都是英文,而且有一定的缩进而已 。
那我们的 JVM 是不认识文本文件的,所以它需要一个 编译 ,让其成为一个它会读二进制文件的 HelloWorld.class
#① 类加载器如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个 类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进JVM里面来 。
文章插图
② 方法区方法区 是用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
类加载器将 .class 文件搬过来就是先丢到这一块上
#③ 堆堆 主要放了一些存储的数据,比如对象实例,数组···等,它和方法区都同属于 线程共享区域 。也就是说它们都是 线程不安全 的
#④ 栈栈 这是我们的代码运行空间 。我们编写的每一个方法都会放到 栈 里面运行 。
我们会听说过 本地方法栈 或者 本地方法接口 这两个名词,不过我们基本不会涉及这两块的内容,它俩底层是使用C来进行工作的,和Java没有太大的关系 。
#⑤ 程序计数器主要就是完成一个加载工作,类似于一个指针一样的,指向下一行我们需要执行的代码 。和栈一样,都是 线程独享 的,就是说每一个线程都会有自己对应的一块区域而不会存在并发和多线程的问题 。
文章插图
小总结
- Java文件经过编译后变成 .class 字节码文件
- 字节码文件通过类加载器被搬运到 JVM 虚拟机中
- 虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行
文章插图
一个main方法
文章插图
执行main方法的步骤如下:
- 编译好 App.java 后得到 App.class 后,执行 App.class,系统会启动一个 JVM 进程,从 classpath 路径中找到一个名为 App.class 的二进制文件,将 App 的类信息加载到运行时数据区的方法区内,这个过程叫做 App 类的加载
- JVM 找到 App 的主程序入口,执行main方法
- 这个main中的第一条语句为 Student student = new Student("tellUrDream") ,就是让 JVM 创建一个Student对象,但是这个时候方法区中是没有 Student 类的信息的,所以 JVM 马上加载 Student 类,把 Student 类的信息放到方法区中
- 加载完 Student 类后,JVM 在堆中为一个新的 Student 实例分配内存,然后调用构造函数初始化 Student 实例,这个 Student 实例持有 指向方法区中的 Student 类的类型信息 的引用
- 执行student.sayName();时,JVM 根据 student 的引用找到 student 对象,然后根据 student 对象持有的引用定位到方法区中 student 类的类型信息的方法表,获得 sayName() 的字节码地址 。
- 执行sayName()
推荐阅读
- 二维码的升级版「三维码」你使用过吗?
- 保证健康的宝贵食物你掌握几种
- 开车那么久,你知道该如何保养爱车吗?
- 平板支撑有多厉害?坚持做一个月你就知道了
- 如果你正准备换发型,别错过这30款
- 蚊子最爱叮什么血型的人,你知道吗?
- 揠苗助长的意思和寓意 拔苗助长告诉我们什么道理
- 见男友的小tips是什么梗 见男友的小tips
- 中考成绩怎么查?
- 小叶紫檀|木质界的帝王之木,你了解多少?