国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《深入理解java虛擬機》學習筆記系列——java內存區域劃分

史占廣 / 1592人閱讀

摘要:運行時數據區域的學習,是學習以及機制的基礎,也是深入理解對象創建及運行過程的前提。了解內存區域劃分,是學習概念的前提。

Java 運行時數據區域的學習,是學習 jvm 以及 GC 機制的基礎,也是深入理解 java 對象創建及運行過程的前提。
廢話不多說,直接進入正題:

一張圖總結

詳細介紹 程序計數器 概念

程序計數器是一個比較小的內存區域,用于指示當前線程所執行的字節碼執行到了第幾行,可以理解為是當前線程的行號指示器。字節碼解釋器在工作時,會通過改變這個計數器的值來取下一條語句指令。

作用

由于 Java 虛擬機的多線程是通過線程輪流切換并分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(嚴謹點,多核處理器時指其中一個內核),只會執行一條線程的指令。

因此,為了實現線程切換后回復到正確的執行位置,各個線程私有的程序計數器時必不可少的。

注: 如果程序執行的是一個Java方法,則計數器記錄的是正在執行的虛擬機字節碼指令地址;如果正在執行的是一個本地(native,由C語言編寫完成)方法,則計數器的值為Undefined

另: 由于程序計數器只是記錄當前指令地址,所以不存在內存溢出的情況,因此,程序計數器也是所有JVM內存區域中唯一一個沒有定義OutOfMemoryError的區域。

Java 虛擬機棧 概念

一個線程的每個方法在執行的同時,都會創建一個棧幀(Statck Frame),棧幀中存儲的有局部變量表、操作站、動態鏈接、方法出口等,當方法被調用時,棧幀在JVM棧中入棧,當方法執行完成時,棧幀出棧。

作用

局部變量表中存儲著方法的相關局部變量,包括各種基本數據類型,對象的引用,返回地址等。在局部變量表中,只有long和double類型會占用2個局部變量空間(Slot,對于32位機器,一個Slot就是32個bit),其它都是1個Slot。

需要注意的是,局部變量表是在編譯時就已經確定好的,方法運行所需要分配的空間在棧幀中是完全確定的,在方法的生命周期內都不會改變

注: 每個線程對應著一個虛擬機棧,因此虛擬機棧也是線程私有的。

另: 虛擬機棧中定義了兩種異常,如果線程調用的棧深度大于虛擬機允許的最大深度,則拋出StatckOverFlowError(棧溢出);不過多數Java虛擬機都允許動態擴展虛擬機棧的大小(有少部分是固定長度的),所以線程可以一直申請棧,直到內存不足,此時,會拋出OutOfMemoryError(內存溢出)。

本地方法棧

本地方法棧在作用,運行機制,異常類型等方面都與虛擬機棧相同,唯一的區別是:虛擬機棧是執行Java方法的,而本地方法棧是用來執行native方法的,在很多虛擬機中(如Sun的JDK默認的HotSpot虛擬機),會將本地方法棧與虛擬機棧放在一起使用。

本地方法棧也是線程私有的。

Java 堆 概念

JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收(不過現代技術里,也不是這么絕對的,也有棧上直接分配的)。

補充介紹

(1)堆是JVM中所有線程共享的,因此在其上進行對象內存的分配均需要進行加鎖,這也導致了new對象的開銷是比較大的

(2)Sun Hotspot JVM為了提升對象內存分配的效率,對于所創建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此JVM在給線程的對象分配內存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配

(3)TLAB僅作用于新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。

關于堆區的內容還有很多,在后續的垃圾回收算法中還有更多的介紹。

方法區 概念

方法區是各個線程共享的區域,用于存儲已經被虛擬機加載的類信息(即加載類時需要加載的信息,包括版本、field、方法、接口等信息)、final常量、靜態變量、編譯器即時編譯的代碼等。

補充介紹

方法區在物理上也不需要是連續的,可以選擇固定大小或可擴展大小,并且方法區比堆還多了一個限制:可以選擇是否執行垃圾收集。一般的,方法區上執行的垃圾收集是很少的,這也是方法區被稱為永久代的原因之一(HotSpot),但這也不代表著在方法區上完全沒有垃圾收集,其上的垃圾收集主要是針對常量池的內存回收和對已加載類的卸載。

在方法區上定義了OutOfMemoryError:PermGen space異常,在內存不足時拋出。

運行時常量池 概念

