JVM原理之內存分配參數

調優目標

  1. 應用程序的請求量很大時,容易造成頻繁的full gc。full gc頻繁會導致java應用出現停頓。
  2. JVM調優主要從年輕代,老年代,永久代等方面去調整參數,同時需要掌握JVM內存管理機制,設置符合自己應用的參數值。

JVM參數-最大堆內存

  1. JVM最大堆內存是指年輕代與老年代的大小之和,是應用程序中堆大小的上限。
  2. 在JVM中,通過-Xmx參數設置堆的最大值。
  3. 在應用程序中,通過Runtime.getRuntime().maxMemory()取得最大堆值大小。

JVM參數-最小堆內存

  1. JVM堆最小值是指java應用程序在啓動時,JVM分配給堆的內存空間,也是佔據操作系統內存空間的大小。
  2. java應用程序會盡量保證在-Xms指定的空間中運行程序。當-Xms申請的空間不夠用時,JVM會向操作系統申請內存空間,直至到最大內存空間爲止(-Xmx指定的數值)
  3. 如果JVM堆最小值設置過小,則JVM會頻繁進行Min gc,同時增加Full gc的次數,會影響應用程序的性能。
  4. 通過-Xms設置JVM堆內存的最小值。

實際設置建議

  1. 增大-Xms的數值,可以減少觸發Full gc的次數。最好將-Xmx和-Xms的數值設置成一樣大,可以減少內存申請帶來的伸縮壓力和減少GC的次數。

JVM參數-新生代

  1. JVM中通過-Xmn可以設置新生代大小。新生代設置的大小對應用的性能和GC行爲有很大影響。新生代大小一般設置爲整個堆空間的1/4到1/5。
  2. 在HotSpot虛擬機中,-XX:NewSize設置新生代的初始大小;-XX:MaxNewSize設置新生代的最大值。
  3. 如果只是設置了-Xmn,則表明-XX:NewSize和-XX:MaxNewSize大小設置相同。在實際應用中,新生代的最小值和最大值要設置相同,減少內存申請帶來的動盪。

JVM參數-持久代

  1. 持久代也就是方法區,不屬於堆的部分。持久代的大小決定了系統可以容納多少個類的定義和常量。
  2. 通過-XX:PermSize設置持久代的最小值,-XX:MaxPermSize設置持久代的最大值。
  3. 實際應用中,通常將-XX:PermSize和-XX:MaxPermSize設置同樣的大小
  4. 通常持久代設置爲64M,128M,也有設置256M或者更大,要根據應用程序特點靈活設置

JVM參數-線程棧

  1. 線程棧屬於線程私有的,主要是方法執行時,創建棧幀。
  2. JVM通過-Xss參數設置線程棧的大小。
  3. 線程棧設置太小,容易造成線程異常退出。線程棧設置太大,造成線程成本上升,對系統的吞吐量有影響。
  4. 線程棧,java堆,方法區都要佔用操作系統內存空間。如果線程棧設置過大,操作系統物理內存空間是有限的,每增加一個線程請求,就要額外向OS申請內存空間。所以線程棧不能設置太大,同時,java堆也不要設置過大,滿足應用性能即可。
  5. 如果堆內存設置過大,同時系統併發量又很大,容易造成線程空間不足,造成內存溢出,OutOfMemoryError。
  6. 高併發的應用中,設置一個較小的線程棧和較小的堆空間。

JVM參數-堆比例分配

  1. 在JVM中,堆分爲主要分爲老年代,年輕代。其中,年輕代又分爲Eden區,from surivior(s0)和to surivior (s1)三部分。在應用中,年輕代與老年代的分配比例是多少,是比較合適的呢?或者通過什麼方式可以調整年輕代與老年代的比例?
  2. 對於年輕代堆,from surivior和to surivior空間是1:1大小。可以通過參數-XX:SuriviorRatio設置年輕代中Eden區與from surivior的比例關係。其中so和s1職能相同,大小相同,Minor gc後,互換角色。
    2.1. 例如:-Xmn10M -XX:SurvivorRatio=8,即Eden佔據80%的年輕代空間,大小爲8M。so,s1都是1M。
  3. 參數-XX:NewRatio 可以用來設置老年代與年輕代的比例。即-XX:NewRatio=老年代/年輕代
    3.1. 例如,-XX:+PrintGCDetails -XX:NewRatio=2 -XX:Xmx20M -XX:Xms20M。 則表明老年代與年輕代比例爲2:1,則年輕代空間爲20*(1/1+2)=6M。

JVM參數-堆分配參數總結

  1. -Xms:設置最小堆值
  2. -Xmx:設置最大堆值
  3. -Xmn:設置年輕代值(設置它等於最小值和最大值相同)
  4. -XX:NewSize:設置年輕代最小值
  5. -XX:MaxNewSize:設置年輕代最大值
  6. -Xss:設置線程棧值大小
  7. -XX:PermSize:設置永久代最小值
  8. -XX:MaxPermSize:設置永久代最大值
  9. -XX:SuriviorRatio:設置年輕代中Eden與s0的比例
  10. -XX:NewRatio:設置老年代與年輕代的比例。
  11. -XX:MinHeapFreeRatio:設置堆空間最小空閒比例。當堆空間的空閒比例小於這個數值時,JVM變主動申請內存空間。
  12. -XX:MaxHeapFreeRation:設置堆空間最大空閒比例。當堆空間的空閒比例大於這個數值時,JVM會壓縮堆空間,得到一個較小的堆空間。
  13. -XX:TargetSuriviorRatio:設置surivior空間使用率,當surivior空間使用率達到這個數值時,會將對應的對象送入老年代。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章