既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
让我们开始研究编译和解释语言之间的一些差异。
2.1 编译语言
编译器将编译语言(C ++,Go)直接转换为机器码。
在执行之前,它们需要明确的构建步骤。这就是为什么每次更改代码时都需要重新编译程序。
编译语言往往比解释语言更快,更有效。但是,它们生成的机器码是特定于平台的。
2.2 解释语言
在解释语言(Python,JavaScript)中,没有构建步骤。相反,解释器在执行程序时对程序的源代码进行操作。
曾经认为解释语言比编译语言要慢得多。但是,随着即时编译(JIT)的发展,性能差距正在缩小。JIT编译器在程序运行时将代码从解释语言转换为机器码。
此外,我们可以在Windows,Linux或Mac等多个平台上执行解释后的语言代码。解释代码与特定类型的CPU体系结构没有关联。
Java和JVM在设计时考虑了可移植性。因此,当今大多数流行的平台都可以运行Java代码。
这听起来似乎暗示着Java是一种纯解释性语言。但是,在执行之前,需要将Java源代码编译为字节码。字节码是JVM固有的一种特殊机器语言。JVM在运行时解释并执行此代码。
它是JVM为支持Java的每个平台构建和定制的,并不是我们的程序或库。
JVM也具有JIT编译器。 这意味着JVM在运行时优化我们的代码,以获得与编译语言相似的性能优势。
javac的命令行工具把Java源代码编译转换成Java类文件(xxx.class)与平台无关的字节码:
$ javac HelloWorld.java
源代码文件带有.java
后缀,而包含字节码的类文件则带有.class
后缀。
编译的类文件(字节码),可以由JVM执行:
$ java HelloWorld
Hello Java!
在运行时如何将字节码转换为机器本机代码。
5.1 架构概述
JVM由五部分组成:
-
类加载器
-
JVM内存结构
-
执行引擎
-
本地方法接口
-
本地方法库
5.2 类加载器
JVM利用ClassLoader将已编译的类文件加载到JVM内存
除加载外,ClassLoader还执行链接和初始化。
-
验证字节码是否存在安全漏洞
-
为静态变量分配内存
-
用原始引用替换符号内存引用
-
将原始值分配给静态变量
-
执行所有静态代码块
5.3 执行引擎
执行引擎负责读取字节码,将其转换为机器本机代码并执行。
三个主要组件负责执行,包括解释器和编译器:
-
由于JVM与平台无关,因此它使用解释器执行字节码
-
JIT编译器在重复的方法调用处,把字节码编译为本地代码以提高性能。
-
垃圾收集器收集并删除所有未引用的对象。
执行引擎利用本机方法接口(JNI)来调用本地库和应用程序。
5.4 即时编译器(JIT)
解释器的主要缺点是:每次调用方法时,都需要解释执行,这比编译的本机代码要慢。Java使用JIT编译器来克服此问题。
JIT编译器不能完全替代解释器。执行引擎仍在使用它。但是,JVM根据调用方法的频率使用JIT编译器。
JIT编译器将整个方法的字节码编译为机器本机代码,因此可以直接重用。与标准编译器一样,生成中间代码,进行优化,然后生成机器本机代码。
探查器是JIT编译器的特殊组件,负责查找热点。JVM根据运行时收集的性能分析信息来决定要编译的代码。
这样的效果是,经过几个执行周期,Java程序可以更快地执行其工作。JVM了解到热点后,便可以创建本机代码,从而使运行速度更快。
让我们看一下JIT编译如何提高Java的运行时性能。
6.1 斐波那契数列性能测试
我们将使用一种简单的递归方法来计算第n个斐波那契数:
private static int fibonacci(int index) {
if (index <= 1) {
return index;
}
return fibonacci(index-1) + fibonacci(index-2);
}
为了衡量重复方法调用的性能收益,我们将运行Fibonacci方法100次:
for (int i = 0; i < 100; i++) {
long startTime = System.nanoTime();
int result = fibonacci(12);
long totalTime = System.nanoTime() - startTime;
System.out.println(totalTime);
}
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
转存中…(img-Qmu9kMpH-1715837166204)]
[外链图片转存中…(img-zmyNzIr2-1715837166204)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新