Java進階(一)一文理解Java內存機制

棧、堆、常量池等雖同屬Java內存分配時操作的區域,但其適用範圍和功用卻大不相同。本文將深入Java核心,簡單講解Java內存分配方面的知識。

首先我們先來講解一下內存中的各個區域。

stack(棧)

存放基本類型的數據和對象的引用,即存放變量。

如果存放的是基本類型數據(非靜態變量),則直接將變量名和值存入stack中的內存中;

如果是引用類型,則將變量名存入棧,然後指向它new出的對象(存放在堆中)。

heap(堆)

存放new產生的數據。

data segment

分為靜態域和常量域。

靜態域

存放在對象中用static定義的靜態成員(即靜態變量,同理,如果該靜態變量是基本類型則將變量名和值存入靜態域,如果是引用類型則指向new出的對象)。

常量池

常量池指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各種基本類型(如int、long等)和對象型(如String及數組)的常量值(final)還包含一些以文本形式出現的符號引用,比如:類和接口的全限定名;字段的名稱和描述符;方法和名稱和描述符。

code segment:存放代碼。

下面我來舉幾個簡單的小例子來讓大家認識一下這幾個區域具體存放的內容:

注:例1和例2中大家要注意String類型不是基本數據類型,所以它可以創建對象,並且它的值是放在常量池中的。

例1. 非靜態和靜態變量的創建

String str = "abc"; static Int a = 10; //創建String類型的變量str;創建Int類型變量a

內存解析:

這裡的str是非靜態變量所以將其放入到棧中,而靜態變量a則需要放入靜態域中,對於變量值"abc"和10則都應該放入到常量池當中

Java進階(一)一文理解Java內存機制

例2. 對象的創建

String str=new String("abc"); //創建String類型的對象str

內存解析:

這裡的str是String類型的對象,所以放入棧中,而new出來的東西則放入到堆中,對於初始值"abc"則放入到常量池中即可。

Java進階(一)一文理解Java內存機制

例3. 數組的創建

Int s[] = new Int[3];s[0]=3;s[1]=2;s[2]=3;

內存解析:

這裡的s[]是一個數組變量,所以放入到棧中,new出來的東西還是放入到堆中,最後的每個元素的值則放入到常量池當中。

Java進階(一)一文理解Java內存機制

本頭條號已開設如下二十大專題,歡迎長期關注,查看相關專題!

【springboot專題】【spring源碼】

【mysql優化專題】【HTTP協議】

【架構技術專題】【多線程專題】

【dubbo專題】【dubbo源碼專題】

【JVM調優專題】【HTTP專題】

【設計模式專題】【高併發專題】

【架構技術專題】【Lucene專題】

【數據結構專題】【redis專題】

【mq中間件專題】【netty專題】

【java面試專題】【zookeeper】


分享到:


相關文章: