您的位置 首页 java

Java是如何实现高性能的?

今天,从欧洲到澳大利亚,乘坐澳航的直达航班大约需要16个小时–这在100年前需要一个多月的旅程。如今,速度就是一切,这一原则也适用于软件开发。在动态的本地和网络应用的存在下,没有用户会等待内容的加载。这给软件开发者带来了真正的挑战。那么,在开发高性能软件时,为什么要从几十种流行的选择中选择 java 编程语言?在今天的文章中,我们将尝试回答这个问题。我们将重点讨论使 Java 成为低延迟和高吞吐量系统的完美选择的各个方面。

内容

  • Java虚拟机 –Java性能的基础
  • 是什么使Java成为高性能系统的完美语言
  1. 编译和解释
  2. 平台独立
  3. JIT – 即时编译器
  4. 多线程能力
  5. 垃圾收集

Java虚拟机–Java性能的基础

Java性能的核心是Java虚拟机,简称 JVM

JVM有两个主要功能:允许Java程序在任何操作系统或设备上运行(根据著名的 “写一次,在任何地方运行 “原则),并优化和主动管理程序内存。

Java是如何实现高性能的?

  我们可以区分JVM的两个定义。

1. Java虚拟机是软件程序执行其代码的运行环境。

2. Java虚拟机是Java程序的运行方式。我们配置好设置,然后在执行过程中依靠JVM来管理程序资源。

JVM中有很多元素,每一个元素都对软件的性能有着深刻的影响。我们可以区分出对性能有影响的JVM的三个不同组件,开发人员可以对它们进行调整。

类加载器 –当编译一个.java源文件时,它以. class文件 的形式被转换为 字节码 。当你想在你的程序中使用这个类文件时,它必须由类加载器加载到主程序内存中。这个过程包括3个阶段,加载、链接和初始化,所有这些都对应用程序的性能有深刻的影响。

运行时内存/数据区 – 由5个核心部分组成,它负责提供内存来存储字节码、参数、对象、返回值和局部变量。

执行引擎 – 它负责执行每个类中存在的代码。然而,在执行程序之前,字节码本身需要被转换为JVM能够理解的指令。为了实现这一点,JVM可以使用解释器或JIT编译器,我们将在下面详细介绍。

Java是如何实现高性能的?

  JVM是实现真正的Java性能的一个关键工具。有经验的开发者可以通过调整Java虚拟机的默认参数来微调它,以更好地满足应用程序的需求。这个过程可以包括调整堆的大小,并选择合适的垃圾收集器。

作为一般的经验法则,在调整JVM时,你应该首先关注内存使用要求,然后是延迟,最后是应用程序的吞吐量。

是什么让Java成为高性能系统的完美语言

好了,我们已经确定JVM是实现Java性能的一个关键工具。那么,使Java成为构建高性能软件应用程序的完美编程语言的其他方面、特点和功能呢?

这里有五个关键点。

1.编译和解释

编程语言通常可以是编译的(C、C++、 Haskell Erlang 或Rust)或解释的(PHP、 Python Ruby 和JavaScript)。

在这方面,Java是一种万能的语言,因为它结合了编译语言的力量和解释语言的显著灵活性。

正如我们之前在介绍Java虚拟机时提到的, Java编译器 javac )将java源代码编译成字节码,然后可以在所有装有JVM的机器上执行。

这张图更好地展示了这个过程。

Java是如何实现高性能的?

2.平台的独立性

JVM赋予了Java最大的优势–平台独立性。

Java虚拟机几乎可以安装在所有可用的操作系统上,从Windows,到Mac和 Linux 。平台独立性允许在任何机器上编译和执行代码,并确保结果相同。

在这种情况下,字节码是实现完全平台独立性的关键,也值得解释一下字节码到底是什么,因为我们在本文中已经提到过几次。

