JAVA的JVM的內存可分爲3個區:堆(heap)、棧(stack)和方法區(method)
堆區:
1.存儲的所有是對象,每一個對象都包含一個與之對應的class的信息。(class的目的是獲得操做指令)
2.jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己 jvm
棧區:
1.每一個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每一個棧中的數據(原始類型和對象引用)都是私有的,其餘棧不能訪問。
3.棧分爲3個部分:基本類型變量區、執行環境上下文、操做指令區(存放操做指令)。 spa
方法區:
1.又叫靜態區,跟堆同樣,被全部的線程共享。方法區包含全部的class和static變量。
2.方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。 線程
對於局部變量,若是是基本類型,會把值直接存儲在棧;若是是引用類型,好比String s = new String("william");會把其對象存儲在堆,而把這個對象的引用(指針)存儲在棧。
再如
String s1 = new String(「william」);
String s2 = s1;
s1和s2同爲這個字符串對象的實例,可是對象只有一個,存儲在堆,而這兩個引用存儲在棧中。
類的成員變量在不一樣對象中各不相同,都有本身的存儲空間(成員變量在堆中的對象中),基本類型和引用類型的成員變量都在這個對象的空間中,做爲一個總體存儲在堆。而類的方法倒是該類的全部對象共享的,只有一套,對象使用方法的時候方法才被壓入棧,方法不使用則不佔用內存。