來源:北大青鳥飛迅校區(qū)|發(fā)布時間:2013-04-27 13:51:25
JAVA內(nèi)存分配與管理是Java的核心技術之一,之前我們曾介紹過Java的內(nèi)存管理與內(nèi)存泄露以及Java垃圾回收方面的知識,今天我們再次深入Java核心,詳細介紹一下Java在內(nèi)存分配方面的知識。一般Java在內(nèi)存分配時會涉及到以下區(qū)域:
◆寄存器:我們在程序中無法控制
◆棧:存放基本類型的數(shù)據(jù)和對象的引用,但對象本身不存放在棧中,而是存放在堆中
◆堆:存放用new產(chǎn)生的數(shù)據(jù)
◆靜態(tài)域:存放在對象中用static定義的靜態(tài)成員
◆常量池:存放常量
◆非RAM存儲:硬盤等永久存儲空間
Java內(nèi)存分配中的棧
在函數(shù)中定義的一些基本類型的變量數(shù)據(jù)和對象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當在一段代碼塊定義一個變量時,Java就在棧中 為這個變量分配內(nèi)存空間,當該變量退出該作用域后,Java會自動釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。
Java內(nèi)存分配中的堆
堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組。 在堆中分配的內(nèi)存,由Java虛擬機的自動垃圾回收器來管理。
在堆中產(chǎn)生了一個數(shù)組或?qū)ο蠛,還可以 在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個變量就成了數(shù)組或?qū)ο蟮囊米兞俊?引用變量就相當于是 為數(shù)組或?qū)ο笃鸬囊粋名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο。引用變量就相當于是為?shù)組或者對象起的一個名稱。
引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數(shù)組和對象本身在堆中分配,即使程序 運行到使用 new 產(chǎn)生數(shù)組或者對象的語句所在的代碼塊之外,數(shù)組和對象本身占據(jù)的內(nèi)存不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變?yōu)槔,不能在被使用,但?然占據(jù)內(nèi)存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較占內(nèi)存的原因。
實際上,棧中的變量指向堆內(nèi)存中的變量,這就是Java中的指針! 常量池 (constant pool)
常量池指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數(shù)組)的常量值(final)還包含一些以文本形式出現(xiàn)的符號引用,比如:
◆類和接口的全限定名;
◆字段的名稱和描述符;
◆方法和名稱和描述符。
虛擬機必須為每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和 floating point常量)和對其他類型,字段和方法的符號引用。
對于String常量,它的值是在常量池中的。而JVM中的常量池在內(nèi)存當中是以表的形式存在的, 對于String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引 用。說到這里,對常量池中的字符串值的存儲位置應該有一個比較明了的理解了。在程序執(zhí)行的時候,常量池 會儲存在Method Area,而不是堆中。
招生熱線: 4008-0731-86 / 0731-82186801
學校地址: 長沙市天心區(qū)團結(jié)路6號
Copyright © 2006 | 湖南大計信息科技有限公司 版權(quán)所有
湘ICP備14017520號-3