JVM之认识程序运行本质

简介: JVM之认识程序运行本质

JVM之内存结构模型详解

JVM是什么

刚入门的时候老师教我们写代码是这样的:

写JAVA文件然后用javac命令编译成class文件运行即可。

随着学习的不断拓展和工作中业务代码的积累,对于“为什么会这样”的困惑越来越多,于是写了这篇博客~。

计算机能看懂的是二进制,也就是0和1。那么我们的JAVA程序和计算机又有什么关联呢?他们是怎么联系到一起的?

汇编语言

计算机只能识别0和1,人们发现利用0和1可以做很多事情:

比如可以做加法,由此减乘法除法(利用的也是加法)也可以做到;与,或,异或等这些构成了与门,非门等这些逻辑门;…在这上面进行扩展又可以做很多事情。

但是编写0和1太过于麻烦,这个时候出现了助记符也就是用一个英文代表一串01的数字,也就是汇编语言。

高级语言

对于开发者来说,用汇编写代码不太现实,一个简单的操作要用很多行汇编代码才能实现,所以再它之上做了处理,比如java,c,等等高级语言。那么计算机怎么识别高级语言的呢?

虚拟机是什么

答案是虚拟机,虚拟机可以理解为虚拟计算机,虚拟计算机通过解释器将其认识的指令解释为计算机认识的指令。JVM中只通过解释器来解释运行效率太慢,所以对于热点代码即反复执行的代码通过JIT即时编译器将其编译为本地代码。这个编译器叫做后端编译器。

JVM流行的一点原因是其跨平台性:一次编译,多端运行

怎么实现的大家也大概猜到了,JVM虚拟机识别操作系统将class字节码转换为不同操作系统可以识别的指令。

java代码如何转换成机器识别的代码

我们写代码的时候通过编写JAVA文件,通过javac命令编译成class文件,用java命令运行class文件。

拆分:

一,也就是javac命令将java代码编译成为java字节码也就是class文件,这个编译器叫做前端编译器。编译后的class文件由0和1构成,这其实是java字节码的结构。

二,通过类加载器ClassLoader的加载,链接,初始化后将其转换为JVM内存中的数据。我们要想看到class字节码结构是什么样的,可以通过反编译class文件,讲解JAVA字节码文件将在后面博客中详细介绍。

三,执行引擎将高级语言翻译为机器语言即计算机能够识别的语言。

总结:前端编译器将Java文件转换为字节码class文件,通过类加载器ClassLoader的加载,链接,初始化这三步加载到内存中,JVM识别字节码文件将数据放到对应的内存结构中,但是机器不认识这些字节码文件,所以执行引擎又进行了编译转化为计算机能够识别的指令【后端编译器】,其充当了转换字节码的任务(通过解释器解释运行,但是由于效率低,所以对于热点代码通过JIT即时编译器编译成本地代码)

最后来张图:

图中运行时数据区为JVM内存结构中的,下一篇博客进行讲解~。


目录
相关文章
|
2月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
74 3
|
4月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
5月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
4月前
|
消息中间件 设计模式 安全
多线程魔法:揭秘一个JVM中如何同时运行多个消费者
【8月更文挑战第22天】在Java虚拟机(JVM)中探索多消费者模式,此模式解耦生产与消费过程,提升系统性能。通过`ExecutorService`和`BlockingQueue`构建含2个生产者及4个消费者的系统,实现实时消息处理。多消费者模式虽增强处理能力,但也引入线程安全与资源竞争等挑战,需谨慎设计以确保高效稳定运行。
101 2
|
4月前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
59 3
|
5月前
|
Java 程序员 C++
大牛程序员用Java手写JVM:刚好够运行 HelloWorld
大牛程序员用Java手写JVM:刚好够运行 HelloWorld
|
4月前
|
Java
|
5月前
|
存储 算法 Java
(四)JVM成神路之深入理解虚拟机运行时数据区与内存溢出、内存泄露剖析
前面的文章中重点是对于JVM的子系统进行分析,在之前已经详细的阐述了虚拟机的类加载子系统以及执行引擎子系统,而本篇则准备对于JVM运行时的内存区域以及JVM运行时的内存溢出与内存泄露问题进行全面剖析。
116 0
|
6月前
|
存储 Java C++
Java虚拟机(JVM)在执行Java程序时,会将其管理的内存划分为几个不同的区域
【6月更文挑战第24天】Java JVM管理内存分7区:程序计数器记录线程执行位置;虚拟机栈处理方法调用,每个线程有独立栈;本地方法栈服务native方法;Java堆存储所有对象实例,垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息;运行时常量池存储常量;直接内存不属于JVM规范,通过`java.nio`手动管理,不受GC直接影响。
55 5
|
6月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
72 2