明確初始化過程以及變量生命週期對於內存優化以及高併發有重要意義,好比哪些變量須要聲明成爲類變量,哪些能夠是局部變量,有效避免向前引用及線程安全等。html
1、類初始化過程(即開闢內存空間)分析:數組
在JVM中 ,對於同一個JVM 來講 每一個類至對應一個Class(類)對象 也就是類只加載一次,(開闢一段內存空間),可是每次建立一次實例對象 就會建立一個實例對象,也就是實例化屢次。而且每次實例化過程當中都不會 再實例化類成員。 類成員(也就是static修飾的)老是初始化在實例(也就是對象)成員以前( 這一點很重要如下均按照這個規律進行的初始化)。 1.一個類中包含: 變量:類變量, 成員變量,方法內局部變量。 方法:靜態方法(類方法),普通方法。 構造方法。靜態初始化塊 ,初始化塊。 2.當類加載時如下內容會優先被建立: 類變量 ,靜態初始化塊 ,類方法。 以及其餘方法信息。加載順序按照書寫順序。 3.類建立對象時如下內容按照順序被初始化 首先初始化成員變量和初始化塊,這二者是平等關係,初始化按照書寫順序。 再初始化 構造方法。 4.對於含有繼承關係的類來講調用子類的屬性或者方法的時候, 都會對其父類進行初始化,初始化過程是找到最高父類,從最高父類開始 依次進行初始化。安全
2、類中變量生命週期:併發
類成員:類加載以後存在,程序結束以後消失。 成員變量:實例建立開始 到實例 回收。 方法(靜態塊,非靜態塊)內變量:跟隨方法(靜態塊,非靜態塊)調用開始 到方法結束消亡。高併發
3、關於變量在內存中存儲位置分析:優化
內存分區:在JVM虛擬機中,內存能夠粗糙的劃分爲 方法區 堆區 棧區 。
若考慮詳細內存分配能夠參考文章:http://www.cnblogs.com/dingyingsi/p/3760447.html(深刻理解JVM—JVM內存模型)。 對於棧區:每一個方法開始執行時 ,在棧上開闢棧幀 ,棧是線程私有的,存儲方法的局部變量等方法信息,方法執行結束則棧幀出棧即銷燬。所以許多文章提到 局部變量儲存在棧。 對於堆:Java 堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。堆上存放着全部的引用類型實例,包括對象實例和數組。當實例對象失去引用時,則會被垃圾回收,也就意味着生命週期結束,這裏存在一種特殊狀況,Java 內存泄漏,當某個對象被兩個或多個引用指向時,只銷毀其中一個引用,則容易引起內存泄漏。 對於方法區:存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。即時編譯後的代碼我理解爲常量池,和字面量。常量池存放了最典型的是字符串,好比聲明字符串 String a = 「a」; 「a」 會被存儲在常量池中,再次聲明String b = 「a」;則是直接從常量池中抓取。線程