Java—JVM的内存
內存
JAVA是在JVM所虛擬出的內存環境中運行的,JVM內存區域主要包括:程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區。
線程獨占:
程序計數器:
計數器記錄的是虛擬機字節碼指令的地址(當前指令的地址)。字節碼解釋器工作時通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等功能都需要依賴這個計數器。
虛擬機棧(stack):
常說的棧也就是虛擬機棧,棧是由一個個棧幀組成,而每個棧幀中都擁有:局部變量表、操作數棧、動態鏈接、方法出口信息。局部變量表主要存放基本類型變量數據和對象的引用。z(不是對象)。每一次函數調用都會有一個對應的棧幀被壓入Java棧,每一個函數調用結束后,都會有一個棧幀被彈出。
本地方法棧:
和虛擬機棧的作用相似,區別是:?虛擬機棧為虛擬機執行 Java 方法 (也就是字節碼)服務,而本地方法棧則為虛擬機使用到的 Native 方法服務。即執行的方法是本地方法,同樣創建棧幀。
線程共享:
堆(heap):
堆內存用于存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。JVM只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。
方法區(method):又叫靜態區,所有線程共享。方法區包含所有的類信息和static變量。
常量池(方法區中):存放字符串常量、基本類型常量(public static final)和類信息(這些都是不會改變的,比如:一個類的名字,一個類字段的名字/所屬類型,一個類方法的名字/返回類型/參數名與所屬類型)。
注意:Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小于等于127時才可使用常量池
Boolean同樣可以使用,Double、Float沒有實現。
//在值小于127時可以使用常量池 Integer i1=127; Integer i2=127; System.out.println(i1==i2); //輸出true //值大于127時,不會從常量池中取對象 Integer i3=128; Integer i4=128; System.out.println(i3==i4); //輸出false常量池有三種形態:靜態常量池、運行時常量池 、全局字符串常量池。
- 所謂靜態常量池 ,即*.class文件中的常量池。class文件中的常量池包含各種字面量(Literal)和符號引用(Symbolic References)。
在JDK1.7之后。
- 字符串常量池:字符串常量池移出方法區,存入堆中,全局字符串池里的內容是在類加載完成,經過驗證,準備階段之后在堆中生成字符串對象實例,然后將該字符串對象實例的引用值存到string pool中。?在HotSpot VM里實現的string pool功能的是一個StringTable類,它是一個哈希表,里面存的是駐留字符串(也就是我們常說的用雙引號括起來的)的引用。這個StringTable在每個HotSpot VM的實例只有一份,被所有的類共享。
- 運行時常量池:當類加載到內存中后,jvm就會將class常量池中的內容存放到運行時常量池中,由此可知,運行時常量池也是每個類都有一個。class常量池中存的是字面量和符號引用,也就是說他們存的是對象的符號引用值。驗證,準備然后經過解析之后,也就是把符號引用替換為直接引用,解析的過程運行時常量池會去查詢全局字符串池,也就是我們上面所說的StringTable,以保證運行時常量池所引用的字符串與全局字符串池中所引用的是一致的。
在JDK1.8之后,為了解決永久代內存溢出的情況,提出meta space(元空間)概念,方法區的實現變成了元數據區。元數據和永久代本質上都是方法區的實現。
本地內存:
直接受操作系統管理,屬于“內核態”,在數據區域向磁盤寫數據時,數據會被先復制到本地內存,然后再寫入磁盤,使用本地內存避免了這個操作。
直接內存:
???????直接內存不是Java虛擬機規范中定義的內存區域,但是這部分內存也被頻繁地使用,而且也可能導致OutOfMemoryError異常出現。在JDK1.4中新加入了NIO(New Input/Output)類,引入了一種基于通道(Channel)與緩沖區(Buffer)的I/O方式,它可以使用Native函數庫直接分配堆外內存,然后通過一個存儲在Java堆里面的DirectByteBuffer對象作為這塊內存的引用 進行操作。這樣能在一些場景中顯著提高性能,因為避免了在Java堆和Native堆中來回復制數據。
總結
以上是生活随笔為你收集整理的Java—JVM的内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Windows 下使用OpenCL
- 下一篇: 264,avs中Skip宏块与Direc