JVM性能调优

来源:互联网 发布:sdn会取代那些传统网络 编辑:程序博客网 时间:2024/06/06 05:33

JDK自带的jvm调优工具jvisuaLVM

Java VisualVM默认的插件中心网址已关闭服务,已经把服务迁移到github,可以进入这个网址https://visualvm.github.io/pluginscenters.html查询不同JDK版本对应的插件下载地址,再把java VisualVM插件中的设置里的插件中心地址改成对应的下载地址即可。
这里写图片描述

配置

eclipse配置文件eclipse.ini,添加

-Xms256m 最小堆内存
-Xmx1024m 最大堆内存

eclipse配置文件eclipse.ini,打印出gc日志

-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:F:\android\eclipse3.18\eclipse\gc\gc.log

重启eclispe在gc.log会打印出gc日志
这里写图片描述
我们拿上面一条GC出来分析,如

2017-07-19T21:40:40.432+0800: 18.498: [GC (GCLocker Initiated GC) [PSYoungGen: 123909K->23017K(125952K)] 170172K->74234K(427008K), 0.0516005 secs] [Times: user=0.09 sys=0.00, real=0.05 secs]

2017-07-19T21:40:40.432+0800: 时间戳
18.498: 启动到发生gc的时间
GC:GC类型,还有个full GC
PSYoungGen:年轻代 Prallell Scavenge(年轻代收集器、并行收集器,复制算法)
123909K->23017K(125952K):当前年轻代的大小->gc后年轻代的大小(年轻代总分配的空间)
170172K->74234K(427008K):堆内存->gc后堆内存
0.0516005 secs:gc发生时间

然后下面是Full GC的日志

2017-07-19T21:40:33.157+0800: 11.226: [Full GC (Metadata GC Threshold) [PSYoungGen: 10730K->0K(112128K)] [ParOldGen: 52811K->46254K(301056K)] 63541K->46254K(413184K), [Metaspace: 53972K->53972K(1099776K)], 0.3041220 secs] [Times: user=0.61 sys=0.00, real=0.30 secs]

里面包括年轻代、年老代和永久代的gc内存情况

从上面的gc可以看出,一次启动eclipse差不多GC或Full GC10次,其实我们可以做优化,年轻代一直gc的原因是分配的年轻代内存小,所以每次用完就gc,又申请内存,导致内存越来越多,所以如果分配内存多,会减少gc的次数,下面来配置年轻代和永久代(参数多次调才达到最优状态)

-Xms256m
-Xmx1024m
-XX:NewSize=400m
-XX:MaxNewSize=400m
-XX:PermSize=90m
-XX:MaxPermSize=90

gc次数有明显的减少,从10次下降到6次
这里写图片描述
这里写图片描述

这里写图片描述

垃圾收集器算法

1、标记清除算法
两个阶段 ,标记和清除
这里写图片描述
标记哪些是存活的,哪些是可回收的对象
2、复制算法

3、标记整理算法

4、分代收集算法
整合前面三种算法,

垃圾收集器(对算法的实现)
Serial:串行收集器、复制算法、新生代、默认、单线程、stop world、响应时间
ParNew:并行收集器、新生代、响应时间

Parallel sacvenge:并行收集器、新生代、复制算法、吞吐量

SerialOld:老年代、单线程

Parallel old:老年代、多线程

CMS concurrent Mark Sweep(并发标记整理 ):并发(跟并行有区别的)、老年代、多线程、最短时间、使用cpu多核、老年代用的最多

G1,标记整理算法、可以设计垃圾收集停顿时间、还没广泛使用

组合
CMS + Serial / ParNew

SerialOld + Serial / Parallel sacvenge /ParNew

Parallel old + Parallel sacvenge