云原生时代的Java

   Java最大的地基(护城河)是其极其强大的软件生态以及极其庞大的使用者人群。

  在云原生的时代下,Java的统治地位不仅没有到什么坚不可摧,无后顾之忧的程度,说Java目前处于危机四伏的地位都不为过。最根本的原因是,目前随着云原生时代的到来,有一些以前植入Java语言的基因之中的,很多的假设前提,其实逐渐受到了争议,以及被动摇。

  Java的slogan:“一处编写,到处运行”。在服务端编程领域来说,总体上是面向大规模长时间运行的服务端程序而设计的。 这一假设,影响了很多语言和类库的特征。

  譬如,Java 总体上是面向大规模、长时间的服务端应用而设计的,严(luō)谨(suō)的语法利于约束所有人写出较一致的代码;静态类型动态链接的语言结构,利于多人协作开发,让软件触及更大规模;即时编译器、性能制导优化、垃圾收集子系统等 Java 最具代表性的技术特征,都是为了便于长时间运行的程序能享受到硬件规模发展的红利。

云原生时代Java的变革

  Leyden

    含义:莱顿(荷兰都市名)。

    是Spring和GraavlVM合作成立的项目,解决了Java启动慢,占用内存大,镜像体积大的问题;但是原生(提前)编译产生了系统的吞吐量低延迟高的问题。由此成立了以下这个项目。

  为什么系统的吞吐量低延迟高

    Leyden是Spring和GraalVM合作的项目,旨在通过使用GraalVM的即时(JIT)编译器和AOT(提前)编译器来改善Java应用程序的启动时间、内存占用和镜像体积等问题。

    GraalVM是一种高性能的Java虚拟机,它提供了两种不同的编译模式:即时编译(JIT)和AOT编译。

    即时编译(JIT)是指在运行时将Java字节码编译为本地机器代码。它可以通过分析运行时的程序行为来优化代码执行,从而提供较高的吞吐量和较低的延迟。这种编译方式适用于长时间运行的应用程序,因为它可以根据实际运行情况进行动态优化。

    AOT(提前)编译是指在构建或部署时将Java字节码预先编译为本地机器代码。这样做可以提高应用程序的启动速度、减少内存占用和镜像体积。然而,AOT编译可能会导致一些性能损失,因为它无法根据实际运行情况进行动态优化。

    因此,Leyden项目使用AOT编译来改善Java应用程序的启动时间、内存占用和镜像体积等问题。然而,AOT编译的一个缺点是它无法像即时编译那样根据实际运行情况进行优化,这可能导致系统的吞吐量低和延迟高的问题。

    虽然Leyden可以提供更快的启动时间和更小的镜像体积,但在某些情况下,它可能无法提供与即时编译相同的性能水平。因此,在选择使用Leyden或AOT编译时,需要权衡考虑应用程序的性能需求和启动时间需求。

  Valhalla

    无论使用什么语言,最终程序跑起来时对于底层硬件来说就两样东西:1. 生成送到CPU流水线上的指令流, 2. 在程序中,要被CPU指令流运算的数据。所以有一个说法叫 程序 = 代码 + 数据。

  Loom

    虚拟线程

      与JMM和 Java多线程模型冲突(IO密集型就浪费资源了;CPU密集型就不会了,一个CPU核心可以很好吃满一整条线程)

      一条Java线程(1MB栈内存,2-16KB的metadata)

    结构化并发(概念比较新,2016年的)

      是指程序的并发行为会与代码的结构对齐。“Code like sync,Work like async”正是 Loom 简化并发编程的核心理念。

  Portola

    JDK镜像瘦身

 

参考:云原生时代的Java

posted @ 2023-05-28 11:58  road2master  阅读(94)  评论(0编辑  收藏  举报