深入理解Java虛擬機(一)-----Java內存區域和內存溢出

Java虛擬機運行時數據區域

java在運行時主要可以分爲兩類,一類是線程獨享的,另外就是線程共享的。

程序計數器:

記錄jvm字節碼指令的地址,我自己的理解就是每個線程在執行代碼的時候,一條命令在字節碼文件中對應一條字節碼,然後你要執行下一句指令,就需要知道前一條指令的地址,程序計數器就起到記錄這個指令地址的作用。需注意,程序計數器不會拋出內存溢出異常OutOfMemoryError

虛擬機棧(本地方法棧):

這兩個區域大致是差不多的,虛擬機棧是執行java方法,本地方法棧是執行native方法(本地方法)。
然後他們是java(native)方法在運行時啓動的,運行時會創建一個棧幀,裏面包含局部變量表、操作數棧、動態鏈接等信息,局部變量表中包含基本數據類型、對象引用類型,就是我們所說的棧。方法調用和結束其實是一個棧幀入棧出棧操作
上面三個是線程獨享的

java堆:

這是我們平常所說的堆,幾乎所有的對象實例都存放在這裏,是GC時的重點區域(還有下面提到的方法區)

方法區:

裏面存放的是虛擬機加載得到的類信息,靜態變量,常量和編譯器編譯後的代碼
,其中常量池是方法區的一部分,主要用來存儲類文件結構的裏面相關信息

直接內存:

也稱作本地內存,就是在我們的計算機裏面,爲java虛擬機分配好了一個運行時的主內存,然而每個線程的數據是先存放在這個本地內存上的,通過共享內存的通信機制達到線程間數據同步

內存泄露、溢出

內存泄露、溢出對於學習java虛擬機來講,真的很重要,只有懂了這些基礎,你才能夠知道java虛擬機調優時候爲什麼要那樣做。

內存溢出:說簡單點就是虛擬機分配的內存不夠用了。
內存泄露:主要在堆區發生,表現爲原先創建的應該被回收的對象不夠被虛擬機回收,導致可用的內存變得越來越少

配置虛擬機時爲防止內存溢出的幾個重要參數

1、-xmx表示分配的最大堆內存 -xms表示最小堆內存,如果相等表示不允許虛擬機動態擴展堆內存
2、-xss表示每個線程分配的棧容量,需注意這裏分配越大,越容易出現內存溢出。原因是被堆內存,方法區留下的內存大致很固定了,每個線程分配的棧容量越大,在持續不斷的線程建立過程中,必定導致內存不夠用,可採用的處理方法:用減少內存換取線程
3、-XX:PermSize -MaxPermSize用來設置最大方法區內存

發佈了45 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章