日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
深入理解JVM的內存區(qū)域劃分

虛擬化 在整個程序執(zhí)行過程中,JVM會用一段空間來存儲程序執(zhí)行期間需要用到的數據和相關信息,這段空間一般被稱作為Runtime Data Area(運行時數據區(qū)),也就是我們常說的JVM內存。

10年的鶴山網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷推廣的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整鶴山建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯公司從事“鶴山網站設計”,“鶴山網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

本文轉載自微信公眾號「碼蟲甲」,作者碼蟲甲 。轉載本文請聯系碼蟲甲公眾號。

 一、Java文件是如何運行起來的?

執(zhí)行流程:

1.Java文件經過編譯后變成 .class 字節(jié)碼文件

2.字節(jié)碼文件通過類加載器加載到 JVM 虛擬機中

3.加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行

在整個程序執(zhí)行過程中,JVM會用一段空間來存儲程序執(zhí)行期間需要用到的數據和相關信息,這段空間一般被稱作為Runtime Data Area(運行時數據區(qū)),也就是我們常說的JVM內存。

二、運行時數據區(qū)包括哪幾部分?

運行時數據區(qū)主要包含以下5大塊:方法區(qū),堆都為線程共享區(qū)域,有線程安全問題,Java棧、本地方法棧和程序計數器都是獨享區(qū)域,不存在線程安全問題,其中 JVM 的調優(yōu)主要就是圍繞堆,棧兩大塊進行。

1.方法區(qū)

存儲了每個類的信息(包括類的名稱、方法信息、字段信息)、靜態(tài)變量、常量以及編譯器編譯后的代碼等,類加載器將 .class 文件加載到運行時數據區(qū)時就是先丟到這一塊上面。

在Class文件中除了類的字段、方法、接口等描述信息外,還有一項信息是常量池,用來存儲編譯期間生成的字面量和符號引用。

在方法區(qū)中有一個非常重要的部分就是運行時常量池,它是每一個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM后,對應的運行時常量池就被創(chuàng)建出來。當然并非Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,比如String的intern方法。

2.堆

和方法區(qū)同屬線程共享區(qū)域,它主要放了一些存儲的數據,比如對象實例,數組···等。

堆是Java垃圾收集器管理的主要區(qū)域,在JVM中只有一個堆。

3.Java棧

Java棧也稱作虛擬機棧(Java Vitual Machine Stack),Java棧是Java方法執(zhí)行的內存模型。

Java棧中存放的是一個個的棧幀,每個棧幀對應一個被調用的方法,在棧幀中包括局部變量表(Local Variables)、操作數棧(Operand Stack)、指向當前方法所屬的類的運行時常量池(運行時常量池的概念在方法區(qū)部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息。當線程執(zhí)行一個方法時,就會隨之創(chuàng)建一個對應的棧幀,并將建立的棧幀壓棧。當方法執(zhí)行完畢之后,便會將棧幀出棧。因此可知,線程當前執(zhí)行的方法所對應的棧幀必定位于Java棧的頂部。講到這里,大家就應該會明白為什么 在 使用 遞歸方法的時候容易導致棧內存溢出的現象了以及為什么棧區(qū)的空間不用程序員去管理了(當然在Java中,程序員基本不用關系到內存分配和釋放的事情,因為Java有自己的垃圾回收機制),這部分空間的分配和釋放都是由系統(tǒng)自動實施的。對于所有的程序設計語言來說,棧這部分空間對程序員來說是不透明的。下圖表示了一個Java棧的模型:

局部變量表,顧名思義,想必不用解釋大家應該明白它的作用了吧。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數形參)。對于基本數據類型的變量,則直接存儲它的值,對于引用類型的變量,則存的是指向對象的引用。局部變量表的大小在編譯器就可以確定其大小了,因此在程序執(zhí)行期間局部變量表的大小是不會改變的。

操作數棧,想必學過數據結構中的棧的朋友想必對表達式求值問題不會陌生,棧最典型的一個應用就是用來對表達式求值。想想一個線程執(zhí)行方法的過程中,實際上就是不斷執(zhí)行語句的過程,而歸根到底就是進行計算的過程。因此可以這么說,程序中的所有計算過程都是在借助于操作數棧來完成的。

指向運行時常量池的引用,因為在方法執(zhí)行的過程中有可能需要用到類中的常量,所以必須要有一個引用指向運行時常量。

方法返回地址,當一個方法執(zhí)行完畢之后,要返回之前調用它的地方,因此在棧幀中必須保存一個方法返回地址。

由于每個線程正在執(zhí)行的方法可能不同,因此每個線程都會有一個自己的Java棧,互不干擾。

4.本地方法棧

我們點開Thread類的源碼,可以看到它的start()方法帶有一個native關鍵字修飾,而且不存在方法體,這種用native修飾的方法就是本地方法。

  
 
 
 
  1. private native void start0(); 

本地方法棧與Java棧的作用和原理非常相似,區(qū)別只不過是Java棧是為執(zhí)行Java方法服務的,而本地方法棧則是為執(zhí)行本地方法(Native Method)服務的。在JVM規(guī)范中,并沒有對本地方發(fā)展的具體實現方法以及數據結構作強制規(guī)定,虛擬機可以自由實現它。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一。

5.程序計數器

程序計數器(Program Counter Register),也有稱為PC寄存器的。學過匯編語言的同學對程序計數器這個概念并不陌生,在匯編語言中,程序計數器是指CPU中的寄存器,它保存的是程序當前執(zhí)行的指令的地址(也可以說保存下一條指令的所在存儲單元的地址),當CPU需要執(zhí)行指令時,需要從程序計數器中得到當前需要執(zhí)行的指令所在存儲單元的地址,然后根據得到的地址獲取到指令,在得到指令之后,程序計數器便自動加1或者根據轉移指針得到下一條指令的地址,如此循環(huán),直至執(zhí)行完所有的指令。

雖然JVM中的程序計數器并不像匯編語言中的程序計數器一樣是物理概念上的CPU寄存器,但是JVM中的程序計數器的功能跟匯編語言中的程序計數器的功能在邏輯上是等同的,也就是說是用來指示執(zhí)行哪條指令的。

由于在JVM中,多線程是通過線程輪流切換來獲得CPU執(zhí)行時間的,因此,在任一具體時刻,一個CPU的內核只會執(zhí)行一條線程中的指令,因此,為了能夠使得每個線程都在線程切換后能夠恢復在切換之前的程序執(zhí)行位置,每個線程都需要有自己獨立的程序計數器,并且不能互相被干擾,否則就會影響到程序的正常執(zhí)行次序。因此,可以這么說,程序計數器是每個線程所私有的。

在JVM規(guī)范中規(guī)定,如果線程執(zhí)行的是非native方法,則程序計數器中保存的是當前需要執(zhí)行的指令的地址;如果線程執(zhí)行的是native方法,則程序計數器中的值是undefined。

由于程序計數器中存儲的數據所占空間的大小不會隨程序的執(zhí)行而發(fā)生改變,所以它是內存區(qū)域中唯一一個不會出現OutOfMemoryError的區(qū)域,而且占用內存空間小到基本可以忽略不計。


本文題目:深入理解JVM的內存區(qū)域劃分
標題網址:http://www.dlmjj.cn/article/djocidi.html