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区之间发生大量的内存复制