溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM對象為什么一定在堆中分配

發布時間:2021-08-30 16:56:08 來源:億速云 閱讀:132 作者:chen 欄目:開發技術

這篇文章主要介紹“JVM對象為什么一定在堆中分配”,在日常操作中,相信很多人在JVM對象為什么一定在堆中分配問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JVM對象為什么一定在堆中分配”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • JVM運行時數據區域:

  • 逃逸分析技術存在的問題:

  • 逃逸分析JVM參數設置:

JVM運行時數據區域:

JVM運行時的數據區域可以分為:虛擬機棧、本地方法棧、方法區、程序計數器、堆。一般我們都說一切的對象的分配都是在堆中進行分配的,即使是棧中的對象,棧也只是保存了該對象的引用,真正的對象仍然存儲在堆中。

JVM對象為什么一定在堆中分配

然而實際上,對象并不總是在堆中進行分配的,這里就需要介紹一下JVM的逃逸分析技術了。JVM會通過逃逸分析技術,對于逃不出方法的對象,會讓其在??臻g上進行分配。

逃逸分析技術:英文稱為 Escape Analysis,是目前JVM中比較前沿的一種優化技術,與類型繼承關系分析一樣,并不是直接優化代碼的手段,而是為其他優化措施提供依據的分析技術。

基本原理:分析對象動態作用域,當一個對象在方法里面被定義后,它可能被外部方法所引用,例如作為調用參數傳遞到其他方法中,這種行為被稱為方法逃逸;當一個對象被外部線程訪問到時,比如賦值給可以在其他線程中訪問的實例變量,這種行為稱為線程逃逸。從不逃逸、方法逃逸到線程逃逸,稱為對象由低到高的不同程度的逃逸。

JVM對象為什么一定在堆中分配

 方法逃逸

根據對象的逃逸程度來選擇采用不同的優化方案,針對逃逸程度有三種優化方案:

  • 棧上分配(Stack Allocations):如果能夠確定一個對象不會逃逸出線程之外,可以讓該對象在??臻g上進行分配,對象所占用的內存空間就會隨著棧幀出棧而銷毀。這樣做的好處就是減少資源消耗,對于JVM來說,對垃圾對象進行標記以及回收過程,都會消耗很多的資源,利用棧來分配會減少JVM標記回收對象的數量,減輕回收壓力。

棧上分配支持方法逃逸,但不能支持線程逃逸,也就是說,對于逃不出方法的對象才能在棧中進行分配

  • 標量替換(Scalar Replacement):標量,即一個已經無法在分解成更小的數據的數據,比如JVM中原始數據類型(int,long等);如果一個數據可以繼續分解,則稱為聚合量,Java的對象就是典型的聚合量。把一個對象拆散,根據程序的訪問情況,將其用到的成員變量恢復成為原始類型來訪問,稱為標量替換。若對象可以不被方法外部訪問且不會被拆散,則可以不創建對象,直接創建它的成員變量。

不允許對象逃逸出方法范圍

JVM對象為什么一定在堆中分配

標量替換

  • 同步消除:如果一個變量不會逃逸出線程之外,無法被其他線程訪問到,則可以不用進行同步措施。即可以消除掉對該變量的同步操作。不會產生線程安全問題。

逃逸分析技術存在的問題:

  • 到目前為止,該技術還未發展成熟,仍有很大的改進余地

  • 逃逸分析的成本非常高,甚至不能保證逃逸分析帶來的性能收益會高于它的消耗

逃逸分析JVM參數設置:

  • -XX:+DoEscapeAnalysis 開啟逃逸分析

  • -XX:+PrintEscapeAnalysis 查看逃逸分析

  • -XX:+EliminateAllocations 開啟標量替換

  • +XX:+EliminateLocks 開啟同步消除

  • -XX:+PrintEliminateAllocation 查看標量替換

到此,關于“JVM對象為什么一定在堆中分配”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女