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

靈魂拷問:Java對象的內存分配過程是如何保證線程安全的?

開發 后端 開發工具
JVM內存結構,是很重要的知識,相信每一個靜心準備過面試的程序員都可以清楚的把堆、棧、方法區等介紹的比較清楚。

[[272058]]

 JVM內存結構,是很重要的知識,相信每一個靜心準備過面試的程序員都可以清楚的把堆、棧、方法區等介紹的比較清楚。

 

上圖,是一張在作者根據《Java虛擬機規范(Java SE 8)》中描述的JVM運行時內存區域結構畫的。

很多人都知道Java對象是在堆內存中分配空間的(JIT優化除外),也知道內存分配過程中是線程安全的,那么虛擬機到底是如何保證線程安全的呢?本文就來簡單介紹一下。

1.Java對象的內存分配

我們知道,Java是一門面向對象的語言,我們在Java中使用的對象都需要被創建出來,在Java中,創建一個對象的方法有很多種,如使用new、使用反射、使用Clone方法等,但是無論如何,對象在創建過程中,都需要進行內存分配。

拿最常見的new關鍵字舉例,當我們使用new創建對象后代碼開始運行后,虛擬機執行到這條new指令的時候,會先檢查要new的對象對應的類是否已被加載,如果沒有被加載則先進行類加載。

在類加載檢查通過之后,就需要給對象進行內存分配了,分配的內存主要用來存放對象的實例變量。

在進行內存分配時,需要根據對象中的實例變量情況等信息確定需要分配的空間大小,然后從Java堆中劃分出這樣一塊區域(假設沒有JIT優化)。

根據JVM使用的垃圾回收器的類型,因其回收算法不同,會導致堆中內存分配情況不同。如標記-清楚算法回收后的內存中會有大量不連續的內存碎片,在給新的對象分配的時候,就需要通過"空閑列表"來確定一塊空閑區域。(這部分不是本文重點,讀者可以自行學習一下。)

無論那種方式,最終都需要確定出一塊內存區域,用于給新建對象分配內存。我們知道,對象的內存分配過程中,主要是對象的引用指向這個內存區域,然后進行初始化操作。

那么問題就來了:

在并發場景中,如何內存分配過程的線程安全性?如果兩個線程先后把對象引用指向了同一個內存區域,怎么辦。

2.TLAB

一般有兩種解決方案:

  • 1、對分配內存空間的動作做同步處理,采用CAS機制,配合失敗重試的方式保證更新操作的線程安全性。
  • 2、每個線程在Java堆中預先分配一小塊內存,然后再給對象分配內存的時候,直接在自己這塊"私有"內存中分配,當這部分區域用完之后,再分配新的"私有"內存。

方案1在每次分配時都需要進行同步控制,這種是比較低效的。

方案2是HotSpot虛擬機中采用的,這種方案被稱之為TLAB分配,即Thread Local Allocation Buffer。這部分Buffer是從堆中劃分出來的,但是是本地線程獨享的。

這里值得注意的是,我們說TLAB時線程獨享的,但是只是在“分配”這個動作上是線程獨占的,至于在讀取、垃圾回收等動作上都是線程共享的。而且在使用上也沒有什么區別。

另外,TLAB僅作用于新生代的Eden Space,對象被創建的時候首先放到這個區域,但是新生代分配不了內存的大對象會直接進入老年代。因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。

所以,雖然對象剛開始可能通過TLAB分配內存,存放在Eden區,但是還是會被垃圾回收或者被移到Survivor Space、Old Gen等。

不知道大家有沒有想過,我們使用了TLAB之后,在TLAB上給對象分配內存時線程獨享的了,這就沒有沖突了,但是,TLAB這塊內存自身從堆中劃分出來的過程也可能存在內存安全問題啊。

所以,在對于TLAB的分配過程,還是需要進行同步控制的。但是這種開銷相比于每次為單個對象劃分內存時候對進行同步控制的要低的多。

虛擬機是否使用TLAB是可以選擇的,可以通過設置-XX:+/-UseTLAB參數來指定。

3.總結

為了保證Java對象的內存分配的安全性,同時提升效率,每個線程在Java堆中可以預先分配一小塊內存,這部分內存稱之為TLAB(Thread Local Allocation Buffer),這塊內存的分配時線程獨占的,讀取、使用、回收是線程共享的。

可以通過設置-XX:+/-UseTLAB參數來指定是否開啟TLAB分配。

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2019-11-19 10:32:55

Java語言程序員

2020-06-02 07:44:04

AQS JavaNode

2024-05-20 13:13:01

線程安全Java

2020-05-29 11:48:01

安全運維信息安全網絡安全

2019-08-01 10:20:10

2022-03-16 18:27:39

開發低代碼軟件開發

2024-06-17 00:02:00

線程安全HashMapJDK 1.7

2015-11-16 11:22:05

Java對象內存分配

2023-01-26 02:07:51

HashSet線程安全

2023-03-26 00:43:42

JVM對象測試

2022-09-26 13:46:18

Java線程安全

2018-02-08 14:57:22

對象內存分配

2019-08-12 11:14:00

JVM垃圾對象

2021-02-23 08:58:13

Go語言變量

2016-10-10 23:00:18

2021-07-07 12:36:10

HTTPSSSL通信

2023-11-06 17:39:35

JavaArrayList線程

2023-10-17 00:01:34

Linux操作系統

2019-02-28 14:04:28

內存固定分配存儲

2018-04-08 08:45:53

對象內存策略
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情久久久 | 国产成人精品一区二区三区视频 | 日韩精品人成在线播放 | 久久久久久久久久久蜜桃 | 蜜桃在线播放 | 久草福利| 国产精品美女久久久免费 | www.亚洲一区二区三区 | 国产高清久久 | 韩国成人在线视频 | 国产日产欧产精品精品推荐蛮挑 | 99精品视频在线观看 | 精品视频一区二区在线观看 | 殴美成人在线视频 | 在线一区视频 | 99色在线 | 久久精品日产第一区二区三区 | 亚洲精品久久久久久久久久久久久 | 日韩a | 中文字幕av在线 | 青青久久久 | 精品不卡 | 亚洲一区精品在线 | 少妇午夜一级艳片欧美精品 | 国产精品国产a | 欧美黑人体内she精在线观看 | 国产中文字幕在线 | 亚洲精久久 | 五月香婷婷 | 成人精品一区二区 | 日韩手机视频 | 欧美a在线 | 99精品在线 | 久久成人免费视频 | 丝袜一区二区三区 | 成人久久网 | 国产精品99久久久久久久vr | 久久免费精品视频 | 精品免费国产 | 国产乱码精品一区二区三区五月婷 | 精品久久久久久 |