java將內(nèi)存分為四塊:
- stacksegment:【棧區(qū)】由編譯器自動分配和釋放,存放函數(shù)參數(shù),局部變量等
- heapsegment:【堆區(qū)】一般由工程師分配和釋放,如果工程師不釋放自動GC回收,new出來的所有對象都在heap中
- datasegment:【靜態(tài)區(qū)】存放全部變量,靜態(tài)變量和字符串常量。不釋放
- codesegment:【代碼區(qū)】存放程序中方法的二進制代碼,而且是多個對象共享一個空間的區(qū)域
Java虛擬機內(nèi)存的堆區(qū)(heap),棧區(qū)(stack)和靜態(tài)區(qū)(static/method)
JAVA的JVM的內(nèi)存可分為3個區(qū):堆(heap)、棧(stack)和方法區(qū)(method)
堆區(qū):
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身.
3.一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
棧區(qū):
1.每個線程包含一個棧區(qū),棧中只保存基礎數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中
2.每個棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。
4.由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等.
靜態(tài)區(qū)/方法區(qū):
1.方法區(qū)又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。
2.方法區(qū)中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
3.—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
圖片.png