Java字节码只是一个包含JVM指令的程序。它的工作原理类似于 汇编器 ,是C++代码的一种表示。就其本身而言,它是一种 二进制 格式的代码,由常量、引用和数字代码组成,可由机器的硬件读取和执行。

这里有一张图,解释了Java字节码是如何实现平台独立的。

Java是如何实现高性能的?

3.JIT – 及时编译器

说到编译,这里是Java的另一张王牌–即时编译器(JIT)编译器)。将字节码转换为本地机器语言执行的方式对它的速度有很大影响。 JIT编译器 与Java虚拟机(JVM)互动,将Java字节码序列变成本地机器代码。

重要的是,JIT编译器是按需编译代码的。这意味着,它只编译正在被调用的方法。这大大提高了整体效率,节省了时间。

在使用JIT编译器时,计算机硬件能够直接执行本地代码,而不是让JVM一次又一次地解释同一序列的字节码。如果编译后的方法被频繁地执行,这可能会导致大量的性能提升。

更重要的是,JIT编译器在编译为本地机器语言的同时,还能进行很多简单的优化。其中一些优化包括数据分析、从堆栈操作到 寄存器 操作的转换、通过寄存器分配减少内存访问,以及消除常见的子表达式。

4. 多线程 能力

Java是一种能够在语言层面上实现多线程的技术。多线程允许程序在多个计算核心和 线程 上执行并发的计算。更重要的是,多线程应用程序可以保持对输入的响应,即使是在执行长期运行的任务时。

多线程现在比以往任何时候都更重要,特别是当硬件公司正在发布越来越强大的企业级 CPU ,如新披露的Zen 4 Epyc处理器,提供令人震惊的192个计算线程。

区分多线程和多处理也很关键。第一个术语指的是在多个CPU线程上并发执行计算的能力。另一方面,后者指的是一个系统同时运行多个处理器的能力,其中每个处理器可以操作多个线程。

一般来说,多线程是首选,因为CPU线程使用一个共享的内存区域,这有助于节省内存,并允许稍快的内容切换。

5.垃圾收集

最后但并非最不重要的是,我们必须涵盖Java的垃圾收集。简而言之,它是Java程序进行自动内存管理的过程。当Java程序在JVM上运行时,对象在堆上被创建,但最终,其中一些对象将不再被需要。

垃圾收集器会自动检测这些未使用的对象并将其删除,在此过程中释放出宝贵的内存资源。

在Java中执行垃圾收集过程有三个阶段。

  • 检查是否符合条件

如果一个对象无法到达,就有资格进行垃圾收集(GC)。我们可以区分四种使Java对象符合垃圾收集条件的主要方式。

重新分配指针变量

删除指针变量

Employee employee = new Employee();

employee = null;

使用匿名对象

register(new Employee());

隔离岛 (一组相互引用的对象,但不被应用程序中的任何活动对象所引用)。

  • 请求JVM运行垃圾收集器

请求JVM运行垃圾收集器可以通过两种主要方式设置。

  • 使用System.gc()方法 – System类包含 静态方法 gc(),用于请求JVM运行垃圾收集器。
  • 使用Runtime.getRuntime().gc()方法–Runtime类允许应用程序与运行该应用程序的JVM接口。通过使用其gc()方法,我们可以请求JVM运行GC。

  • 最终化

在删除一个对象之前,垃圾收集器对该对象使用 finalize ()方法来执行最后的清理活动。一旦finalize()方法完成,Garbage Collector就会删除该对象。

Java是如何实现高性能的 – 总结

Java实现了高性能的软件开发,这是其他编程语言无法做到的。所有的开发人员都应该确保他们正在开发的Java程序能够充分发挥其能力,并正确利用这种奇妙的编程语言所提供的所有工具。

文章来源:智云一二三科技

文章标题:Java是如何实现高性能的?

文章地址:https://www.zhihuclub.com/183051.shtml

关于作者: 智云科技

热门文章

网站地图