日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?

發布時間:2025/3/16 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

△Hollis, 一個對Coding有著獨特追求的人△

這是Hollis的第?222?篇原創分享

作者 l Hollis

來源 l Hollis(ID:hollischuang)


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分配。

參考資料:

《深入理解Java虛擬機》

https://www.cnblogs.com/straybirds/p/8529924.html https://www.zhihu.com/question/56538259



Java工程師成神之路系列文章

在 GitHub 更新中,歡迎關注,歡迎star。

?

直面Java第262期:volatile是如何解決有序性問題的?

深入并發第009期:到底什么是Java內存模型?

- MORE | 更多精彩文章 -

  • 面試官:你知道Redis得持久化機制嗎?

  • 咱們從頭到尾說一次 Java 垃圾回收

  • 面試官,求求你不要問我這么簡單但又刁難的算法題了

  • 厲害了,為了干掉 HTTP ,Spring團隊又開源 nohttp 項目!


如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發至朋友圈,是對我最大的支持。

好文章,我在看??

總結

以上是生活随笔為你收集整理的原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 五月天久久久 | 69色视频 | 国产成人短视频在线观看 | 久久成人国产精品 | 九九日韩| 污污软件在线观看 | 亚洲av少妇一区二区在线观看 | 在线免费视频 | 91传媒在线免费观看 | 调教小屁屁白丝丨vk | 午夜小视频免费 | 成人精品一区二区三区在线 | 一区二区的视频 | 99久久伊人 | 香蕉视频免费 | 亚洲xxxxx| 精品一区二区三区免费看 | 日韩精品av一区二区三区 | 精品无码av一区二区三区 | 亚洲天堂资源在线 | 亚洲国产精品尤物yw在线观看 | 天天综合天天 | 欧美精品系列 | 国产三级精品视频 | 波多野结衣视频网址 | 黄色同人网站 | 国产一区资源 | 最近中文字幕一区二区 | 欧美人妻精品一区二区 | 女人性高潮视频 | 波多野结衣精品在线 | 天天看片天天射 | 久久官网 | 国产精品一区二区久久毛片 | 欧美综合亚洲图片综合区 | 国产精品成人无码免费 | 欧洲av片 | 欧美精品久久久久久久多人混战 | 天天操穴 | 国产精品久久综合青草亚洲AV | 99干99 | 香蕉国产 | 中文字幕2区 | 超碰v| 超碰123| 永久免费在线看片 | 成人综合区一区 | 亚洲91av| 91淫黄大片| 黄色特一级 | 国产偷国产偷av亚洲清高 | 国产剧情演绎av | 国产精品无码自拍 | 99热热99 | 人人妻人人澡人人爽人人dvd | 国产精品成熟老女人 | 精品国自产在线观看 | 国产伊人一区 | 男人的天堂视频网站 | 国产精品主播在线 | 黄色网址网站 | 色天天av | 欧美裸体网站 | 成人精品国产免费网站 | 成人欧美一区二区三区黑人 | 成人免费看片 | 91蜜桃在线观看 | 先锋影音av资源在线观看 | 久久久久99精品成人片我成大片 | 伊人久久青草 | 中国免费看的片 | 亚洲免费av一区 | 欧美xxxx黑人又粗又长密月 | 裸体的日本在线观看 | 先锋影音av资源在线观看 | 亚洲精品 日韩无码 | 5566毛片 | 精品人妻一区二区三区日产乱码 | 国产白丝袜美女久久久久 | 久久99精品国产.久久久久久 | 亚洲精品国产成人无码 | 日本免费在线视频 | 欧美激情黑人 | 美女上床网站 | 日韩一区二区高清视频 | 国产免费自拍视频 | 国产在线视频99 | av一区二区在线播放 | 九九九九九九精品 | 超碰av免费| 国产精品久久久久三级 | 四虎影视免费永久观看在线 | 嫩草影院永久入口 | 女女互慰吃奶互揉调教捆绑 | 午夜福利理论片在线观看 | 91成人精品一区在线播放 | 精人妻一区二区三区 | 欧美成年人在线视频 | 日韩中文字幕观看 |