成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:JVM有哪些優化手段?

開發 前端
在 HotSpot 虛擬機中,熱點代碼(Hot Code)是指那些被頻繁執行的代碼。熱點代碼的執行次數在不同的 JDK 版本和不同的 JVM 中是不同的。

JIT、逃逸分析等都屬于 JVM 優化手段,JVM(Java 虛擬機)優化手段是指在運行 Java 程序時,通過對字節碼的編譯和執行過程進行優化,以提升程序的性能和效率。

JVM 優化手段主要有以下幾個:

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

逃逸分析:用于確定對象動態作用域是否超過當前方法或線程,通過逃逸分析,編譯器可以決定一個對象的作用范圍,從而進行相應的優化,但確定對象沒有逃逸時,可以進行以下優化:

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

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

1.JIT優點和熱點代碼

JIT 優點包含以下兩個:

  • 性能優化:由于編譯成本地機器代碼,程序的執行速度通常比解釋性執行或預編譯的代碼要快得多。
  • 平臺無關性:JIT 編譯器可以根據不同的硬件平臺生成不同的機器代碼,使得相同的程序可以在不同的計算機上運行,而無需重新編寫。

什么是熱點代碼?

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

  1. 方法調用次數:當一個方法被調用一定次數后,會被視為熱點代碼并觸發即時編譯。這個次數在不同 JDK 版本中可能有所變化,并且可以通過 JVM 參數 -XX:CompileThreshold 進行設置。
  2. 回邊計數:對于循環體等熱點區域,通過統計從循環體返回到循環條件檢查點的次數(即回邊次數),達到一定次數也會觸發即時編譯。同樣,這個閾值也可以通過 JVM 參數 -XX:OnStackReplacePercentage 進行設置?;剡呌嫈灯饔幸粋€計算公式【回邊計數器閾值=方法調用計數器閾值*(OnStackReplacePercentage - InterpreterProfilePercentage)】,通過計算,在 JDK 21 Server 模式下,虛擬機回邊計數器的閾值為 10700【10000*(140-33)】。

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

2.棧上分配 VS 標量替換

棧上分配和標量替換是編譯器的兩種優化技術,它們雖然有一些相似之處,但并不完全相同。

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

也就是說棧上分配,只是將對象從堆上分配到棧上了;而標量替換是更進一步的優化技術,將對象拆解成基本類型分配到棧上了。

(1)鎖消除代碼演示

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

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)標量替換代碼演示

未優化前的代碼如下:

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;
}

標量替換優化后的代碼如下:

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

通過逃逸分析的優化能夠減少垃圾回收的壓力、減少內存分配和釋放帶來的性能損耗,并且有可能減少對鎖的依賴,以及實現標量替換等,從而整體上提升了應用程序的運行效率。

課后思考

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

責任編輯:姜華 來源: Java中文社群
相關推薦

2025-03-26 01:25:00

MySQL優化事務

2021-08-02 08:34:20

React性能優化

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2025-06-04 07:48:46

2024-02-26 14:07:18

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2024-04-19 00:00:00

計數器算法限流算法

2024-03-12 14:36:44

微服務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全局對象

2021-07-01 07:51:45

React事件綁定

2024-07-26 08:10:10

2021-09-30 07:57:13

排序算法面試

2021-05-27 05:37:10

HTTP請求頭瀏覽器

2024-05-29 14:34:07

2023-02-16 07:30:38

引用計數算法

2021-07-05 11:06:11

組件React通信

2024-02-21 07:40:17

JVM內存虛擬機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99精品久久久久蜜桃tv | 宅女噜噜66国产精品观看免费 | 日韩中文欧美 | 久久久不卡网国产精品一区 | 天天草天天干 | 国产精品日韩 | 91在线一区二区三区 | 91精品国产麻豆 | 亚洲码欧美码一区二区三区 | 成人欧美一区二区三区在线观看 | 日日夜夜精品 | 天天干天天操天天射 | 国产精品视频入口 | 日韩精品一区二区三区高清免费 | 不卡在线视频 | 中文字幕一区二区三区乱码在线 | 国产精品毛片久久久久久 | 国产区视频在线观看 | 一级片免费视频 | 久久大香| 久久精品网 | 天天摸天天看 | 国产精品国产精品国产专区不片 | 免费黄色在线 | 成人精品一区亚洲午夜久久久 | 欧美精品网站 | www.日本国产 | 精品一区二区在线观看 | 一本一道久久a久久精品蜜桃 | 免费成人在线网站 | 中文字幕第十页 | 国产黄色小视频在线观看 | 午夜码电影| 精品日韩一区 | 国产精品久久国产精品 | 人人看人人射 | 91九色porny首页最多播放 | 一级黄色大片 | 国产精品小视频在线观看 | 免费久久视频 | 久久精品久久久久久 |