欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM:你知道為什么對(duì)象一定在堆中分配嗎

 更新時(shí)間:2021年08月31日 18:09:56   作者:璇轉(zhuǎn)的魚  
這篇文章主要介紹了jvm對(duì)象的創(chuàng)建和分配的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下,希望能夠給你帶來幫助

JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)域:

JVM運(yùn)行時(shí)的數(shù)據(jù)區(qū)域可以分為:虛擬機(jī)棧、本地方法棧、方法區(qū)、程序計(jì)數(shù)器、堆。一般我們都說一切的對(duì)象的分配都是在堆中進(jìn)行分配的,即使是棧中的對(duì)象,棧也只是保存了該對(duì)象的引用,真正的對(duì)象仍然存儲(chǔ)在堆中。

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

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

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

 方法逃逸

根據(jù)對(duì)象的逃逸程度來選擇采用不同的優(yōu)化方案,針對(duì)逃逸程度有三種優(yōu)化方案:

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

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

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

不允許對(duì)象逃逸出方法范圍

標(biāo)量替換

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

逃逸分析技術(shù)存在的問題:

  • 到目前為止,該技術(shù)還未發(fā)展成熟,仍有很大的改進(jìn)余地
  • 逃逸分析的成本非常高,甚至不能保證逃逸分析帶來的性能收益會(huì)高于它的消耗

逃逸分析JVM參數(shù)設(shè)置:

  • -XX:+DoEscapeAnalysis 開啟逃逸分析
  • -XX:+PrintEscapeAnalysis 查看逃逸分析
  • -XX:+EliminateAllocations 開啟標(biāo)量替換
  • +XX:+EliminateLocks 開啟同步消除
  • -XX:+PrintEliminateAllocation 查看標(biāo)量替換

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論