要明⽩⼀点,所有的调优的⽬的都是为了⽤更⼩的硬件成本达到更⾼的吞吐,JVM的调优也是⼀样,通过对垃圾收集器和内存分配的调优达到性能的最佳。
简单的参数含义
⾸先,需要知道⼏个主要的参数含义。
eden1. -Xms设置初始堆的⼤⼩,-Xmx设置最⼤堆的⼤⼩
2. -XX:NewSize年轻代⼤⼩,-XX:MaxNewSize年轻代最⼤值,-Xmn则是相当于同时配置XX:NewSize和-XX:MaxNewSize为⼀样的值
3. -XX:NewRatio设置年轻代和年⽼代的⽐值,如果为3,表示年轻代与⽼年代⽐值为1:3,默认值为2
4. -XX:SurvivorRatio年轻代和两个Survivor的⽐值,默认8,代表⽐值为8:1:1
5. -XX:PretenureSizeThreshold 当创建的对象超过指定⼤⼩时,直接把对象分配在⽼年代。
6. -XX:MaxTenuringThreshold设定对象在Survivor复制的最⼤年龄阈值,超过阈值转移到⽼年代
7. -XX:MaxDirectMemorySize当Direct ByteBuffer分配的堆外内存到达指定⼤⼩后,即触发Full GC
调优
1. 为了打印⽇志⽅便排查问题最好开启GC⽇志,开启GC⽇志对性能影响微乎其微,但是能帮助我们快速排查定位问题。-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log
2. ⼀般设置-Xms=-Xmx,这样可以获得固定⼤⼩的堆内存,减少GC的次数和耗时,可以使得堆相对稳定
3. -XX:+HeapDumpOnOutOfMemoryError让JVM在发⽣内存溢出的时候⾃动⽣成内存快照,⽅便排查问题
4. -Xmn设置新⽣代的⼤⼩,太⼩会增加YGC,太⼤会减⼩⽼年代⼤⼩,⼀般设置为整个堆的1/4到1/3
5. 设置-XX:+DisableExplicitGC禁⽌系统System.gc(),防⽌⼿动误触发FGC造成问题
网友评论