jvm內存模型

  • 程序計數器(線程私有)

    程序計數器能夠理解爲虛擬機下一次要執行的字節碼位置,能夠經過改變這個行號來實現循環,跳轉等功能。線程私有。java

  • java虛擬機棧(線程私有)

    虛擬機棧是和線程生命週期一致,隨線程生而生,爲線程私有的區域。當咱們調用一個方法的時候,會建立一個棧幀(通俗理解成一個棧數組吧),方法裏的基本數據類型(局部變量表)、操做數棧、動態鏈家、方法出口會入棧到這個數組裏,當咱們離開這個方法的時候,就會出棧。算法

    當棧深度大於虛擬機所容許的深度時候,拋出stackoverflow異常。(這個是虛擬機棧深度沒法拓展時會觸發)數組

    當虛擬機容許棧深度能夠拓展時,若是拓展時沒法申請足夠的內存空間,拋出OutOfMemoryError。優化

    棧比堆速度快的緣由的解釋:線程

    1)棧是程序啓動的時候,系統分好了給你的,你本身用,系統不干預。堆是用的時候才向系統申請的,用完了還回去,這個申請和交還的過程開銷相對就比較大了。對象

    2)棧是編譯時分配空間,而堆是動態分配(運行時分配空間),因此棧的速度快。生命週期

  • 本地方法棧

    基本和虛擬機棧同樣,區別爲:虛擬機棧是虛擬機使用java方法服務,而本地方法棧是虛擬機調用本地的native方法服務。內存

  • 堆(線程共享)

    堆是內存裏面最大的一塊區域,咱們平時涉及到的new出來的對象幾乎都放在這裏(JIT的編譯優化,使得有些對象能夠不用存放在堆裏) 。是垃圾回收的主要區域,也成爲GC堆,堆裏面由於垃圾回收算法,也細分紅新生代和老年代(永久代是位於方法區,方法區雖然和堆很像,但通常稱之爲:non-heap即非堆)。虛擬機

  • 方法區(線程共享)

    用來存儲加載類所用到的類信息、常量、靜態變量等數據。Hotspot虛擬機通常會把方法區叫作「永久代」。稱之爲永久代主要緣由是垃圾回收的時候基本都是回收堆裏面的,而在方法區通常不回收,要麼就是回收的效果慘淡,所以俗稱永久代。Hotspot1.7版本將常量池移出方法區了。編譯

    常量池是方法區的一部分,用來存放編譯時生成的各類字面量和符號引用。String.intern()方法會先去常量池裏面找,是否有這個字符,若是有,則返回這個字符的引用,若是沒有則將這個字符放入常量池。

相關文章
相關標籤/搜索