日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阅读 深入理解JVM虚拟机笔记一

發布時間:2023/12/10 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阅读 深入理解JVM虚拟机笔记一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今日開始拜讀大作 深入理解JVM虛擬機 在此做一些筆記記錄:

????? ? 1.關于java運行時數據區域,其實遠不止堆和棧,在這里粗淺的有個認知:

????????????

????????? ? 1)程序計數器:一塊比較小的內存區域。字節碼解釋器需要通過計數器去執行下一條指令??紤]一下多線程處理的問題,為了能夠讓線程切換間還能找到原先執行的位置,有必要為每一個線程開辟一個內存區域。我們稱這樣的內存區域是線程私有的。[額外注意:當執行一個java程序時,計數器記錄字節碼執行位置,當執行本地方法,記錄空(undifined)。這個內存區域沒有OutOfMemoryError。]

????????? ? 2)java虛擬機棧:也是線程私有的內存區域。一個方法的執行會在此內存創建一個棧幀(基本數據結構,后會詳述),一個方法的執行到結束,對應了棧幀的入棧和出棧。其中局部變量表是我們通常所說的堆和棧中的棧了,記錄了基本類型、引用類型(可以是指針,也可以是句柄)。這個內存區域會拋出StackOverflowError和OutOfMemoryError。

????????? ? 3)本地方法棧:與虛擬機棧功能類似,只不過這塊內存是為了native方法服務的。與虛擬機棧一樣拋出兩種異常。

????????? ? 4)java堆:線程共享的內存塊,最大的一塊內存區域,用于管理創建的對象,也是GC垃圾處理器主要管轄范圍。堆中無法繼續為新實例分配空間,也無法擴展內存,會拋出OutOfMemoryError。

????????? ? 5)方法區:可以認為是堆的一個邏輯部分,用來存放類信息、常量、靜態變量、即時編譯器編譯后的代碼。由于GC管轄的劃分方式,堆可以分為新生代和老年代,從而有人認為方法區是永久代(并不合理,也不靠譜)。會拋出OutOfMemoryError。[注:此處有運行時常量池。類文件中包含了常量信息,我們稱為類常量池,運行時他們會被加入運行時常量池,同時運行時也能通過諸如String的intern()加入常量池。]

????????? ? 6)之外:直接內存:也是需要留意的,物理內存決定了上限。? ??? ??


????????2.淺談一個對象的創建過程:

????? ? 一句簡單的new: 虛擬機在堆上為新實例開辟空間(線程間的沖突問題,一方面可以CAS保證原子性,也可以為線程單獨先開辟一個小的線程堆,完成了創建再同步)--->除了對象頭外所有值初始化為零值--->對象的類信息、哈希碼值、GC年代等放入對象頭---><init>你所寫的對象初始化邏輯。

????? ? 對象:對象頭+數據信息+對其填充(沒啥用)。

????????

????? ? 3.堆溢出的解決方式:

????? ? 在java啟動項中加入參數-XX:+HeapDumpOnOutOfMemoryError,可以獲得堆內存快照,運用eclipse memory analyzer打開分析。如果是內存泄漏,可以根據GC root引用鏈找到泄露源頭。如果不存在泄露,那么就需要考慮擴大內存,或者盡可能的減少一些生命周期過長,過于龐大的實例對象。

????????

????? ? 4.棧溢出(java棧和本地方法棧)

????????? ? 在單線程程序中,無論如何都會拋出StackOverflowError,這樣很好理解,無論棧幀過大還是虛擬棧內存太小,都可以認為是棧內存不足/深度不足。在多線程程序中,為每個線程棧分配過多的內存將會拋出OutOfMemoryError,一般來說遇到這種情況,只能通過考慮減少堆內存、棧內存來更多的獲得線程(操作系統所給的內存是有限的,將會被堆棧、進程所共享)。


????? ? 5.關于常量池溢出:

????? ??? ? 首先記錄一個很有趣的問題:

????????????

????????? ? 在JDK1.6下輸出的是兩個false,而到了JDK1.7下輸出變成了true,false。在1.6時,intern方法會將首次遇到的字符串復制到常量池中,并返回引用。StringBuilder實例與常量池實例一定不是同一個東西,必然是false。而在1.7后,intern將首次遇到的字符串添加到常量池,但不復制,因此第一條輸出true。但是考慮java這個字符串已經存在與常量池中,所以第二個必然返回false。

????????????

????????? ? 方法區溢出是需要注意的:往往回收類十分的苛刻,對于動態產生類,或者CGLib這類加強類或者大量jsp文件...的地方,一定要格外小心。


????? ? 6.直接內存泄露

????????? ? 如果發現OOM下HeapDump文件很小,基本可以考慮是直接內存泄露了。

總結

以上是生活随笔為你收集整理的阅读 深入理解JVM虚拟机笔记一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。