標籤:類資訊 大於 相同 動態 異常 儲存 卸載 編譯器 代碼
先貼上一段參數設定
JAVA_OPTS=" $JAVA_OPTS -Dspring.profiles.active=test -DLOG_DIR=/home/work/logs
-Xms2048m -Xmx2048m -Xss1m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=128m
-XX:MaxPermSize=512m -XX:SurvivorRatio=6 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Dfile.encoding=UTF-8"
很多時候,將代碼部署到伺服器,都會對JAVA_OPTS進行一些操作,大多數情況對主要兩個知道是幹嘛的,其實的哪copy的算哪的。
所以,看了點資料,想寫點東西。
Java虛擬機器運行時資料區,主要包括以下部分:方法區、堆,它們是線程共用的部分;虛擬機器棧、本地方法棧、程式計數器。下面我
大概講講如上幾個部分。
1. 程式計數器。 線程自己的資料區,用以記錄當前線程所執行的位元組碼的行號指標,主要用於線上程切換過程中,保證切換後能夠恢複到正確的執行位置,此地區是惟一一個在Java虛擬機器規範中沒有規定任何OOM情況的地區。2. Java虛擬機器棧。 線程獨自擁有,生命週期與線程相同。異常狀況,若線程請求棧深度大於虛擬機器所允許,則StackOverflowError,若虛擬機器棧可動態擴充,在擴充無法申請得到足夠記憶體則OOM。3. 本地方法棧。 相對於虛擬機器棧為虛擬機器執行Java方法服務,本地方法棧則為虛擬機器使到的Native方法服務。為線程私人空間。4. Java堆。 線程共用地區,在虛擬機器啟動時建立,為GC管理的主要區域。可設定為固定或者可擴充大小,由-Xmx和-Xms控制,設定成一樣即為固定。若無空間分配執行個體,且無法擴充,則OOM。5. 方法區。 線程共用,用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的代碼等。此地區也要GC,主要是對常量池回收和對類型的卸載,會有OOM異常。(運行時常量池,用於存放編譯期產生的各種字面量和符號引用,在類載入後儲存,運行期間也可能將新的常量放入池中,如String類的intern()方法)。
PS:此文由看《深入理解Java虛擬機器:JVM進階特性與最佳實務》而來
Java記憶體地區與記憶體溢出異常