經常使用的三個內存空間 html
棧內存 ,堆內存 ,方法區程序員
棧內存存儲的內容: 局部變量、 函數(棧中的局部變量,須要手動賦值。當變量,或者函數執行完畢,就自動被釋放) web
堆內存,存儲的內容 :全局變量、數據容器、創建的對象(堆內存中存儲的容器,不會自動釋放,由垃圾回收機制GC不定時自動清理) 數組
方法區存儲的內容 :class類文件、靜態、常量 jvm
非RAM存儲:硬盤等永久存儲空間
Java內存分配中的棧
在函數中定義的一些基本類型的變量數據和對象的引用變量都在函數的棧內存中分配。 當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當該變量退出該做用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間能夠當即被另做他用。
Java內存分配中的堆
堆內存用來存放由new建立的對象和數組。 在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
在堆中產生了一個數組或對象後,還能夠在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。 引用變量就至關因而 爲數組或對象起的一個名稱,之後就能夠在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量就至關因而爲數組或者對象起的一個名稱。
引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其做用域以外後被釋放。而數組和對象自己在堆中分配,即便程序運行到使用 new 產生數組或者對象的語句所在的代碼塊以外,數組和對象自己佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍然佔據內存空間不放,在隨後的一個不肯定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較佔內存的緣由。
實際上,棧中的變量指向堆內存中的變量,這就是Java中的指針!函數
常量池指的是在編譯期被肯定,並被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各類基本類型(如int、long等等)和對象型(如String及數組)的常量值(final)還包含一些以文本形式出現的符號引用,好比:
類和接口的全限定名;
字段的名稱和描述符;
方法和名稱和描述符。測試
轉載自:http://blog.sina.com.cn/s/blog_5da93c8f0101jkkc.htmlui
先解釋一下內存中的三個區:
JAVA的JVM的內存可分爲3個區:堆(heap)、棧(stack)和方法區(method)
堆區:
1.存儲的所有是對象,每一個對象都包含一個與之對應的class的信息。(class的目的是獲得操做指令)
2.jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己
棧區:
1.每一個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每一個棧中的數據(原始類型和對象引用)都是私有的,其餘棧不能訪問。
3.棧分爲3個部分:基本類型變量區、執行環境上下文、操做指令區(存放操做指令)。
方法區:
1.又叫靜態區,跟堆同樣,被全部的線程共享。方法區包含全部的class和static變量。
2.方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。
方法區存放裝載的類數據信息包括:
(1):基本信息:
1)每一個類的全限定名
2)每一個類的直接超類的全限定名(可約束類型轉換)
3)該類是類仍是接口
4)該類型的訪問修飾符
5)直接超接口的全限定名的有序列表
(2):每一個已裝載類的詳細信息:
1)運行時常量池:
存放該類型所用的一切常量(直接常量和對其它類型、字段、方法的符
號引用),它們以數組形式經過索引被訪問,是外部調用與類聯繫及類型對
象化的橋樑。它是類文件(字節碼)常量池的運行時表示。(還有一種靜態常量池,在字節碼文件中)。
2)字段信息:
類中聲明的每個字段的信息(名,類型,修飾符)。
3)方法信息:
類中聲明的每個方法的信息(名,返回類型,參數類型,修飾符,方
法的字節碼和異常表)。
4)靜態變量
5)到類 classloader 的引用:即到該類的類裝載器的引用。
6)到類 class 的引用: 虛擬機爲每個被裝載的類型建立一個 class 實例, 用來表明這個被裝載的類spa