国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容

這篇具有很好參考價(jià)值的文章主要介紹了并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

這篇文章,我們來(lái)講一下java的內(nèi)存圖及并發(fā)編程的預(yù)備內(nèi)容。

首先,我們來(lái)看一下下面的這兩段代碼:

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

下面,我們給出上面這兩段代碼在運(yùn)行時(shí)的內(nèi)存結(jié)構(gòu)圖,如下圖所示:

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

下面,我們來(lái)具體的講解一下。

首先,我們寫了一個(gè)java程序是以.java的文件形式保存在磁盤中的,當(dāng)我們運(yùn)行它的時(shí)候,首先,jdk會(huì)將其編譯為.class文件,用的是javac命令,也是在磁盤中,然后,jre會(huì)去運(yùn)行.class文件,用的是java命令,然后,我們的程序就被運(yùn)行了,這是整個(gè)過(guò)程。

當(dāng)我們需要去運(yùn)行一個(gè)java程序時(shí),或者說(shuō),當(dāng)jdk用javac命令去編譯一個(gè).java文件的時(shí)候,操作系統(tǒng)就會(huì)在內(nèi)存中開(kāi)辟一片區(qū)域,叫java運(yùn)行時(shí)內(nèi)存,里面存儲(chǔ)我們一個(gè)java程序在運(yùn)行時(shí)的所有信息。

java運(yùn)行時(shí)內(nèi)存中會(huì)有方法區(qū),里面存放的是我們類的信息,包括類的成員變量和成員方法。方法區(qū)中還有一塊叫做靜態(tài)方法區(qū),里面存放的是我們類中的靜態(tài)方法。方法區(qū)中的內(nèi)容在類被編譯的時(shí)候就會(huì)生成,生成之后會(huì)將類中的靜態(tài)方法拷貝一份到靜態(tài)方法區(qū)。注意,java中的所有靜態(tài)資源在類被編譯的時(shí)候都會(huì)被初始化。根據(jù)代碼我們可以知道,person類中只有m4是靜態(tài)方法,它會(huì)被拷貝到靜態(tài)方法區(qū)中,Test1中所有的方法都是靜態(tài)方法,都會(huì)被拷貝到靜態(tài)方法區(qū)中。

之后會(huì)有一塊棧區(qū),它是控制方法的執(zhí)行順序及變量的定義域。程序是從main方法開(kāi)始執(zhí)行的,所以首先main方法入棧,然后main方法中創(chuàng)建了3個(gè)person類的實(shí)例,即x1,x2,x3,所以java會(huì)在堆內(nèi)存中創(chuàng)建三個(gè)實(shí)例對(duì)象,這三個(gè)實(shí)例對(duì)象會(huì)存儲(chǔ)類的一切信息,除了靜態(tài)方法。然后main方法調(diào)用m1方法,m1方法入棧,m1方法調(diào)用m2方法,m2方法入棧,m2方法調(diào)用m3方法,m3方法入棧,m3方法中創(chuàng)建person類的實(shí)例x1,所以java在堆內(nèi)存中創(chuàng)建出實(shí)例對(duì)象,然后m3方法執(zhí)行實(shí)例x1的m2方法,所以m3方法中的實(shí)例x1的m2方法入棧,而該實(shí)例的m2方法又調(diào)用該類的m1方法,所以該實(shí)例的m1方法入棧,等m1執(zhí)行結(jié)束后,x1的m1方法出棧,然后x1的m2出棧,然后Test1的m3出棧,然后Test1的m2出棧,然后Test1的m1出棧,然后回到main方法中再依次往下執(zhí)行。這就是一個(gè)java程序執(zhí)行的整個(gè)流程。

以上的內(nèi)存模型只是一種簡(jiǎn)略內(nèi)存模型,更詳細(xì)的內(nèi)存模型大家可以去參考我的JVM系列內(nèi)容。

上面只是單個(gè)線程的,下面來(lái)看一下多線程的。

看一下下面的這段代碼:

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

看一下輸出結(jié)果:

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

我們結(jié)合上面單線程的內(nèi)存分布,來(lái)分析一下這段代碼的內(nèi)存分布:

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

代碼的編譯和方法區(qū)就不說(shuō)了,直接從主方法開(kāi)始說(shuō)。

