對Java的內存分配的簡單瞭解(1)

在JVM內部,Java內存模型把內存分成了兩部分:線程棧區和堆區,一般來講,可以更加細緻的分爲五個部分:
Method Area,Heap,VM Stack,Native Method Stack,Progrom Counter Register。
這其中Method Area和Heap屬於允許多個線程共享的部分,而VM Stack,Native Method Stack,Progrom Counter Register則不允許線程共享。
先看不允許線程共享的部分。
在Java內存模型中,線程棧區儲存的是當前執行的方法所調用的信息,包括該方法本地變量的內容。每個線程都有獨立的線程棧,同時每個線程也只能讀取自己的線程棧。每個線程私有的棧,生命週期和該線程是一致的。
JMM定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(main memory)中,每個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。
當線程相互之間進行通訊時,實質上是在主內存上交換變量的副本。例如,當線程1向線程2發送一個消息時,線程1先在本地內存上生成一個要發送的變量的副本,然後主內存會從線程1的本地內存中接受這個副本,並把這個副本傳給線程2的本地內存,線程2從自己的本地內存中接收這個副本,就完成了一次線程中的通信。當然,這只是一個基礎的例子,關於線程之間的通信和變量的共享,以後會有更詳細的說明。
線程的棧區中,可以儲存原始數據類型,例如int,double,boolean型等,也可以存儲對象的引用,但是對象實例的具體屬性等信息則保存在Heap中。
我在這裏簡單的把VM Stack和Native Method Stack都理解爲線程棧區。而剩下的程序計數器是一塊較小的內存區域,作用可以看做是當前線程執行的字節碼的位置指示器。分支、循環、跳轉、異常處理和線程恢復等基礎功能都需要依賴這個計算器來完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章