JVM性能调优2JVM性能调优参数整理文档格式.docx
《JVM性能调优2JVM性能调优参数整理文档格式.docx》由会员分享,可在线阅读,更多相关《JVM性能调优2JVM性能调优参数整理文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
默认32模式
4
-hotspot
在Hotspot类型的JVM中缺省使用,缺省为ClientHotspot模式。
默认client模式
5
-Xmixed
JVM执行模式的设置参数,混合模式即支持Hotspot即时编译的运行模式.
支持Hotspot的JVM缺省都是运行于混合模式的。
默认混合模式
-Xcomp
JVM优先以编译模式运行,不能编译的,以解释模式运行。
6
-Xint
设置JVM的执行模式为解释执行模式,纯解释执行的JVM对多数应用来说基本上时没有意义的,仅仅可能会在一些嵌入式系统中应用
7
内存分配相关参数
8
-Xms<
size>
设置JVM启动时初始内存堆的大小
1.6
物理内存的1/64.
9
-Xmx<
设置JVM启动后动态申请堆内存的最大堆空间
MIN(物理内存的1/4,1G)
10
-Xmn<
为新生代分配的内存大小。
和cpu核数相关,建议1core对应512M,不超过1G。
11
-Xss<
设置JVM线程栈的空间最大值。
当设置值小于64K时,用默认值。
12
-XX:
ThreadStackSize=512
每个线程栈大小(K),等于0时表示使用缺省值
Sparc:
512K,SolarisIntel:
256K,Sparc64bit:
1024其他的都为0
13
NewRatio=2
新生代内存容量与老生代内存容量的比例。
Ratioofnew/oldgenerationsizes.Thedefaultvalueis2.
Client模式默认8,Server模式:
14
MaxNewSize=size
Maximumsizeofnewgeneration(inbytes).Since1.4,MaxNewSizeiscomputedasafunctionofNewRatio.[1.3.1Sparc:
32m;
1.3.1x86:
2.5m.]
15
NewSize=2m
新生代预估默认值。
Defaultsizeofnewgeneration(inbytes)[5.0andnewer:
64bitVMsarescaled30%larger;
x86:
1m;
x86,5.0andolder:
640k]
2228K
16
SurvivorRatio=64
存活区和eden区所占的比率:
2:
64。
Ratioofeden/survivorspacesize.
32
17
PermSize=256m
为持久代分配的初始化内存空间。
18
MaxPermSize=256m
为持久代分配的最大内存空间。
client/server:
64M
19
MaxTenuringThreshold=30
每次垃圾收集在新生代之间Copy的次数,超过该次数则移至Old区。
Maximumvaluefortenuringthreshold.Thedefaultvalueis15.
Thedefaultvalueis15fortheparallelcollectorandis4forCMS.
20
TargetSurvivorRatio=50
该值是一个百分比,控制允许使用的生存区空间的比例。
该参数设置较大的话可提高对survivor空间的使用率。
默认值是50。
即占到50%,则执行Copy策略。
21
PretenureSizeThreshold=64K
当申请内存的对象超过该值时,直接在old区分配。
默认值是0,即所有的对象都在Eden区分配。
22
MaxHeapFreeRatio=size
JVM中堆空间的最大预估值空闲百分比。
GC进行垃圾收集时后,如果预估值堆空闲空间超过预定值,收缩预估值内存。
默认值70
23
MinHeapFreeRatio=size
JVM中堆空间的最小预估值空闲百分比。
GC进行垃圾收集后,堆空间不得低于预定值,增加分配的内存。
默认值40
MaxDirectMemorySize=size
直接内存最大值。
即NIO进行操作时,可以分配的最大缓存值,默认和heap最大值一致。
默认和heap最大值一致。
24
JVM优化
25
CompileThreshold=10000
设置方法是否进行即时编译的调用次数的下限值。
调用次数超过设定值,进行JIT编译。
-server选项的缺省值为10000,-client选项的缺省值为1500
+BackgroundCompilation
后台启用jit编译
26
-CITime
设置Hotspot的一次即时编译所需要的最大时间
27
+AggressiveOpts
启用激进的编译优化
JDK5update6后引入,但需要手动启用。
JDK6默认启用。
28
+UseFastAccessorMethods
原始类型的快速优化,get,set方法转成本地代码。
29
+DoEscapeAnalysis
增加逃逸分析。
如果对象的指针未出创建者的方法体,该对象在线程栈内直接分配空间。
30
+DisableExplicitGC
屏蔽程序主动垃圾收集的函数system.gc()
31
FreqInlineSize=size
限制经常使用的动态编译的函数的虚拟机指令的最大数量,
+UseLargePages
启用大内存分页。
注意操作系统需支持。
关联参数:
LargePageSizeInBytes=4m
33
设置堆内存的内存页大小。
默认4K。
34
+UseBiasedLocking
启用偏向锁。
35
+UseSpinning
启用多线程自旋锁优化。
自旋锁优化原理
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。
原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
互斥是一种会导致线程挂起,并在较短的时间内又必须重新调度回原线程的,较为消耗资源的操作。
为了避免进入OS互斥,Java6的开发者们提出了自旋锁优化。
自旋锁优化的原理是在线程进入OS互斥前,通过CAS自旋一定的次数来检测锁的释放。
如果在自旋次数未达到预设值前锁已被释放,则当前线程会立即持有该锁。
java1.4.2和1.5需要手动启用,java6默认已启用
36
PreBlockSpin=10
控制多线程自旋锁优化的自旋次数。
(什么是自旋锁优化?
见-XX:
+UseSpinning处的描述)
关联选项:
java6来说已经默认启用了,这里默认自旋10次
37
+UseSplitVerifier
使用新的Class类型校验器。
新Class类型校验器有什么特点?
新Class类型校验器,将老的校验步骤拆分成了两步:
1,类型推断。
2,类型校验。
新类型校验器通过在javac编译时嵌入类型信息到bytecode中,省略了类型推断这一步,从而提升了classloader的性能。
Classload顺序(供参考)
load->
verify->
prepare->
resove->
init
+FailOverToOldVerifier
java5默认不启用
java6默认启用
38
如果新的Class校验器检查失败,则使用老的校验器。
为什么会失败?
因为JDK6最高向下兼容到JDK1.2,而JDK1.2的classinfo与JDK6的info存在较大的差异,所以新校验器可能会出现校验失败的情况。
Java6新引入选项,默认启用
39
+HandlePromotionFailure
关闭新生代收集担保。
在一次理想化的minorgc中,Eden和FirstSurvivor中的活跃对象会被复制到SecondSurvivor。
然而,SecondSurvivor不一定能容纳下所有从E和F区copy过来的活跃对象。
为了确保minorgc能够顺利完成,GC需要在年老代中额外保留一块足以容纳所有活跃对象的内存空间。
这个预留操作,就被称之为新生代收集担保(NewGenerationGuarantee)。
如果预留操作无法完成时,仍会触发majorgc(fullgc)。
为什么要关闭新生代收集担保?
因为在年老代中预留的空间大小,是无法精确计算的。
为了确保极端情况的发生,GC参考了最坏情况下的新生代内存占用,即Eden+FirstSurvivor。
这种策略无疑是在浪费年老代内存,从时序角度看,还会提前触发FullGC。
为了避免如上情况的发生,JVM允许开发者手动关闭新生代收集担保。
在开启本选项后,minorgc将不再提供新生代收集担保,而是在出现survior或年老代不够用时,抛出promotionfailed异常。
java5以前是默认不启用,java6默认启用
40
+UseTLAB
启用线程本地缓存区(ThreadLocal)。
1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用