文章目录

  • JVM
  • JMM
  • 内存自动管理
  • 编译,加载,执行
  • 编译
  • 前端编译器
  • 后端编译器
  • 加载
  • 执行
  • 篇结


JVM

JVM:java虚拟机。

是java能够在茫茫编程语言中脱颖而出的关键。java语言能够跨平台的运行,就是有了JVM的支撑。

JMM

JMM中文名称:java内存模型。

是JVM能够跨平台(java最大的特点)的本质,java无论如何跨平台运行,首先要确保一点,那就是在任何平台上,运行正确。无论计算机是多核还是单核,是win还是unix。JMM就是来规定和适配所有种类的计算机的。

JMM

内存自动管理

内存自动管理是java的另外一个特点,它能够让程序员不需要关注对象何时分配,何时回收,只管创建(new)即可,然后剩下的,“自有安排”。

这也是java对比C++进步的一些地方。但是掌握内存自动管理的过程,才能更加明白程序中对象的存在状况。

编译,加载,执行

编译

java文件通过编译之后会变成class字节码文件。java程序中的编译大体可分为两种:前端编译器和后端编译器。

前端编译器

前端编译器就是我们常见的javac编译,直白点就是 *.java 文件编译成为 *.class文件的过程。

后端编译器

后端编译器针对程序执行性能,比如即时编译和提前编译。java是一款编译解释型的语言,先编译成*.class文件,然后解释器进行解释执行。然而,每次所有的内容都解释执行对效率上也会有影响。所以,后端编译器做的内容,就是如何提升解释执行的效率。

  • 即时编译:会将频繁的执行的方法和代码进行编译,成为本地机器码,提升执行效率。

当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器 ——《深入理解java虚拟机》

  • 提前编译:在字节码解释执行之前,将其转变成为本地机器码,提升执行效率。

提前编译有两种分支:一种是在程序运行之前把程序代码编译成机器码的静态翻译工作;另外一条是把原本即时编译器在运行时要做的编译工作提前做好并保存下来,下次运行到这些代码时直接把它加载进来使用(也可以叫做即时编译缓存)。

加载

加载是java文件进行编译之后,jvm需要将*.class字节码加载到运行时数据区的过程。加载一共分为5个子过程:

java中m 是什么意思 java jmm是什么_jvm

简要说明:

  • 加载:加载类,并提供这个类的各种数据在方法区的入口。双亲委派模型 就作用在这里。
  • 验证:确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求。
  • 准备:正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。这里的初始值大多是零值(不是0。也可能是null,false等等),可以简单理解成调用的空构造方法。
  • 解析:Java虚拟机将常量池内的符号引用替换为直接引用的过程。
  • 初始化:根据程序员通过程序编码制定的主观计划去初始化类变量和其他资源。

执行

执行是通过执行引擎实现的。执行引擎在执行字节码的时候,通常有两种选择,一种就是开篇提到的:解释执行;另外一种就是配合后端编译器:编译执行。但是执行引擎的输入和输出都是一致的:输入的是字节码二进制流,输出是处理结果。唯一不同的是中间处理“字节码解释执行“的这个等效过程。

篇结

本篇主要梳理整个jvm的相关知识点。JMM,内存自动管理;编译,加载,执行。后面的内容是一个一个的分篇章解析。