轉載請出自出處: http://eksliang.iteye.com/blog/2146549
一.java分配內存涉及的區域包括
- 寄存器
- 常量池
- 棧
- 堆
- 靜態存儲域
二.寄存器介紹
? ? ? 寄存器是最快的內存區域,因為他保存在處理器內部,這塊區域我們沒有直接的控制權,也不可能在代碼里面找到寄存器的任何存在蹤跡,所以這塊不做討論
?
三.常量池介紹
1.常量池是什么?
答:他是在.class文件中開避的一塊內存區域,用來存儲在編譯期間就可以確定一些數據
? ? ? ?例如:String str="think";think在編譯的期間就是可識別的常量,就能加進常量池
2.常量池中的數據是在什么時候加載進內存的?
答:在類被編譯成.class文件時,加載進來的
3.常量池中都放些什么東西?
答:包括如下信息
- String類型的變量;例如String str="think",不是new String("think");
- 對象的常量值
- 類的全限類名以及他的描述符;屬性的名稱跟描述符;方法的名稱跟描述符
4.String的不變性
1.什么是String的不變性?
答:所謂String的不可變性,是說一旦字符串被創建,對其所做的任何修改都會生成 新的 字符串對象(來源于《think in java》)
接下來看下他的源碼
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; /** * Class String is special cased within the Serialization Stream Protocol. * * A String instance is written initially into an ObjectOutputStream in the * following format: * <pre> * <code>TC_STRING</code> (utf String) * </pre> * The String is written by method <code>DataOutput.writeUTF</code>. * A new handle is generated to refer to all future references to the * string instance within the stream. */ private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
?通過源碼我們可以看到這個類他的所有屬性,以及類都是final關鍵字修飾,也就是說他在內存中只有一份拷貝,也就是說當創建一個新的字符串,他會去常量池中找如果這個串存在就直接引用,如果沒有就創建
例如:如下三句代碼的意思是
1)String s1="aabbcc"; 2) String s2="aabbcc"; 3) s1="aa";
?他的含義入下圖所示:
當程序執行到(1)時如圖在常量池中創建"aabbcc"
當程序執行到(2)時如圖所示,因為已經存在了,就直接引用,(實際上內部在創建一個字符串時,他會先去變量常量池,查找看當前創建的字符串是否存在,如果存在就直接引用,沒有就創建)
當程序執行到(3)時如圖所示,因為修改了字符串s1的值,所以他會在內存中創建一個新字符串,原來指向aabbcc的指針斷開,指向“aa”
?
四.棧
1.棧中存放的是那些數據?
答:存放基本類型的變量數據和對象的引用,但對象本身并不存放在棧中,而是存放在堆中或者常量池中(字符串、常量對象存放在常量池中)
? ? ? ?當在一段代碼塊定義一個變量時,JVM就在棧中為這個變量分配內存空間,當該變量退出該作用域后,JVM會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。
2.實際存儲在哪里?
答:數據駐留在RAM(隨機存儲器)區域;
何為隨機存儲器?答:是與CPU直接交換數據的內部存儲器,也叫主存或者內存,它可以隨時讀寫,而且速度很快,通常作為操作系統或正在運行中的程序的臨時數據存儲媒介
?
五.堆
1.存放的是那些數據?
答:存放所有new 出來的對象。或者通過反射創建的對象
2.實際數據存儲在哪里?
答:數據駐留在RAM(隨機存儲器)區域
?
六.靜態存儲域
1.存放的是那些數據?
答:存放的是靜態成員(static定義),這兒的靜態(static)是指"位置固定位置"。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的一個屬性或者方法是靜態的,但是JAVA對象永遠不會保持到靜態存儲區
?
?
?
?
??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