方法區的一部分,用于存儲編譯期就生成的字面常量、符號引用、翻譯出來的直接引用(符號引用就是編碼是用字符串表示某個變量、接口的位置,直接引用就是根據符號引用翻譯出來的地址,將在類鏈接階段完成翻譯);運行時常量池除了存儲編譯期常量外,也可以存儲在運行時間產生的常量(比如String類的intern()方法,作用是String維護了一個常量池,如果調用的字符“abc”已經在常量池中,則返回池中的字符串地址,否則,新建一個常量加入池中,并返回地址)

總結

本系列文章將從4個方面介紹Java GC機制,1,內存是如何分配的;2,如何保證內存不被錯誤回收(即:哪些內存需要回收);3,在什么情況下執行GC以及執行GC的方式;4,如何監控和優化GC機制。

了解 Java 內存區域劃分,是學習 GC 概念的前提。解鈴還需系鈴人,相信完整學習完了底層的垃圾回收機制,讀者也將對 java 世界中對象創建與運行的原理有個清晰的認識吧:-)

參考文檔

《深入理解Java虛擬機:JVM高級特效與最佳實現》,第2-3章——周志明著

Java系列筆記 - Java 內存區域和GC機制——明舞

深入理解JVM結構——java團長

聯系作者

zhihu.com
segmentfault.com
oschina.net

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67204.html

相關文章

  • 深入理解java虛擬學習筆記系列——垃圾收集器&內存分配策略

    摘要:虛擬機所處的區域,則表示它是屬于新生代收集器還是老年代收集器。虛擬機總共運行了分鐘,其中垃圾收集花掉分鐘,那么吞吐量就是。收集器線程所占用的數量為。 本文主要從GC(垃圾回收)的角度試著對jvm中的內存分配策略與相應的垃圾收集器做一個介紹。 注:還是老規矩,本著能畫圖就不BB原則,盡量將各知識點通過思維導圖或者其他模型圖的方式進行說明。文字僅記錄額外的思考與心得,以及其他特殊情況 內存...

    calx 評論0 收藏0
  • 深入理解Java虛擬(自動內存管理制)

    摘要:看來還是功力不夠,索性拆成了六篇文章,分別從自動內存管理機制類文件結構類加載機制字節碼執行引擎程序編譯與代碼優化高效并發六個方面來做更加細致的介紹。本文先說說虛擬機的自動內存管理機制。在類加載檢查通過后,虛擬機將為新生對象分配內存。 歡迎關注微信公眾號:BaronTalk,獲取更多精彩好文! 書籍真的是常讀常新,古人說「書讀百遍其義自見」還是蠻有道理的。周志明老師的這本《深入理解 Ja...

    yck 評論0 收藏0
  • 深入理解虛擬Java內存區域

    摘要:運行時數據區域虛擬機在執行程序的過程中會把它管理的內存劃分成若干個不同的數據區域。堆虛擬機所管理的內存中最大的一塊,堆是所有線程共享的一塊內存區域,在虛擬機啟動時創建。 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記 1 概述 對于Java程序員來說,在虛擬機自動內存管理機制下,不再需要像C/C++程序開發程序員這樣為內一個new 操作去寫對應的delete/...

    dance 評論0 收藏0
  • 深入理解虛擬Java內存區域

    摘要:深入理解虛擬機高級特性與最佳實踐第二版讀書筆記與常見面試題總結本節常見面試題介紹下內存區域運行時數據區。運行時數據區域虛擬機在執行程序的過程中會把它管理的內存劃分成若干個不同的數據區域。 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見面試題總結 本節常見面試題: 介紹下Java內存區域(運行時數據區)。 對象的訪問定位的兩種方式。 1 概述 對于Java...

    lavnFan 評論0 收藏0
  • 深入理解java虛擬學習筆記系列——對象的內存布局

    摘要:上一篇文章講解了虛擬機中的內存布局,這里就稍作拓展,聊聊對象在虛擬機中的一些存儲細節吧。參考文檔深入理解虛擬機高級特效與最佳實現,第章周志明著系列筆記內存區域和機制明舞深入理解結構團長聯系作者 上一篇文章講解了 java 虛擬機中的內存布局,這里就稍作拓展,聊聊 java 對象在虛擬機中的一些存儲細節吧。 本文主要圍繞虛擬機中對象如何創建?對象內存都放些什么?如何訪問對象內存?這么三...

    miya 評論0 收藏0

發表評論

0條評論

史占廣

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<