小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java堆、棧、方法區(qū)、常量池

 WaterStoneShi 2016-08-04

1:棧

   在函數(shù)中定義的一些基本類型的變量數(shù)據(jù)和對象的引用變量都在函數(shù)的棧內(nèi)存中分配。  

   當(dāng)在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內(nèi)存空間,當(dāng)該變量退出該作用域后,Java會自動釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。

   每個線程包含一個棧區(qū),每個棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。棧分為3個部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。

2:堆

   堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組。 在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或?qū)ο蠛?,在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個變量就成了數(shù)組或?qū)ο蟮囊米兞俊?nbsp; 引用變量就相當(dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο?。引用變量就相?dāng)于是為數(shù)組或者對象起的一個名稱。引用變量是普通的變量,定義時在棧中分配,引用變量在程序運(yùn)行到其作用域之外后被釋放。而數(shù)組和對象本身在堆中分配,即使程序運(yùn)行到使用 new 產(chǎn)生數(shù)組或者對象的語句所在的代碼塊之外,數(shù)組和對象本身占據(jù)的內(nèi)存不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變?yōu)槔?,不能在被使用,但仍然占?jù)內(nèi)存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是java比較占內(nèi)存的原因。實際上,棧中的變量指向堆內(nèi)存中的變量,這就是java中的指針! 

   Java的堆是一個運(yùn)行時數(shù)據(jù)區(qū),類的對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負(fù)責(zé)的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運(yùn)行時動態(tài)分配內(nèi)存的,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。但缺點是,由于要在運(yùn)行時動態(tài)分配內(nèi)存,存取速度較慢。

   jvm只有一個堆區(qū)(heap)被所有線程共享。

3、方法區(qū)(method area)

   方法區(qū)跟堆一樣,被所有的線程共享。用于存儲虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。

4、常量池(constant pool)

   常量池指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數(shù)組)的常量值(final)還包含一些以文本形式出現(xiàn)的符號引用,比如:類和接口的全限定名; 字段的名稱和描述符; 方法和名稱和描述符。虛擬機(jī)必須為每個被裝載的類型維護(hù)一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和floating point常量)和對其他類型,字段和方法的符號引用。對于String常量,它的值是在常量池中的。而JVM中的常量池在內(nèi)存當(dāng)中是以表的形式存在的,對于String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引用。說到這里,對常量池中的字符串值的存儲位置應(yīng)該有一個比較明了的理解了。在程序執(zhí)行的時候,常量池會儲存在方法區(qū)(Method Area),而不是堆中。


   棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享(指的是線程共享,而給進(jìn)程共享)。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量數(shù)據(jù)(int, short, long, byte, float, double, boolean, char)和對象句柄(引用)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多