初识JVM

> 事先说明本项目主要是为了让本人更加了解到java虚拟机以及java代码运行思路,在此同时我本人也在编写一款虚拟机,尝试从中掌握更多知识

什么是JVM?

JVM其实是java virtual machine,他其实也是一个计算机上运行的程序,职责是运行java字节码文件

image-20240704112815348

注:javac在这之中是由编译器程序进行工作的,与jvm无关

JVM的不同导致了Java的不同:

jvm是实时根据字节码文件进行对应的字节码文件进行解释成功机器码进行在异构的计算机上运行

打个比方,就好比你是一个只会说普通话的中国人,你想到世界各地生活,从而带了个能把普通话翻译成各种语言的翻译

jvm的功能

image-20240704113935261

即时编译

image-20240704115005490

image-20240704114138305

JIT所做的优化

image-20240704114227691

image-20240704114621486

不解1之jvm解释优化后的所有机器码仍然大多数会保存在磁盘中吗?毕竟他的优化是体现在热点代码保存在内存中?如果是这样他如何协调这之中的io呢?

错误!一言以蔽之,热点代码放内存,其他代码大多是要用在解释并优化,JVM 的即时编译器(JIT Compiler)会根据程序运行时的实际情况,将经常执行的热点代码从字节码(Java源代码编译后的中间码)动态地优化成本地机器码,并将这些优化后的机器码保存在内存中,以便下次执行时直接使用,从而提高执行速度。

而对于那些不那么频繁执行的代码,JVM 可能会选择延迟优化,或者在需要时才进行即时编译优化。这种动态的机制可以确保在运行时平衡内存占用和性能优化的需要。

不解2热点代码如何进行判定?热点代码的粒度如何?是Method层面?还是对象层面还是属性层面?

热点代码的判定和优化是 JVM 中性能优化的重要部分,其粒度可以从方法(Method)层面到更细的对象(Object)或属性(Field)层面,具体取决于 JVM 的实现和优化策略。

通常来说,热点代码的判定和优化可以考虑以下几个层面:

  1. 方法层面:最常见的热点代码是经常被调用的方法。JVM 可以跟踪和统计方法的调用频率,当某个方法被频繁调用时,就可以将其视为热点代码,进而进行优化,比如将其编译为机器码并缓存起来。
  2. 循环和代码块:循环体内部的代码或者频繁执行的代码块也可能被视为热点代码。这些代码块执行频率高,因此对它们进行优化可以显著提升程序的性能。
  3. 对象和属性:在某些情况下,JVM 也可以根据对象或者对象的属性的使用频率来进行优化。比如某个对象的某个属性被频繁访问或修改,JVM 可能会优化对这些属性的访问路径,或者进行相关的内联优化。

热点代码的判定通常依赖于 JVM 的运行时统计信息,例如方法调用次数、循环执行次数等。不同的 JVM 实现可能采用不同的算法和策略来确定热点代码,以达到最佳的性能优化效果。

不解3为什么java要致力于实时解释也就是对应的跨平台,例如C他们其实在开发多个平台中的应用时,关键的地方也就只有系统调用的使用上有一定的问题吧?我们把对应c的代码在各个平台上进行编译和链接不也行吗?
  1. 平台无关性:Java的平台无关性不仅限于系统调用,还包括数据类型的大小、字节序等系统级别的差异。Java虚拟机在不同平台上提供了一致的运行环境,可以解决这些差异,确保Java程序在各种操作系统和硬件平台上表现一致。
  2. 简化开发和部署:Java的跨平台特性简化了开发和部署过程。开发者不需要为每个平台单独编写和维护代码,也不需要处理平台特定的编译和链接问题。这降低了开发成本和维护成本,加快了软件的开发周期。

对比于C语言,虽然也可以通过编写和维护多个平台的代码来实现跨平台,但这需要处理许多平台相关的细节和系统调用的差异。在C语言中,需要依赖于预处理器指令、条件编译等手段来处理不同平台的代码差异,而且需要额外的测试和调试工作来确保在不同平台上的兼容性和稳定性。

常见的jvm

image-20240704114641198

JVM虚拟机规范

image-20240704114720473

关于其他语言的问题,主要就是编译器的事了,只要最终能编译出同类型的class文件,那么在maven层面上的依赖也是共通的

HotSpot发展历史

image-20240704114851367

posted @ 2024-07-05 16:41  海山了-  阅读(17)  评论(0编辑  收藏  举报