一個性能較好的JVM參數配置

一個性能較好的web服務器jvm參數配置:html

-server//服務器模式
-Xmx2g //JVM最大容許分配的堆內存,按需分配
-Xms2g //JVM初始分配的堆內存,通常和Xmx配置成同樣以免每次gc後JVM從新分配內存。
-Xmn256m //年輕代內存大小,整個JVM內存=年輕代 + 年老代 + 持久代
-XX:PermSize=128m //持久代內存大小
-Xss256k //設置每一個線程的堆棧大小
-XX:+DisableExplicitGC //忽略手動調用GC, System.gc()的調用就會變成一個空調用,徹底不觸發GC
-XX:+UseConcMarkSweepGC //併發標記清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //下降標記停頓
-XX:+UseCMSCompactAtFullCollection //在FULL GC的時候對年老代的壓縮
-XX:LargePageSizeInBytes=128m //內存頁的大小
-XX:+UseFastAccessorMethods //原始類型的快速優化
-XX:+UseCMSInitiatingOccupancyOnly //使用手動定義初始化定義開始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms做爲垃圾回收使用70%後開始CMS收集java

說明:web

-Xmn和-Xmx之比大概是1:9,若是把新生代內存設置得太大會致使young gc時間較長算法

一個好的Web系統應該是每次http請求申請內存都能在young gc回收掉,full gc永不發生,固然這是最理想的狀況服務器

xmn的值應該是保證夠用(夠http併發請求之用)的前提下設置得儘可能小多線程

web服務器和遊戲服務器的配置思路不太同樣,最重要的區別是對遊戲服務器的xmn即年輕代設置比較大,和Xmx大概1:3的關係,由於遊戲服務器通常是長鏈接,在保持必定的併發量後須要較大的年輕代堆內存,若是設置得大小了會常常引起young gc併發

對JVM的簡介jvm

一個性能較好的jvm參數配置以及jvm的簡介

由上圖能夠看出JVM堆內存的分類狀況,JVM內存被分紅多個獨立的部分。函數

普遍地說,JVM堆內存被分爲兩部分——年輕代(Young Generation)和老年代(Old Generation)。性能

年輕代

年輕代是全部新對象產生的地方。當年輕代內存空間被用完時,就會觸發垃圾回收。這個垃圾回收叫作Minor GC。年輕代被分爲3個部分——Enden區和兩個Survivor區。

年輕代空間的要點:

大多數新建的對象都位於Eden區。

當Eden區被對象填滿時,就會執行Minor GC。並把全部存活下來的對象轉移到其中一個survivor區。

Minor GC一樣會檢查存活下來的對象,並把它們轉移到另外一個survivor區。這樣在一段時間內,總會有一個空的survivor區。

通過屢次GC週期後,仍然存活下來的對象會被轉移到年老代內存空間。一般這是在年輕代有資格提高到年老代前經過設定年齡閾值來完成的。

年老代

年老代內存裏包含了長期存活的對象和通過屢次Minor GC後依然存活下來的對象。一般會在老年代內存被佔滿時進行垃圾回收。老年代的垃圾收集叫作Major GC。Major GC會花費更多的時間。

Stop the World事件

全部的垃圾收集都是「Stop the World」事件,由於全部的應用線程都會停下來直到操做完成(因此叫「Stop the World」)。

由於年輕代裏的對象都是一些臨時(short-lived )對象,執行Minor GC很是快,因此應用不會受到(「Stop the World」)影響。

因爲Major GC會檢查全部存活的對象,所以會花費更長的時間。應該儘可能減小Major GC。由於Major GC會在垃圾回收期間讓你的應用反應遲鈍,因此若是你有一個須要快速響應的應用發生屢次Major GC,你會看到超時錯誤。

垃圾回收時間取決於垃圾回收策略。這就是爲何有必要去監控垃圾收集和對垃圾收集進行調優。從而避免要求快速響應的應用出現超時錯誤。

永久代

永久代或者「Perm Gen」包含了JVM須要的應用元數據,這些元數據描述了在應用裏使用的類和方法。注意,永久代不是Java堆內存的一部分。

