Java性能優化之針對分代垃圾回收調整java
[TOC]算法
JVM內存的系統級的調優主要的目的是減小Minor GC的頻率和Full GC的次數,過多的Minor GC和Full GC是會佔用不少的系統資源,影響系統的吞吐量。性能優化
-XXSurvivorRatio
調整比例做用:默認-XX:SurvivorRatio=8,表示Survivor區與Eden區的大小比值是1:1:8,性能
在MinorGC過程,若是survivor空間不夠大,不可以存儲全部的從eden空間和from suvivor空間複製過來活動對象,溢出的對象會被複制到old代,優化
溢出遷移到old代,會致使old代的空間快速增加。操作系統
做用:能夠經過設置-XX:PreTenureSizeThreShold
大小,令大於這個值的對象直接保存到年老代,避免在Eden區與Survivor區之間頻繁地經過複製算法回收內存線程
做用:Minor默認15次,可經過-MaxTenuringThreshold
參數調全年輕代回收次數,防止對象過早進入年老代,下降年老代溢出的可能性code
-XX:NewRatio
的大小設置年輕和年老的比例。做用:默認-XX:NewRatio=2
,即young:tenured=1:2
,適當調全年輕代大小,能夠必定層度上較少Full GC出現的機率對象
-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)
:指定JVM的初始和最大堆內存大小,兩值能夠設置相同,以免每次垃圾回收完成後JVM從新分配內存。-Xmn
:設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。-Xss
:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。-XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath
:讓JVM在發生內存溢出時自動的生成堆內存快照(堆內存快照文件有可能很龐大,推薦將堆內存快照生成路徑指定到一個擁有足夠磁盤空間的地方。)-XX:OnOutOfMemoryError
:當內存溢發生時,咱們甚至能夠能夠執行一些指令,好比發個E-mail通知管理員或者執行一些清理工做($ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp)-XX:PermSize and -XX:MaxPermSize
:設置永久代大小的初始值和最大值(默認:最小值爲物理內存的1/64,最大值爲物理內存的1/16,永久代在堆內存中是一塊獨立的區域,這裏設置的永久代大小並不會被包括在使用參數-XX:MaxHeapSize 設置的堆內存大小中)-XX:PretenureSizeThreshold
:令大於這個設置值的對象直接在老年代分配。這樣作的目的是避免在Eden區及兩個Survivor區之間發生大量的內存複製