JVM
有自己完善的硬件架构
处理器
堆栈
寄存器
指令系统
屏蔽具体操作系统信息,使得字节码可以在多种平台运行
把字节码解析成机器指令执行
堆内存
稳定的堆
-Xms和-Xmx大小设置一致
减少GC次数
增加每次GC时间
动荡的堆
不需要使用大内存时,压缩堆空间
堆小时GC时间短
可以设置空间最小空闲比例和最大空闲比例来控制堆内存压缩
将新对象预留在年轻代
Full GC 的成本远远高于 Minor GC,某些情况下尽可能将对象分配在年轻代
内存空间不紧张时JVM会尝试在 Eden 区分配对象
内存空间紧张时JVM会将部分年轻代对象提前向老年代压缩
JVM参数调优时分配一个合理的年轻代空间以避免此情况
让大对象进入老年代
大对象出现在年轻代可能扰乱年轻代GC,破坏年轻代原有对象结构
为了有足够空间容纳大对象,JVM不得不将年轻代中的对象挪到老年代
可能会导致移动大量年轻代的小对象到老年代,对GC不利
短命的大对象是GC的灾难,打乱了GC的基本思路,尽量避免使用
设置对象进入老年代的年龄
年轻代的对象经过N次GC(N==年龄)后,进入老年代
对象在 Eden区经历第一次GC后存活的,年龄+1,移动到 Survivor区
吞吐量优先
尽可能减少系统执行垃圾回收的总时间
可考虑关注系统吞吐量的并行回收收集器
示例参数:–Xmx3800m –Xms3800m –Xmn2G –Xss128k –XX:+UseParallelGC 13;13;–XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC
尝试使用大的内存分页
Solaris系统中,JVM可以支持 Large Page Size
使用大的内存分页可以增强 CPU 的内存寻址能力,从而提升性能
过大的内存分页会导致JVM在计算Heap内部分区(perm,new,old)内存占用比例时,出现超出正常值的划分
最坏情况下某个区会多占用一个页的大小
示例:java –Xmx2506m –Xms2506m –Xmn1536m –Xss128k –XX:++UseParallelGC13;13;–XX:ParallelGCThreads=20 –XX:+UseParallelOldGC –XX:+LargePageSizeInBytes=256m
使用非占用的垃圾回收器
降低GC时的停顿
首先考虑使用关注系统停顿的 CMS 回收器
减少 Full GC 次数
尽可能将对象留在年轻代
年轻代 Minor GC 的成本远远小于老年代的 Full GC
示例:java –Xmx3550m –Xms3550m –Xmn2g –Xss128k –XX:ParallelGCThreads=2013;13;–XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=9013;13;–XX:MaxTenuringThreshold=31