JVM基礎入門之運行時資料區
這張圖我相信基本上對JVM有點接觸的都應該很熟悉,可以說這是JVM入門的第一課。其中的“堆疊”和“虛擬機器堆疊(堆疊)」更是耳熟能詳。下面將圍繞這張圖對JVM的運行時資料區做一個簡單介紹。
程式計數器(Program Counter Register)
## 這和電腦操作系統中的程式計數器類似,在電腦作業系統中程式計數器表示這個行程要執行的下個指令的位址,對於JVM中的程式計數器可以看做是目前執行緒所執行的字節碼的行號指示器,每個線程都有一個程式計數器(這很好理解,每個線程都有在執行任務,如果線程切換後要保證能恢復到正確的位置),重要的一點——程式計數器,這是JVM規格中唯一一個沒有規定會導致OutOfMemory# (記憶體洩露,下文簡稱OOM)的區域。換句話說上圖中的其餘4個區域,都有可能導致OOM。
☆虛擬機堆疊(Java Virtual Machine Stacks)
這塊記憶體區域就是我們常常說的“堆疊”,我們所熟知的是它用來存放變量,也就是說例如:
#int i = 0;
4個位元組來儲存##i變數。對於變數的記憶體空間是一開始就能確定的(對於引用型變量,它當然儲存的就是一個位址引用,其大小也是固定),所以這塊記憶體區域在編譯器就能夠確定下來,這塊區域可能會拋出StackOverflowError或OOM錯誤。設定JVM參數」-Xss228k」(堆疊大小為228k)。
1 package com.jvm; 2 3 /** 4 * -Xss228k,虚拟机栈大小为228k 5 * Created by yulinfeng on 7/11/17. 6 */ 7 public class Test { 8 private static int count = 0; 9 10 public static void main(String[] args) {11 Test test = new Test();12 test.test();13 }14 15 /**16 * 递归调用17 */18 private void test() {19 try {20 count++;21 test();22 } catch (Throwable e) { //Exception已经捕获不了JVM抛出的StackOverflowError23 System.out.println("递归调用次数" + count);24 e.printStackTrace();25 }26 }27 }
這是一段沒有終止條件的遞歸,執行結果如下圖所示,JVM拋出StackOverflowError#表示執行緒請求的堆疊深度大於JVM所允許的深度。
對於單一執行緒情況下,無論如何拋出的都是StackOverflowError。如果要拋出OOM異常,導致的原因是不斷地在建立線程,直到記憶體消耗殆盡。
JVM的記憶體由堆內存 #+ 方法區內存 + 剩餘內存,也就是剩餘記憶體=作業系統分配給JVM#的記憶體 - 堆記憶體 - 方法區記憶體。 -Xss設定的是每個執行緒的堆疊容量,也就是說可以建立的執行緒數量 = 剩餘記憶體 / 堆疊記憶體。此時如果棧記憶體越大,可以建立的執行緒數量就少,就容易出現OOM#;如果堆疊記憶體越小,可以建立的執行緒數量就多,就不容易出現OOM。
要避免這種情況最好就是減少堆疊記憶體+方法區內存,或是適當地減少堆疊記憶體。對於堆疊記憶體的配置,一般採用預設值1M#,或採用64位元作業系統以及64 位元的JVM。
本機方法堆疊(Native Method Stack)
本機方法堆疊和虛擬機器堆疊類似,不同的是虛擬機器堆疊服務的是Java方法,而本機方法堆疊服務的是Native方法。在HotSpot虛擬機器實作中是把本機方法堆疊和虛擬機器堆疊合而為一的,同理它也會拋出StackOverflowError 和OOM異常。
☆Java堆(Java Heap)
########################################对于堆,Java程序员都知道对象实例以及数组内存都要在堆上分配。堆不再被线程所独有而是共享的一块区域,它的确是用来存放对象实例,也是垃圾回收GC的主要区域。实际上它还能细分为:新生代(Young Generation)、老年代(Old Generation)。对于新生代又分为Eden空间、From Survivor空间、To Survivor空间。至于为什么这么分,这涉及JVM的垃圾回收机制,在这里不做叙述。堆同样会抛出OOM异常,下面例子设置JVM参数” -Xms20M -Xmx20M“(前者表示初始堆大小20M,后者表示最大堆大小20M)。
1 package com.jvm; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * -Xms20M -Xmx20M 堆初始大小20M 堆最大大小20M 8 * Created by yulinfeng on 7/11/17. 9 */10 public class Test {11 12 public static void main(String[] args) {13 List<Test> list = new ArrayList<Test>();14 int count = 0;15 try {16 while (true) {17 count++;18 list.add(new Test()); //不断创建线程19 }20 } catch (Throwable e) {21 System.out.println("创建实例个数:" + count);22 e.printStackTrace();23 }24 25 }26 }
执行的结果可以清楚地看到堆上的内存空间溢出了。
☆方法区(Method Area)
对于JVM的方法区,可能听得最多的是另外一个说法——永久代(Permanent Generation),呼应堆的新生代和老年代。方法区和堆的划分是JVM规范的定义,而不同虚拟机有不同实现,对于Hotspot虚拟机来说,将方法区纳入GC管理范围,这样就不必单独管理方法区的内存,所以就有了”永久代“这么一说。方法区和操作系统进程的正文段(Text Segment)的作用非常类似,它存储的是已被虚拟机加载的类信息、常量(从JDK7开始已经移至堆内存中)、静态变量等数据。现设置JVM参数为”-XX:MaxPermSize=20M”(方法区最大内存为20M)。
1 package com.jvm; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * -XX:MaxPermSize=20M 方法区最大大小20M 8 * Created by yulinfeng on 7/11/17. 9 */10 public class Test {11 12 public static void main(String[] args) {13 List<String> list = new ArrayList<String>();14 int i = 0;15 while (true) {16 list.add(String.valueOf(i++).intern()); //不断创建线程17 }18 }19 }
其實對於上述程式碼,在JDK6、JDK7、JDK8運行結果均不一樣。原因就在於字串常數池在JDK6的時候還是存放在方法區(永久代)所以它會拋出OutOfMemoryError:Permanent Space#;而JDK7後則將字串常數池移到了Java堆中,上面的程式碼不會拋出OOM,將堆記憶體改為20M則會拋出OutOfMemoryError:Java heap space #;至於JDK8則是純粹取消了方法區這個概念,取而代之的是」#元空間(Metaspace)「,所以在JDK8中虛擬機器參數”-XX:MaxPermSize”也就沒有了任何意義,取代它的是”-XX:MetaspaceSize“#和” -XX:MaxMetaspaceSize”等。
以上是JVM基礎入門之運行時資料區的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Diffusion不僅可以更好地模仿,而且可以進行「創作」。擴散模型(DiffusionModel)是一種影像生成模型。與先前AI領域大名鼎鼎的GAN、VAE等演算法,擴散模型另闢蹊徑,其主要想法是先對影像增加噪聲,再逐步去噪的過程。其中如何去噪還原原影像是演算法的核心部分。最終演算法能夠從一張隨機的雜訊影像中產生影像。近年來,生成式AI的驚人成長將文字轉換為圖像生成、視訊生成等領域的許多令人興奮的應用提供了支援。這些生成工具背後的基本原理是擴散的概念,這是一種特殊的取樣機制,克服了先前的方法中被

Kimi:一句話,十幾秒鐘,一份PPT就新鮮出爐了。 PPT這玩意兒,可太招人煩了!開個碰頭會,要有PPT;寫個週報,要做PPT;拉個投資,要展示PPT;就連控訴出軌,都得發個PPT。大學比較像是學了個PPT專業,上課看PPT,下課做PPT。或許,37年前丹尼斯・奧斯汀發明PPT時也沒想到,有一天PPT竟然如此氾濫成災。嗎嘍們做PPT的苦逼經歷,說起來都是淚。 「一份二十多頁的PPT花了三個月,改了幾十遍,看到PPT都想吐」;「最巔峰的時候,一天做了五個PPT,連呼吸都是PPT」;「臨時開個會,都要做個

北京時間6月20日凌晨,在西雅圖舉辦的國際電腦視覺頂會CVPR2024正式公佈了最佳論文等獎項。今年共有10篇論文獲獎,其中2篇最佳論文,2篇最佳學生論文,另外還有2篇最佳論文提名和4篇最佳學生論文提名。電腦視覺(CV)領域的頂級會議是CVPR,每年都會吸引大量研究機構和高校參會。根據統計,今年共提交了11532份論文,2719篇被接收,錄取率為23.6%。根據佐治亞理工學院對CVPR2024的數據統計分析,從研究主題來看,論文數量最多的是圖像和視頻合成與生成(Imageandvideosyn

快速入門PyCharm社群版:詳細安裝教學全解析導言:PyCharm是一個功能強大的Python整合開發環境(IDE),它提供了一套全面的工具,可以幫助開發人員更有效率地編寫Python程式碼。本文將詳細介紹如何安裝PyCharm社群版,並提供具體的程式碼範例,幫助初學者快速入門。第一步:下載和安裝PyCharm社群版要使用PyCharm,首先需要從其官方網站上下

我們知道LLM是在大規模電腦叢集上使用海量資料訓練得到的,本站曾介紹過不少用於輔助和改進LLM訓練流程的方法和技術。而今天,我們要分享的是一篇深入技術底層的文章,介紹如何將一堆連作業系統也沒有的「裸機」變成用來訓練LLM的電腦叢集。這篇文章來自於AI新創公司Imbue,該公司致力於透過理解機器的思維方式來實現通用智慧。當然,將一堆連作業系統也沒有的「裸機」變成用於訓練LLM的電腦叢集並不是一個輕鬆的過程,充滿了探索和試錯,但Imbue最終成功訓練了一個700億參數的LLM,並在此過程中積累

機器之能報道編輯:楊文以大模型、AIGC為代表的人工智慧浪潮已經在悄悄改變我們生活及工作方式,但絕大部分人依然不知道該如何使用。因此,我們推出了「AI在用」專欄,透過直覺、有趣且簡潔的人工智慧使用案例,來具體介紹AI使用方法,並激發大家思考。我們也歡迎讀者投稿親自實踐的創新用例。影片連結:https://mp.weixin.qq.com/s/2hX_i7li3RqdE4u016yGhQ最近,獨居女孩的生活Vlog在小紅書上走紅。一個插畫風格的動畫,再配上幾句治癒系文案,短短幾天就能輕鬆狂攬上

標題:技術入門者必看:C語言和Python難易度解析,需要具體程式碼範例在當今數位化時代,程式設計技術已成為一項越來越重要的能力。無論是想要從事軟體開發、數據分析、人工智慧等領域,還是僅僅出於興趣學習編程,選擇一門合適的程式語言是第一步。而在眾多程式語言中,C語言和Python作為兩種廣泛應用的程式語言,各有其特色。本文將對C語言和Python的難易度進行解析

C語言作為一門廣泛應用的程式語言,對於想從事電腦程式設計的人來說是必學的基礎語言之一。然而,對於初學者來說,學習新的程式語言可能會有些困難,尤其是缺乏相關的學習工具和教材。在本文中,我將介紹五款幫助初學者入門C語言的程式設計軟體,幫助你快速上手。第一款程式軟體是Code::Blocks。 Code::Blocks是一個免費的開源整合開發環境(IDE),適用於
