自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:JVM有哪些優(yōu)化手段?

開發(fā) 前端
在 HotSpot 虛擬機(jī)中,熱點(diǎn)代碼(Hot Code)是指那些被頻繁執(zhí)行的代碼。熱點(diǎn)代碼的執(zhí)行次數(shù)在不同的 JDK 版本和不同的 JVM 中是不同的。

JIT、逃逸分析等都屬于 JVM 優(yōu)化手段,JVM(Java 虛擬機(jī))優(yōu)化手段是指在運(yùn)行 Java 程序時(shí),通過對(duì)字節(jié)碼的編譯和執(zhí)行過程進(jìn)行優(yōu)化,以提升程序的性能和效率。

JVM 優(yōu)化手段主要有以下幾個(gè):

JIT(Just-In-Time,即時(shí)編譯):是一種在程序運(yùn)行時(shí)將部分熱點(diǎn)代碼編譯成機(jī)器代碼的技術(shù),以提高程序的執(zhí)行性能的機(jī)制。

逃逸分析:用于確定對(duì)象動(dòng)態(tài)作用域是否超過當(dāng)前方法或線程,通過逃逸分析,編譯器可以決定一個(gè)對(duì)象的作用范圍,從而進(jìn)行相應(yīng)的優(yōu)化,但確定對(duì)象沒有逃逸時(shí),可以進(jìn)行以下優(yōu)化:

  • 棧上分配:如果編譯器可以確定一個(gè)對(duì)象不會(huì)逃逸出方法,它可以將對(duì)象分配在棧上而不是堆上。在棧上分配的對(duì)象在方法返回后就會(huì)自動(dòng)銷毀,不需要進(jìn)行垃圾回收,提高了程序的執(zhí)行效率。
  • 鎖消除:如果對(duì)象只在單線程中使用,那么同步鎖可能會(huì)被消除,提高程序性能。
  • 標(biāo)量替換:將原本需要分配在堆上的對(duì)象拆解成若干個(gè)基礎(chǔ)數(shù)據(jù)類型存儲(chǔ)在棧上,進(jìn)一步減少堆空間的使用。

字符串池(String Pool)優(yōu)化:JVM 通過共享字符串常量,重用字符串對(duì)象,以減少內(nèi)存占用和提升字符串操作的性能。

1.JIT優(yōu)點(diǎn)和熱點(diǎn)代碼

JIT 優(yōu)點(diǎn)包含以下兩個(gè):

  • 性能優(yōu)化:由于編譯成本地機(jī)器代碼,程序的執(zhí)行速度通常比解釋性執(zhí)行或預(yù)編譯的代碼要快得多。
  • 平臺(tái)無(wú)關(guān)性:JIT 編譯器可以根據(jù)不同的硬件平臺(tái)生成不同的機(jī)器代碼,使得相同的程序可以在不同的計(jì)算機(jī)上運(yùn)行,而無(wú)需重新編寫。

什么是熱點(diǎn)代碼?

在 HotSpot 虛擬機(jī)中,熱點(diǎn)代碼(Hot Code)是指那些被頻繁執(zhí)行的代碼。熱點(diǎn)代碼的執(zhí)行次數(shù)在不同的 JDK 版本和不同的 JVM 中是不同的,例如,它在 JDK 21 Client 模式下為 1500 次,Server 模式下為 10000 次,這個(gè)值可以通過 JVM 參數(shù)設(shè)置。通常來說,熱點(diǎn)代碼的識(shí)別基于以下兩種策略:

  1. 方法調(diào)用次數(shù):當(dāng)一個(gè)方法被調(diào)用一定次數(shù)后,會(huì)被視為熱點(diǎn)代碼并觸發(fā)即時(shí)編譯。這個(gè)次數(shù)在不同 JDK 版本中可能有所變化,并且可以通過 JVM 參數(shù) -XX:CompileThreshold 進(jìn)行設(shè)置。
  2. 回邊計(jì)數(shù):對(duì)于循環(huán)體等熱點(diǎn)區(qū)域,通過統(tǒng)計(jì)從循環(huán)體返回到循環(huán)條件檢查點(diǎn)的次數(shù)(即回邊次數(shù)),達(dá)到一定次數(shù)也會(huì)觸發(fā)即時(shí)編譯。同樣,這個(gè)閾值也可以通過 JVM 參數(shù) -XX:OnStackReplacePercentage 進(jìn)行設(shè)置?;剡呌?jì)數(shù)器有一個(gè)計(jì)算公式【回邊計(jì)數(shù)器閾值=方法調(diào)用計(jì)數(shù)器閾值*(OnStackReplacePercentage - InterpreterProfilePercentage)】,通過計(jì)算,在 JDK 21 Server 模式下,虛擬機(jī)回邊計(jì)數(shù)器的閾值為 10700【10000*(140-33)】。