代碼是從主方法開(kāi)始運(yùn)行的,運(yùn)行主方法的時(shí)候,java會(huì)在棧區(qū)中開(kāi)辟出主線程棧,然后主方法入棧,執(zhí)行,執(zhí)行到第5行的時(shí)候,代碼new了一個(gè)新的線程x1,所以在堆中創(chuàng)建出線程x1的實(shí)例,這個(gè)實(shí)例非常復(fù)雜,但是我們可以將他簡(jiǎn)化為里面有start和run兩個(gè)方法。創(chuàng)建完成之后,同時(shí),在棧區(qū)中創(chuàng)建新的線程x1,在線程x1中,方法run拷貝入棧,準(zhǔn)備執(zhí)行,同時(shí),主線程棧中的代碼也會(huì)執(zhí)行,所以就有我們看到的運(yùn)行結(jié)果:線程x1和主線程交替著打印輸出。

這樣解釋可能不好理解,下面換個(gè)角度解釋一下。

并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容,并發(fā)編程,java,開(kāi)發(fā)語(yǔ)言

這是我電腦的部分CPU的部分性能信息,我們來(lái)看下面的幾行信息。

進(jìn)程,進(jìn)程的科學(xué)定義是:進(jìn)程是程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。通俗的說(shuō):進(jìn)程就是程序的一次執(zhí)行過(guò)程。進(jìn)程數(shù)213,就是說(shuō),當(dāng)前時(shí)刻,我的電腦上有213個(gè)程序處于“運(yùn)行”狀態(tài)(或者說(shuō)開(kāi)著)。

線程,線程是CPU調(diào)度的最小單位,簡(jiǎn)單來(lái)說(shuō),CPU每次只能運(yùn)行線程,不能運(yùn)行進(jìn)程。線程數(shù)3190,就是說(shuō)當(dāng)前時(shí)刻,我的電腦上一共有3190個(gè)線程,并且這3190個(gè)線程是分布在213個(gè)進(jìn)程中的(進(jìn)程是由線程組成的)

句柄,就是變量,句柄107879,就是說(shuō)當(dāng)前時(shí)刻,我的電腦內(nèi)存中一個(gè)包含107879個(gè)變量。

內(nèi)核,就是CPU的核數(shù),一個(gè)CPU有多少核數(shù),那么這個(gè)CPU在同一時(shí)刻就能執(zhí)行多少個(gè)線程。我的CPU是8核的,說(shuō)明我的電腦在同一時(shí)刻能跑8個(gè)線程。

CPU的核數(shù)是一定的,線程數(shù)是變化的,并且線程數(shù)是遠(yuǎn)遠(yuǎn)大于核數(shù)的,CPU每次只能執(zhí)行8個(gè)線程,那么剩下的線程就只能暫時(shí)處于其他狀態(tài)(這個(gè)操作系統(tǒng)中有介紹),但是一臺(tái)電腦不可能只靠這8個(gè)線程來(lái)運(yùn)行,所以CPU是在不停的做線程切換的,也就是說(shuō)CPU每個(gè)線程執(zhí)行一段時(shí)間然后就切換去執(zhí)行另一個(gè)線程,這就是多線程。

明白了這點(diǎn),我們?cè)倏瓷厦娴拇a,那是兩個(gè)線程,主線程和x1線程,他們兩個(gè)競(jìng)爭(zhēng)者進(jìn)入CPU,然后被CPU執(zhí)行,當(dāng)某個(gè)線程被CPU選中時(shí),那個(gè)這個(gè)線程中的內(nèi)容就會(huì)被執(zhí)行,但是它不是直接執(zhí)行完的,而是會(huì)有線程的切換,當(dāng)它被切換出去了,它就不會(huì)被執(zhí)行了,也就不會(huì)被打印輸出了。這就是上面交替輸出的原因。

前面說(shuō)了線程的切換,線程的狀態(tài)等內(nèi)容,這些是操作系統(tǒng)中的,這里只是簡(jiǎn)單的提到,如果想要具體的了解,可以參考我的操作系統(tǒng)專欄中的內(nèi)容。

這篇文章比較散,就是講了一下一個(gè)java程序在運(yùn)行時(shí)的內(nèi)存結(jié)構(gòu)圖,然后稍微的提到了多線程。這些都是比較基礎(chǔ)的,都是要好好掌握。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-725882.html