永久代存放JVM運行時使用的類。永久代一樣包含了Java SE庫的類和方法。永久代的對象在full GC時進行垃圾收集。

方法區

方法區是永久代空間的一部分,並用來存儲類型信息(運行時常量和靜態變量)和方法代碼和構造函數代碼。

內存池

若是JVM實現支持,JVM內存管理會爲建立內存池,用來爲不變對象建立對象池。字符串池就是內存池類型的一個很好的例子。內存池能夠屬於堆或者永久代,這取決於JVM內存管理的實現。

運行時常量池

運行時常量池是每一個類常量池的運行時表明。它包含了類的運行時常量和靜態方法。運行時常量池是方法區的一部分。

Java棧內存

Java棧內存用於運行線程。它們包含了方法裏的臨時數據、堆裏其它對象引用的特定數據。

Java垃圾回收

Java垃圾回收會找出沒用的對象,把它從內存中移除並釋放出內存給之後建立的對象使用。Java程序語言中的一個最大優勢是自動垃圾回收,不像其餘的程序語言那樣須要手動分配和釋放內存,好比C語言。

垃圾收集器是一個後臺運行程序。它管理着內存中的全部對象並找出沒被引用的對象。全部的這些未引用的對象都會被刪除,回收它們的空間並分配給其餘對象。

一個基本的垃圾回收過程涉及三個步驟

標記:這是第一步。在這一步,垃圾收集器會找出哪些對象正在使用和哪些對象不在使用。

正常清除:垃圾收集器清會除不在使用的對象,回收它們的空間分配給其餘對象。

壓縮清除:爲了提高性能,壓縮清除會在刪除沒用的對象後,把全部存活的對象移到一塊兒。這樣能夠提升分配新對象的效率。

簡單標記和清除方法存在兩個問題:

效率很低。由於大多數新建對象都會成爲「沒用對象」。

通過屢次垃圾回收週期的對象頗有可能在之後的週期也會存活下來。

上面簡單清除方法的問題在於Java垃圾收集的分代回收的,並且在堆內存裏有年輕代和年老代兩個區域。

Java垃圾回收類型

這裏有五種能夠在應用裏使用的垃圾回收類型。

僅須要使用JVM開關就能夠在咱們的應用裏啓用垃圾回收策略。

Serial GC(-XX:+UseSerialGC):Serial GC使用簡單的標記、清除、壓縮方法對年輕代和年老代進行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客戶端模式)頗有用,好比在簡單的獨立應用和CPU配置較低的機器。這個模式對佔有內存較少的應用很管用。

Parallel GC(-XX:+UseParallelGC):除了會產生N個線程來進行年輕代的垃圾收集外,Parallel GC和Serial GC幾乎同樣。這裏的N是系統CPU的核數。咱們可使用 -XX:ParallelGCThreads=n 這個JVM選項來控制線程數量。並行垃圾收集器也叫throughput收集器。由於它使用了多CPU加快垃圾回收性能。Parallel GC在進行年老代垃圾收集時使用單線程。

Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC同樣。不一樣之處,Parallel Old GC在年輕代垃圾收集和年老代垃圾回收時都使用多線程收集。

併發標記清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被稱爲短暫停頓併發收集器。它是對年老代進行垃 圾收集 的。CMS收集器經過多線程併發進行垃圾回收,儘可能減小垃圾收集形成的停頓。CMS收集器對年輕代進行垃圾回收使用的算法和Parallel收集器同樣。 這個垃圾收集器適用於不能忍受長時間停頓要求快速響應的應用。可以使用 -XX:ParallelCMSThreads=n JVM選項來限制CMS收集器的線程數量。

G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7後纔可使用的特性,它的長遠目標時代替CMS收集器。G1收集器是一個並行的、併發的和增量式壓縮短暫停頓的垃圾收集器。G1收集器和其餘的收集器運 行方式不同,不區分年輕代和年老代空間。它把堆空間劃分爲多個大小相等的區域。當進行垃圾收集時,它會優先收集存活對象較少的區域,所以叫 「Garbage First」。

相關文章
相關標籤/搜索