CPU,進程,線程,棧,堆,方法區(qū)的關(guān)系(JAVA)

1. 線程是什么?進程是什么?

線程是進程中的一個實體,線程本身是不會獨立存在的.
進程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度額基本單位,線程則是進程的一個執(zhí)行路徑。一個進程中至少有一個線程,進程中的多個線程共享進程資源.

操作系統(tǒng)在分配資源的時候是把資源分配給進程,但是CPU的資源比較特殊,它是被分配到線程的。因為真正要占用CPU運行的是線程,所以也說線程是CPU的基本單位.

2. 進程和線程的關(guān)系

在Java中,當我們啟動了main函數(shù)的時候其實就是啟動了一個JVM的進程,而main函數(shù)所在的線程就是這個進程中的一個線程,也稱主線程。


進程和線程的關(guān)系

一個進程中有多個線程,多個線程共享進程中的堆和方法區(qū)的資源。 但是每個線程都有自己的程序計數(shù)器和棧區(qū)域.

程序計數(shù)器是一塊內(nèi)存區(qū)域,用來記錄線程當前要執(zhí)行的指令地址,歸線程私有。
CPU一般是使用時間片輪轉(zhuǎn)的方式讓線程輪詢占用,所以當前線程CPU時間片用完之后就會讓出CPU.等到下次輪詢的時候再執(zhí)行.
而程序計數(shù)器就是記錄當該線程讓出CPU的時候的執(zhí)行地址,等到下次再分配到時間片的時候線程就可以從自己私有的計數(shù)器上的指定地址繼續(xù)執(zhí)行。

3. Java 的native方法

簡單地講,一個Native Method就是一個java調(diào)用非java代碼的接口。一個Native Method是這樣一個java的方法:該方法的實現(xiàn)由非java語言實現(xiàn),比如C。這個特征并非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調(diào)用一個C的函數(shù)。

介紹完了Native方法之后,接著上面的程序計數(shù)器 如果執(zhí)行的是Native方法,那么 pc 計數(shù)器記錄 的是 undefined 地址,只有執(zhí)行的是 Java 代碼時 pc 計數(shù)器記錄的才是
下一條指令的地址 。

另外每個線程都有自 己的棧資源,用于存儲該線程的局部變量,這些局部變量是該線
程私有的,其他線程是訪問不了的,除此之外枝還用來存放線程的調(diào)用棧幀 。
堆是一個進程中最大的一塊內(nèi)存,堆是被進程中的所有線程共享的,是進程創(chuàng)建時分
配的,堆里面主要存放使用 new 操作創(chuàng)建的對象實例 。
方法區(qū)則用來存放 JVM 加載的類、常量及靜態(tài)變量等信息,也是線程共享的 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容