在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java運行時內存區域與硬件內存的關系1

jf_78858299 ? 來源:小牛呼嚕嚕 ? 作者:小牛呼嚕嚕 ? 2023-02-09 14:41 ? 次閱讀

什么是 JMM?

在上一篇文章中,我們了解了計算機由于各個硬件的讀取速度之間的巨大差距,和充分利用CPU的性能的手段方法,及其所帶來的一系列問題:

  1. 為了充分壓榨CPU的性能, CPU 會對指令亂序執行或者語言的編譯器會指令重排 ,讓CPU一直工作不停歇,但同時會導致有序性問題。
  2. 為了平衡CPU的寄存器和內存的速度差異,計算機的CPU 增加了高速緩存,但同時導致了 可見性問題
  3. 為了平衡CPU 與 I/O 設備的速度差異,操作系統增加了進程、線程概念,以分時復用 CPU,但同時導致了原子性問題。

Java 是最早嘗試提供內存模型的編程語言。由于Java 語言是跨平臺的,另外各個操作系統總存在一些差異,Java在物理機器的基礎上抽象出一個內存模型(JMM)

JMM 可以看作是 Java 定義的并發編程相關的一組規范,除了抽象了線程和主內存之間的關系之外,其還規定了從 Java 源代碼到 CPU 可執行指令的這個轉化過程要遵守哪些和并發相關的原則和規范,這樣就可以屏蔽各個操作系統的差異,簡化多線程編程。

Java 運行時內存區域與硬件內存的關系

Java 內存區域和Java內存模型有何區別?

這是一個非常容易讓人混淆的問題,Java 內存區域和內存模型完全是不一樣的東西,

  1. Java 內存區域, 也叫內存區域、JVM內存模型,和 Java 虛擬機(JVM)的運行時區域相關,是指 JVM運行時將數據分區域存儲,強調對內存空間的劃分。
  2. Java內存模型,也叫內存模型(JMM),是Java 定義的并發編程相關的一組規范,除了抽象了線程和主內存之間的關系之外,其還規定了從 Java 源代碼到 CPU 可執行指令的這個轉化過程要遵守哪些和并發相關的原則和規范,屏蔽各個操作系統的差異。通俗點說: JMM規范了程序中變量的訪問規則,保證了操作的原子性、可見性、有序性, 我們下文慢慢道來。

我們知道JVM 運行時內存區域是分區域的,分為棧、堆等,其實這些都是 JVM 定義的邏輯概念。但在傳統的硬件內存架構中是沒有棧和堆這種概念。

其中:

  1. 圖中??梢约毞譃椋?code>虛擬機棧(JVM Stacks)和 本地方法棧(Native Method Stack)
  • 虛擬機棧(JVM Stacks): 線程私有,它的生命周期和線程相同 ,描述的是Java方法執行的內存模型,每個方法在執行的同時都會創建一個線幀(Stack Frame)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息,每個方法從調用直至執行完成的過程,都對應著一個線幀在虛擬機棧中入棧到出棧的過程
  • 本地方法棧(Native Method Stack): 線程私有 ,本地方法棧與虛擬機棧的作用是一樣的,只不過虛擬機棧是服務Java方法的,而本地方法棧是為虛擬機調用Native方法服務的。在Java虛擬機規范中對于本地方法棧沒有特殊的要求,虛擬機可以自由的實現它,因此 在Sun HotSpot虛擬機直接把本地方法棧和虛擬機棧合二為一了 。線程開始調用本地方法時,會進入 不再受 JVM 約束的世界。本地方法可以通過 JNI(Java Native Interface)來訪問虛擬機運行時的數據區,甚至可以調用寄存器,具有和 JVM 相同的能力和權限。JNI 類本地方法最著名的應該是 System.currentTimeMillis()
  1. 堆(Heap)

