JVM内存调优过程
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。
使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。
- 监控GC的状态,使用各种JVM工具,查看当前日志,并且分析当前堆内存快照和gc日志,根据实际的情况看是否需要优化。
- 通过JMX的MBean或者Java的jmap生成当前的Heap信息,并使用Visual VM或者Eclipse自带的Mat分析dump文件
- 如果参数设置合理,没有超时日志,GC频率GC耗时都不高则没有GC优化的必要,如果GC时间超过1秒或者频繁GC,则必须优化
- 调整GC类型和内存分配,使用1台和多台机器进行测试,进行性能的对比。再做修改,最后通过不断的试验和试错,分析并找到最合适的参数
JVM 几个重要的参数:
-Xmx4g -Xms4g -Xss256k
-XX:MaxPermSize=128m
-XX:NewRatio=2 新生代(Eden + 2*S)与老年代(不包括永久区)的比值,比如值为2,则Old Generation:Yong Generation = 2:1,即Yong Generation占据内存的1/3,一般情况下,不允许-XX:NewRatio值小于1,即Old要比Yong大。
-XX:SurvivorRatio=8 Survivor区和Eden区的比值8:1
-XX:Newsize : 设置Yong Generation的初始值大小
-XX:Maxnewsize:设置Yong Generation的最大值大小
-XX:+UseParallelGC 指定在 New Generation 使用 parallel collector, 并行收集 , 暂停 app threads, 同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用 . 系统吨吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc。UseParallelGC是jdk1.7选择parallel 回收器默认开启的。
-XX:+UseParNewGC 指定在 New Generation 使用 parallel collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能或者优点 , 可以和 CMS gc 一起使用。UseParNewGC需要用户自己手动开启。
-XX:ParallelGCThreads=8 并行收集线程数,如果没有设置该参数,jvm会默认设置成online的cpu的核数但并不包括被shutdown的cpu的核数。
-XX:LargePageSizeInBytes=128m 内存页的大小, 不可设置过大, 会影响Perm的大小。
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+Disable‘’ExplicitGC 关闭System.gc();
可以配合使用的收集器类型
| 新生代(别名) | 老年代(别名) | JVM参数 |
|---|---|---|
| Serial (DefNew) | Serial Old(PSOldGen) | -XX:+UseSerialGC |
| Parallel Scavenge (PSYoungGen) | Serial Old(PSOldGen) | -XX:+UseParallelGC |
| Parallel Scavenge (PSYoungGen) | Parallel Old (ParOldGen) | -XX:+UseParallelOldGC |
| ParNew (ParNew) | Serial Old(PSOldGen) | -XX:-UseParNewGC |
| ParNew (ParNew) | CMS+Serial Old(PSOldGen) | -XX:+UseConcMarkSweepGC |
| G1 | G1 | -XX:+UseG1GC |
JDK1.8默认使用的是 Parallel Scavenge (新生代) 和 Parallel Old (老年代)