可以使用 java -XX:+PrintFlagsFinal -version 命令查看 JVM 默認(rèn)配置。

2.棧上分配 VS 標(biāo)量替換

棧上分配和標(biāo)量替換是編譯器的兩種優(yōu)化技術(shù),它們雖然有一些相似之處,但并不完全相同。

  • 棧上分配(Stack Allocation):一種優(yōu)化技術(shù),它將對(duì)象分配在棧上而不是堆上。這種技術(shù)適用于編譯器可以確定對(duì)象不會(huì)逃逸出方法,并且對(duì)象的生命周期在方法內(nèi)部結(jié)束的情況。通過在棧上分配對(duì)象,可以避免在堆上進(jìn)行內(nèi)存分配和垃圾回收的開銷,從而提高程序的性能和內(nèi)存使用效率。
  • 標(biāo)量替換(Scalar Replacement):與棧上分配類似,也是一種優(yōu)化技術(shù)。它將一個(gè)復(fù)雜對(duì)象拆分成獨(dú)立的成員變量,使其成為基本類型或基本類型數(shù)組的局部變量。這種技術(shù)適用于編譯器可以確定對(duì)象的成員變量不會(huì)逃逸的情況。標(biāo)量替換可以提供更細(xì)粒度的控制,使得編譯器可以對(duì)獨(dú)立的成員變量進(jìn)行更精細(xì)的優(yōu)化,例如寄存器分配和代碼優(yōu)化。

也就是說棧上分配,只是將對(duì)象從堆上分配到棧上了;而標(biāo)量替換是更進(jìn)一步的優(yōu)化技術(shù),將對(duì)象拆解成基本類型分配到棧上了。

(1)鎖消除代碼演示

鎖消除(Lock Elimination)也叫做同步消除,是一種編譯器優(yōu)化技術(shù),它可以消除對(duì)于變量的不必要的鎖定操作。鎖消除的目的是減少鎖的開銷,提高程序的性能。例如以下代碼:

public void method() {
    Object lock = new Object();
    synchronized(lock){
        System.out.println("www.javacn.site");
    }
}

而鎖消除之后的代碼如下:

public void method(){
    System.out.println("www.javacn.site");
}

(2)標(biāo)量替換代碼演示

未優(yōu)化前的代碼如下:

private static class Point {
    private int x;
    private int y;
}
public static void main(String[] args) {
    Point point = createPoint(10, 20);
    int sum = point.x + point.y;
    System.out.println("Sum: " + sum);
}
private static Point createPoint(int x, int y) {
    Point point = new Point();
    point.x = x;
    point.y = y;
    return point;
}

標(biāo)量替換優(yōu)化后的代碼如下:

public static void main(String[] args) {
    int x = 10;
    int y = 20;
    int sum = x + y;
    System.out.println("Sum: " + sum);
}

通過逃逸分析的優(yōu)化能夠減少垃圾回收的壓力、減少內(nèi)存分配和釋放帶來的性能損耗,并且有可能減少對(duì)鎖的依賴,以及實(shí)現(xiàn)標(biāo)量替換等,從而整體上提升了應(yīng)用程序的運(yùn)行效率。

課后思考

Java 為什么不把所有代碼提前都編譯成二進(jìn)制的機(jī)器碼呢?這樣豈不是運(yùn)行更快?新 Java 虛擬機(jī) GraalVM 中的 AOT 和 JIT 又有什么區(qū)別呢?

責(zé)任編輯:姜華 來源: Java中文社群
相關(guān)推薦

2025-03-26 01:25:00

MySQL優(yōu)化事務(wù)

2021-08-02 08:34:20

React性能優(yōu)化

2023-02-20 08:08:48

限流算法計(jì)數(shù)器算法令牌桶算法

2024-02-26 14:07:18

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2024-04-19 00:00:00

計(jì)數(shù)器算法限流算法

2024-03-12 14:36:44

微服務(wù)HTTPRPC

2024-02-01 08:08:53

Spring過濾器類型Gateway

2021-08-11 08:53:23

Git命令面試

2025-03-04 08:06:17

2021-06-02 09:42:29

Node. js全局對(duì)象

2021-07-01 07:51:45

React事件綁定

2024-05-29 14:34:07

2021-05-27 05:37:10

HTTP請(qǐng)求頭瀏覽器

2021-09-30 07:57:13

排序算法面試

2024-07-26 08:10:10

2023-02-16 07:30:38

引用計(jì)數(shù)算法

2021-07-05 11:06:11

組件React通信

2024-02-21 07:40:17

JVM內(nèi)存虛擬機(jī)

2022-07-26 08:40:42

Java并發(fā)工具類
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)