虛擬機堆是Java虛擬機中內存最大的一塊,是被所有線程共享的,在虛擬機啟動時候創建,Java堆唯一的目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存,隨著JIT編譯器的發展和逃逸分析技術的逐漸成熟,棧上分配、標量替換優化的技術將會導致一些微妙的變化,所有的對象都分配在堆上漸漸變得不那么“絕對”了。

Java中棧和堆既存在于計算機的高速緩存中,又存在于主存中,所以兩者并沒有很直接的關系。

Java 線程與主內存的關系

Java 內存模型(JMM) 抽象了線程和主內存之間的關系,就比如說線程之間的共享變量必須存儲在主內存中。在 JDK1.2 之前,Java 的內存模型實現總是從 主存 (即共享內存)讀取變量,是不需要進行特別的注意的。而在當前的 Java 內存模型下,線程可以把變量保存 本地內存 (比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續使用它在寄存器中的變量值的拷貝,造成數據的不一致。

什么是主內存?什么是本地內存?

  • 主內存 :所有線程創建的實例對象都存放在主內存中,不管該實例對象是成員變量還是方法中的本地變量(也稱局部變量)
  • 本地內存 :每個線程都有一個私有的本地內存來存儲共享變量的副本,并且,每個線程只能訪問自己的本地內存,無法訪問其他線程的本地內存。本地內存是 JMM 抽象出來的一個概念,存儲了主內存中的共享變量副本。

Java 內存模型其實是一種規范,定義了很多東西:

  • 所有的變量都存儲在主內存(Main Memory)中。
  • 每個線程都有一個私有的本地內存 (Local Memory),本地內存中存儲了該線程以讀/寫共享變量的拷貝副本。
  • 線程對變量的所有操作都必須在本地內存中進行,而不能直接讀寫主內存。
  • 不同的線程之間無法直接訪問對方本地內存中的變量。

這里所講的主內存、工作內存與 Java 內存區域中的 Java 堆、棧、方法區等并不是同一個層次的內存劃分,這兩者基本上是沒有關系的,如果兩者一定要勉強對應起來,那從變量、主內存、工作內存的定義來看,主內存主要對應于Java堆中的對象實例數據部分,而工作內存則對應于虛擬機棧中的部分區域。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2986

    瀏覽量

    107160
  • 編譯器
    +關注

    關注

    1

    文章

    1657

    瀏覽量

    49943
  • JVM
    JVM
    +關注

    關注

    0

    文章

    160

    瀏覽量

    12537
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Labview 運行時內存增加

    的dll,用庫函數直接調用這個dll后,Labview運行時所占的內存基本上保持在0.9 M左右,不會卡死了。附件里是那個網友上傳的dll,大家可以下載后將.jpg改為.dll
    發表于 05-19 14:38

    C6748內存分配運行時出錯

    因為需要對大量數據進行處理,我設置一個指針,內存分配1000*sizeof(float),運行時出錯,查看其地址為0x00000000(肯定不對),如果減小分配空間,如200*sizeof
    發表于 03-16 10:05

    C語言內存運行時不同變量是怎樣分配的

    C語言內存運行時不同變量是怎樣分配的?怎樣驗證C語言編譯后的內存地址分配是否合理?
    發表于 02-25 06:37

    請問單片機運行時內存是如何分配的?

    請問單片機運行時內存是如何分配的? 是在鏈接腳本中人工定義?還是編譯器根據某種算法自動分配?
    發表于 09-27 08:16

    java線程內存模型

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的
    發表于 09-27 10:55 ?0次下載
    <b class='flag-5'>java</b>線程<b class='flag-5'>內存</b>模型

    Java內存模型及原理分析

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的
    發表于 09-28 11:49 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>內存</b>模型及原理分析

    利用StopWatch監控Java代碼運行時間和分析性能

    利用StopWatch監控Java代碼運行時間和分析性能。
    的頭像 發表于 07-21 16:51 ?3150次閱讀

    Java運行時內存區域硬件內存關系2

    在上一篇文章中,我們了解了計算機由于各個硬件的讀取速度之間的巨大差距,和充分利用CPU的性能的手段方法,及其所帶來的一系列問題: 1. 為了充分壓榨CPU的性能, **CPU 會對指令亂序執行或者語言的編譯器會指令重排** ,讓CPU一直工作不停歇,但同時會導致`有
    的頭像 發表于 02-09 14:41 ?438次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>運行時</b><b class='flag-5'>內存</b><b class='flag-5'>區域</b>與<b class='flag-5'>硬件</b><b class='flag-5'>內存</b>的<b class='flag-5'>關系</b>2

    JVM運行時數據區之堆內存

    說一下 JVM 運行時數據區吧,都有哪些區?分別是干什么的?
    的頭像 發表于 08-19 14:35 ?923次閱讀
    JVM<b class='flag-5'>運行時</b>數據區之堆<b class='flag-5'>內存</b>

    如何查看java程序的內存分布

    要查看Java程序的內存分布,首先需要了解Java程序運行時內存模型。 Java程序的
    的頭像 發表于 11-23 14:47 ?1303次閱讀

    jvm內存模型和內存結構

    內存模型是指Java程序在運行時,JVM對內存空間的組織和管理方式。它包括了線程私有的部分和線程共享的部分。 線程私有部分 線程私有部分主要包含了棧(Stack)和程序計數器(Prog
    的頭像 發表于 12-05 11:08 ?1191次閱讀

    jvm運行時內存區域劃分

    內存區域劃分對于了解Java程序的內存使用非常重要,本文將詳細介紹JVM運行時內存
    的頭像 發表于 12-05 14:08 ?705次閱讀

    jvm管理的內存包括哪幾個運行時數據內存

    JVM(Java虛擬機)是Java程序的運行環境,它提供了內存管理機制來管理Java程序所需的運行時
    的頭像 發表于 12-05 14:09 ?792次閱讀

    jvm內存區域中,哪一塊是屬于線程共享

    是如何劃分的。JVM內存區域主要分為以下幾個部分:程序計數器、Java虛擬機棧、本地方法棧、堆、方法區和運行時常量池。其中,程序計數器、Java
    的頭像 發表于 12-05 14:14 ?1669次閱讀

    java虛擬機內存包括遠空間內存

    Java虛擬機(JVM)內存Java程序執行時所使用的內存空間的總稱,包括了Java堆、方法區
    的頭像 發表于 12-05 14:15 ?572次閱讀
    主站蜘蛛池模板: 美女视频一区 | 手机看片神马午夜片 | 亚洲男人的天堂在线播放 | 无遮挡一级毛片视频 | 免费在线黄网站 | 欧美午夜性刺激在线观看免费 | 男人呻吟双腿大开男男h互攻 | 日本大片成人免费播放 | 人与禽性视频77777 | 女人爽到喷水的视频大全在线观看 | 久久青草18免费观看网站 | 狠狠色丁香婷婷综合久久来 | 97色婷婷成人综合在线观看 | 美女牲交视频一级毛片 | 亚洲综合情 | 色依依视频视频在线观看 | 美脚连裤袜老师正在播放 | 国产精品五月天 | 中文字幕精品一区 | 澳门三级bd高清 | 蜜月mv国产精品 | 黄色天天影视 | 日本加勒比在线视频 | 欧美97色| 国产精品天天影视久久综合网 | 亚洲成人激情电影 | 伊人久久影视 | 一级片一级片一级片 | 网络色综合久久 | 天天黄色| 一级毛片成人免费看a | 天天干天天玩天天操 | 国产91丝袜在线播放九色 | 天天躁狠狠躁夜躁2021 | 一区二区高清在线观看 | lsj老司机精品视频在线观看 | 国产又色又爽又黄的网站在线一级 | 狠狠操夜夜爽 | 国产精品久久久久久久久免费 | 13日本xxxxxxxxx18 1515hh四虎免费观38com | 久久精品国产99国产精品免费看 |