Java性能優化之性能調優經常使用參數設置

Java性能優化之針對分代垃圾回收調整java

[TOC]算法


JVM內存的系統級的調優主要的目的是減小Minor GC的頻率和Full GC的次數,過多的Minor GC和Full GC是會佔用不少的系統資源,影響系統的吞吐量。性能優化

針對分代垃圾回收調整部分參數

  • 年輕代分三個區,一個Eden區,兩個Survivor區(from和to區),能夠經過-XXSurvivorRatio調整比例

    做用:默認-XX:SurvivorRatio=8,表示Survivor區與Eden區的大小比值是1:1:8,性能

    在MinorGC過程,若是survivor空間不夠大,不可以存儲全部的從eden空間和from suvivor空間複製過來活動對象,溢出的對象會被複制到old代,優化

    溢出遷移到old代,會致使old代的空間快速增加。操作系統

  • 大部分對象在先在Eden區中申請內存

    做用:能夠經過設置-XX:PreTenureSizeThreShold大小,令大於這個值的對象直接保存到年老代,避免在Eden區與Survivor區之間頻繁地經過複製算法回收內存線程

  • 當Eden區滿時,沒法爲新的對象分配內存時,會進行Minor GC對其回收無用對象佔用的內存,若是還有存活對象,則將存活的對象複製到Survivor From區(兩個中Survivor對稱);而後從Eden區存活下來的對象,就會被複制到From,當這個From區滿時,此區的存活對象將被複制到To區,接下來Eden區存活下來的對象就會被複制到To區,經歷必定的次數Minor GC後,還存活的對象,將被複制「年老區(Tenured)」。

    做用:Minor默認15次,可經過-MaxTenuringThreshold參數調全年輕代回收次數,防止對象過早進入年老代,下降年老代溢出的可能性code

  • 年輕代和年老代的默認比例爲1:2,即年輕代佔堆內存的1/3,年老代佔2/3,可調整-XX:NewRatio的大小設置年輕和年老的比例。

    做用:默認-XX:NewRatio=2,即young:tenured=1:2,適當調全年輕代大小,能夠必定層度上較少Full GC出現的機率對象

其他性能調優經常使用參數設置

  1. -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize):指定JVM的初始和最大堆內存大小,兩值能夠設置相同,以免每次垃圾回收完成後JVM從新分配內存。
  2. -Xmn:設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
  3. -Xss:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。
  4. -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath:讓JVM在發生內存溢出時自動的生成堆內存快照(堆內存快照文件有可能很龐大,推薦將堆內存快照生成路徑指定到一個擁有足夠磁盤空間的地方。)
  5. -XX:OnOutOfMemoryError:當內存溢發生時,咱們甚至能夠能夠執行一些指令,好比發個E-mail通知管理員或者執行一些清理工做($ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp)
  6. -XX:PermSize and -XX:MaxPermSize:設置永久代大小的初始值和最大值(默認:最小值爲物理內存的1/64,最大值爲物理內存的1/16,永久代在堆內存中是一塊獨立的區域,這裏設置的永久代大小並不會被包括在使用參數-XX:MaxHeapSize 設置的堆內存大小中)
  7. -XX:PretenureSizeThreshold :令大於這個設置值的對象直接在老年代分配。這樣作的目的是避免在Eden區及兩個Survivor區之間發生大量的內存複製
相關文章
相關標籤/搜索