1、禁用System.gc(优化gc内存)
因为System.gc会触发full GC,非常耗系统性能,所以要禁用
参数设置:-XX:-DisableExplicitGC,禁用了System.gc()的显示调用
2、开启逃逸分析(优化gc内存)
逃逸分析默认是启用的,可以减少堆内存的使用和减少GC
开启:-XX:+DoEscapeAnalysis
关闭:-XX:-DoEscapeAnalysis
3、同步消除(多线程效率优化)
通过-XX:+EliminateLocks可以开启同步消除
4、标量替换(优化gc内存)
分解大对象实现栈上分配
通过-XX:+EliminateAllocations可以开启标量替换, -XX:+PrintEliminateAllocations查看标量替换情况(Server VM 非Product版本支持)
5、关闭偏向锁优化(线程争用激烈的场景)
偏向锁的概念:一把锁被使用之后不主动释放,保留给当前的使用者,预判等下一个进程来获取的时候再释放出来,
参数设置:
偏向锁关闭: -XX:-UseBiasedLocking
偏向锁开启:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
6、指针压缩(jvm 32G之内有效)
参数设置:
-XX:+UseCompressedOops
7、内联函数优化(通用)
-XX:UseFastAccessorMethods
在jdk6中是开启的,但由于jdk7的server模式默认开启了多层编译,此时在这种多台方法调用时甚至会导致性能下降,所以设置关闭
8、开启服务端模式(通用)
-server
9、提高使用即时编译器的可能性(?)
小方法:写方法时尽量不要写得太大,让JVM尽可能使用即时编译器编译代码
在启动项配置参数-XX:CompileThreshold=10000,使得一个方法被调用超过10000次以后使用即时编译器编译为机器码
10、将新对象预留在年轻代(通用)
参数设置:
-XX:TargetSurvivorRatio=90
90表示让新生代的from区的利用率为90%,这样新对象进来就会优先在里面
11、让大对象进入年老代(通用)
参数设置:
-XX:PetenureSizeThreshold=1000000,1M
大小为1M的对象为大对象
12、设置对象进入年老代的年龄(通用)
参数设置:
-XX:MaxTenuringThreshold=31
表示在新生代经过31次回收以后还存活的对象移到老年代,默认值是15,设置31的目的是让对象尽可能的在新生代就被回收,避免进入老年代触发full GC
13、稳定的 Java 堆(通用)
参数设置:
Xmx与Xms相同
最小堆内存和最大堆内存设置为一样的目的是避免频繁的向操作系统申请内存占用系统资源
14、增大吞吐量提升系统性能(通用)
指设置合理的垃圾回收器
参数设置:
– X X : + U s e P a r a l l e l G C :年轻代使用多线程的收集器
–XX:+UseParallelOldGC:老年代使用多线程的垃圾收集器
–XX:ParallelGC-Threads(CPU核心数相等):设置垃圾回收时使用的线程数
15、使用非占有的垃圾回收器(通用)
参数设置:
–XX:+UseConcMarkSweepGC:使用CMS垃圾回收器
-XX:+UseG1GC:使用g1
16、TLAB(多线程内存管理)
-XX:+UseTLAB开启TLAB,默认是开启的
缺省情况下仅占有整个Eden空间的1%,当然可以通过选项
-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。
如果想要禁用自动调整TLAB的大小,可以使用-XX:-ResizeTLAB禁用ResizeTLAB,并使用-XX:TLABSize手工指定一个TLAB的大小。
-XX:+PrintTLAB可以跟踪TLAB的使用情况。一般不建议手工修改TLAB相关参数,推荐使用虚拟机默认行为。
17、元空间控制(JDK8)
-XX:MaxMetaspaceSize=100M
限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。