JVM_java内存区域
Java內存區域圖如下:
 
 程序計數器:
 
 
 
 Java虛擬機棧:
 和程序計數器一樣,是線程私有的,它的生命周期與線程相同。每個方法被執行的時候都會同時創建一個棧幀用于存儲局部變量、操作棧、動態鏈接、方法出口等消息。每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機中從入棧到出棧的過程。
 局部變量表存放了編譯期可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型,它不等同于對象本身,根據不同的虛擬機實現,它可能是一個指向對象起始地址的引用指針,也可能指向一個代表對象的句柄或者其他此對象相關位置)和returnAddress類型(指向了一條字節碼指令地址)。
 這個區域規定了兩種異常:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機可以動態擴展,當擴展無法申請到足夠的內存時會拋出OutOfMemoryError異常。
本地方法棧
 本地方法棧和虛擬機棧所發揮的作用非常相似,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到Native方法服務。與虛擬機一樣本地方法棧會拋出StackOverflowError和OutOfMemoryError。
Java堆
 對于大多數應用來說,Java堆(Java heap)是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。所有對象實例以及數組都要在堆上分配。
 Java堆是垃圾收集器管理的主要區域,因此很多時候也被稱作“GC堆(Garbage Collected Heap)”。Java堆中還可以細分為:新生代和老年代‘再細致一點的有Eden空間、From Survivor空間、To Survivor空間等。
方法區
 方法區與Java堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
 
 運行時常量池是方法區的一部分,class文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項信息就是常量池,用于存放編譯期生產的各種字面量和符號引用,這部分內容將在類加載后存放到方法區的運行時常量池中。
 上面是方法區域的介紹
 
對象訪問
 對象在訪問時會涉及到Java棧、Java堆、方法區這三個最重要內存區域之間的關聯
 Object obj=new Object();
 這句話中,“Object obj”的語義將會反映到Java棧的本地變量表中,作為一個reference類型數據出現。而“new Object()”這部分的語義將會反映到Java堆中,形成了一塊存儲了Object類型所有實例數據值的結構化內存。
 另外,在Java堆中還必須包括能查到此對象類型數據(如對象類型、父類、實現的接口、方法等)的地址信息,這些類型數據則存儲在方法區中。
使用句柄方式訪問:
 
 使用直接指針訪問方式:
 實戰:OutOfMemoryError
 Java堆溢出:
 Java堆用于存儲對象實例,我們只要不斷地創建對象,并且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清楚這些對象,就會在對象數量到達最大堆的容量限制后產生內存溢出異常。
 
 
 首先是判斷是內存泄漏還是內存溢出。
 
 虛擬機和方法棧溢出
 
 
總結
以上是生活随笔為你收集整理的JVM_java内存区域的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MotifStack:多motif序列比
- 下一篇: 卷积神经网络CNN(6)—— YOLOv