到了這里,關(guān)于并發(fā)編程——1.java內(nèi)存圖及相關(guān)內(nèi)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ????Java開(kāi)發(fā)者的Python快速進(jìn)修指南:網(wǎng)絡(luò)編程及并發(fā)編程

    ????Java開(kāi)發(fā)者的Python快速進(jìn)修指南:網(wǎng)絡(luò)編程及并發(fā)編程

    今天我們將對(duì)網(wǎng)絡(luò)編程和多線程技術(shù)進(jìn)行講解,這兩者的原理大家都已經(jīng)了解了,因此我們主要關(guān)注的是它們的寫法區(qū)別。雖然這些區(qū)別并不是非常明顯,但我們之所以將網(wǎng)絡(luò)編程和多線程一起講解,是因?yàn)樵趯W(xué)習(xí)Java的socket知識(shí)時(shí),我們通常會(huì)將它們結(jié)合使用,以實(shí)現(xiàn)服務(wù)器

    2024年02月05日
    瀏覽(25)
  • 深入理解并發(fā)編程藝術(shù)之內(nèi)存模型

    深入理解并發(fā)編程藝術(shù)之內(nèi)存模型

    隨著硬件技術(shù)的飛速發(fā)展,多核處理器已經(jīng)成為計(jì)算設(shè)備的標(biāo)配,這使得開(kāi)發(fā)人員需要掌握并發(fā)編程的知識(shí)和技巧,以充分發(fā)揮多核處理器的潛力。然而并發(fā)編程并非易事,它涉及到許多復(fù)雜的概念和原理。為了更好地理解并發(fā)編程的內(nèi)在機(jī)制,需要深入研究?jī)?nèi)存模型及其在

    2024年02月14日
    瀏覽(25)
  • 并發(fā)編程之三大特性及JMM內(nèi)存模型

    并發(fā)編程之三大特性及JMM內(nèi)存模型

    目錄 原子性 如何保證原子性 可見(jiàn)性 如何保證可見(jiàn)性 有序性 如何保證有序性 Java內(nèi)存模型(JMM內(nèi)存模型) Java內(nèi)存模型的一些關(guān)鍵概念: 主內(nèi)存與工作內(nèi)存交互協(xié)議 Java內(nèi)存模型通過(guò)以下手段來(lái)確保多線程程序的正確性: 鎖機(jī)制 volatile volatile禁止指令重排序 ?Happens-Before 并發(fā)三

    2024年01月19日
    瀏覽(25)
  • 【JavaEE】并發(fā)編程(多線程)線程安全問(wèn)題&內(nèi)存可見(jiàn)性&指令重排序

    【JavaEE】并發(fā)編程(多線程)線程安全問(wèn)題&內(nèi)存可見(jiàn)性&指令重排序

    目錄 第一個(gè)問(wèn)題:什么是線程安全問(wèn)題? 第二個(gè)問(wèn)題:為什么會(huì)出現(xiàn)線程安全問(wèn)題?? 第三個(gè)問(wèn)題:如何解決多線程安全問(wèn)題?? 第四個(gè)問(wèn)題:產(chǎn)生線程不安全的原因有哪些?? 第五個(gè)問(wèn)題:內(nèi)存可見(jiàn)性問(wèn)題及解決方案? 第六個(gè)問(wèn)題:指令重排序問(wèn)題? 線程安全就是多線程

    2024年02月01日
    瀏覽(25)
  • 【JAVA開(kāi)發(fā)面試】如何處理并發(fā)訪問(wèn)如何進(jìn)行代碼的單元測(cè)試Java多線程編程消息中間件設(shè)計(jì)模式技術(shù)難題是如何解決的

    【 點(diǎn)我-這里送書 】 本人詳解 作者:王文峰,參加過(guò) CSDN 2020年度博客之星,《Java王大師王天師》 公眾號(hào):JAVA開(kāi)發(fā)王大師,專注于天道酬勤的 Java 開(kāi)發(fā)問(wèn)題 中國(guó)國(guó)學(xué)、傳統(tǒng)文化和代碼愛(ài)好者的程序人生,期待你的關(guān)注和支持!本人外號(hào):神秘小峯 山峯 轉(zhuǎn)載說(shuō)明:務(wù)必注明

    2024年02月03日
    瀏覽(131)
  • 數(shù)據(jù)結(jié)構(gòu):圖及相關(guān)算法講解

    數(shù)據(jù)結(jié)構(gòu):圖及相關(guān)算法講解

    概念多,但是不難理解,難的算法部分基本都是圖解。 圖是由頂點(diǎn)集合及頂點(diǎn)間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中 V為頂點(diǎn)集合,E為邊集合 。 頂點(diǎn)和邊 :圖中結(jié)點(diǎn)稱為頂點(diǎn),第i個(gè)頂點(diǎn)記作vi。兩個(gè)頂點(diǎn)vi和vj相關(guān)聯(lián)稱作頂點(diǎn)vi和頂點(diǎn)vj之間有一條邊,圖中的第k條邊

    2024年03月12日
    瀏覽(28)
  • GO語(yǔ)言網(wǎng)絡(luò)編程(并發(fā)編程)并發(fā)介紹,Goroutine

    GO語(yǔ)言網(wǎng)絡(luò)編程(并發(fā)編程)并發(fā)介紹,Goroutine

    進(jìn)程和線程 并發(fā)和并行 協(xié)程和線程 協(xié)程:獨(dú)立的??臻g,共享堆空間,調(diào)度由用戶自己控制,本質(zhì)上有點(diǎn)類似于用戶級(jí)線程,這些用戶級(jí)線程的調(diào)度也是自己實(shí)現(xiàn)的。 線程:一個(gè)線程上可以跑多個(gè)協(xié)程,協(xié)程是輕量級(jí)的線程。 goroutine 只是由官方實(shí)現(xiàn)的超級(jí)\\\"線程池\\\"。 每個(gè)

    2024年02月09日
    瀏覽(91)
  • 各個(gè)語(yǔ)言運(yùn)行100萬(wàn)個(gè)并發(fā)任務(wù)需要多少內(nèi)存?

    原文鏈接:https://pkolaczk.github.io/memory-consumption-of-async/ Github項(xiàng)目地址:https://github.com/pkolaczk/async-runtimes-benchmarks 在這篇博客文章中,我深入探討了異步和多線程編程在內(nèi)存消耗方面的比較,跨足了如Rust、Go、Java、C#、Python、Node.js 和 Elixir等流行語(yǔ)言。 不久前,我不得不對(duì)幾個(gè)

    2024年02月07日
    瀏覽(24)
  • java內(nèi)存區(qū) || 并發(fā)

    java內(nèi)存區(qū) || 并發(fā)

    目錄 什么是線程? 線程的創(chuàng)建和上下文切換: 線程的入棧和出棧: 堆棧的作用: CPU核心數(shù)概念 線程的start狀態(tài) 就緒隊(duì)列 操作系統(tǒng)的時(shí)間片 線程中代碼執(zhí)行順序 實(shí)際中內(nèi)存圖 線程的創(chuàng)建和上下文切換: 創(chuàng)建線程:線程的創(chuàng)建是通過(guò)調(diào)用操作系統(tǒng)提供的線程創(chuàng)建函數(shù)或類

    2024年02月13日
    瀏覽(9)
  • 要利用Java編程提升人們對(duì)安全教育的興趣,可以開(kāi)發(fā)一些互動(dòng)性強(qiáng)、內(nèi)容生動(dòng)有趣的教育軟件或游戲

    要利用Java編程提升人們對(duì)安全教育的興趣,可以開(kāi)發(fā)一些互動(dòng)性強(qiáng)、內(nèi)容生動(dòng)有趣的教育軟件或游戲

    要利用Java編程提升人們對(duì)安全教育的興趣,可以開(kāi)發(fā)一些互動(dòng)性強(qiáng)、內(nèi)容生動(dòng)有趣的教育軟件或游戲。以下是一些建議: 開(kāi)發(fā)安全教育游戲:使用Java編程語(yǔ)言,可以開(kāi)發(fā)一些有關(guān)于安全教育的小游戲,如模擬火災(zāi)逃生、地震自救等場(chǎng)景,讓玩家在游戲中學(xué)習(xí)到安全知識(shí)。

    2024年04月27日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包