1. 程式人生 > >jvm內存模型及分配參數

jvm內存模型及分配參數

java pat 技術分享 下一條 ava 最大值 images overflow wsize

jvm內存模型

  1. 程序計數器:是一塊很小的內存空間。當線程數量超過cpu數量時,線程之間根據時間片輪詢搶奪cpu資源。每一個線程都必須用一個獨立的程序計數器,用於記錄下一條要運行的指令。
  2. java虛擬機棧(線程棧 ):也是線程私有內存空間,他和java線程在同一時間創建,他保存方法的局部變量、部分結果,並參與方法的調用和返回。如果線程在計算過程中,請求的棧深度大於最大可用的棧深度,則拋出StackOverflowError;如果java棧可以動態擴展,而在擴展的過程中,操作系統沒有足夠的內存空間來支持棧的擴展,則拋出OutOfMemoryError;——參數設置參見《設置線程棧 》
  3. 本地方法棧
    :用於管理本地方法的調用,本地方法是使用C實現的。
  4. java堆:堆空間分為新生代和老年代。新生代用於存放產生的新對象,老年代用於存放年長的對象(存在 時間較長,經過垃圾回收次數較多的對象)。新生代又可以細分為eden,s0和s1,eden大部分對象剛建立時,通常放在這裏。s0和s1為survivor空間,也就是說存放其中的對象至少經歷了一次垃圾回收,並得以幸存。如果幸存區的對象到了指定的年齡仍未被回收,則有機會進入老年代。
  5. 方法區:與堆空間類似,也是被jvm的所有線程共享的,主要保存的是類的類型信息、常量池、域信息、方法信息等元數據。

技術分享

技術分享

設置最大、最小堆內存

  1. 用-Xmx指定最大堆內存,最大堆內存指的是新生代和老年代的大小之和的最大值,它是java應用程序的堆上線。
  2. 用-Xms指定最小堆內存,也就是jvm啟動時,所占據的操作系統內存大小。
  3. 當-Xms指定的內存大小確實無法滿足應用程序是,jvm才會向操作系統申請更多的內存,直至達到-Xmx指定的內存大小為止。 如果-Xms的數值較小,那麽jvm為了保證系統盡可能的在指定內存範圍內運行,就會頻繁的進行gc操作,以釋放失效的內存空間,從而,會增加Minor GC和Full GC的次數,對系統性能產生一定影響。所以,把-Xms值設置為-Xmx時,可以在系統運行初期減少gc的次數和耗時

設置線程棧

  1. 線程棧是線程的一塊私有空間,可以用-Xss設置線程棧的大小,棧的大小直接決定了函數調用的可達深度。
  2. 在線程中進行局部變量分配,函數調用時,都需要在棧中開辟空間。
  3. 如果棧的空間分配太小,那麽線程在運行時,可能沒有足夠的空間分配局部變量或者達不到足夠的函數調用深度,導致程序異常退出;如果棧空間過大,那麽開設線程所需的內存成本就會上升,系統所能支持的線程總數就會下降。
  4. java堆和線程棧都是像操作系統申請內存空間,如果堆空間過大,就會導致操作系統可用於線程棧的內存減小,當系統由於內存不夠而無法創建新的線程時,會拋出OOM異常(註意這個OOM不是堆內存不足)。所以,如果系統確實需要大量線程並發執行,那麽設置一個較小的堆和較小的棧,有助於提高系統所能承受的最大線程數

設置新生代

  1. 用-Xmn指定新生代的大小,新生代的大小一般設置為整個堆空間的1/4到1/3。設置一個較大或較小的新生代對系統性能已經gc行為有很大影響。
  2. 使用-XX:NewSize設置新生代的初始大小,-XX:MaxNewSize設置新生代的最大值。通常情況下只設置-Xmn即可滿足需要。

設置持久代

  1. 持久代(方法區)不屬於堆得一部分,使用-XX:MaxPermSize設置持久代最大值,使用-XX:PermSize設置持久代最小值。
  2. 持久代的大小直接決定了系統可以支持多少個類定義和多少常量。
  3. 一般MaxPermSize設置為64M或128M。

取得堆快照(堆dump)

  使用-XX:+HeapDumpOnOutOfMemoryError參數在程序發生OOM時,導出應用程序的當前堆快照。   通過參數-XX:HeapDumpPath可以指定堆快照的保存位置。

jvm內存模型及分配參數