jvm系列java
(1)吞吐量:不考虑垃圾收集引发的停顿时间或内存消耗,垃圾收集器能支撑应用程序达到的最高性能指标
(2)延迟:缩短因为垃圾收集引发的停顿时间或彻底消除垃圾收集所引发的停顿,避免应用程序运行时发生抖动
(3)内存:垃圾收集器流畅运行所须要的内存数量
任何一个属性性能的提供几乎都是以另一个或两个属性性能的损失做为代价的。
(1)MinorGC回收原则:每次MinorGC尽量多地收集垃圾对象
(2)GC内存最大化原则:java堆空间越大,垃圾收集的效果就越好
(3)GC调优3选2原则:吞吐量、延迟、内存任意选择两个进行调优
推荐的GC日志参数
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:<filename>
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime (安全点阻塞代码的时间)
-XX:+PrintGCApplicationConcurrentTime (应用某段时间段的响应时间)
-XX:+PrintSafepointStatistics (区分垃圾收集安全点与其余安全点)
活跃数据的大小是肯定运行应用程序所需java堆大小的不错切入点,它也决定了咱们是否须要从新回顾应用程序的内存占用需求、或者是否须要修改应用程序以知足内存占用需求。
活跃数据的大小是指应用程序稳定运行时长期存活对象所占用的java堆内存量,换句话说,它是应用程序运行于稳定态时,FullGC以后java堆所占用的空间大小。
(1)堆大小
-Xms与-Xmx设定为同一个值,这是由于不管扩展仍是缩减新生代空间或年老代空间都须要进行FullGC,而FullGC会下降程序的吞吐量并致使更长的延迟。
(2)新生代大小
-XX:NewSize=[g|m|k]设置新生代最小值,同时应该指定其最大值-XX:MaxNewSize=[g|m|k]
-Xmn:[g|m|k],设置新生代的“固定空间”/初始值,若是Xms和Xmx没有设置为同一个值时,堆空间扩展或收缩时,新生代大小是不会随着调整的,是固定的,只有Xms和Xmx是同一个值得时候,才使用Xmn选项。
(3)年老代大小
年老代空间的大小初始值为-Xmx减去-XX:NewSize,最小值为-Xmx减去-XX:MaxNewSize
若是使用了-Xmn,则年老代的大小为-Xmx减去-Xmn
(4)永久代大小
-XX:PermSize=[g|m|k],永久代空间的初始值和最小值
-XX:MaxPermSize=[g|m|k],永久代空间的最大值
关注性能的java应用程序应该将-XX:PermSize和-XX:MaxPermSize设置为同一个值,由于永久代空间的大小调整须要进行FullGC才能实现。
新生代、年老代和永久代这三个空间中的任何一个不能知足内存分配请求时,就会发生垃圾收集,理解这一点很是重要,换句话说,这三个空间中任何一个被用尽,同时又有新的空间请求没法知足时就会触发垃圾收集。新生代没有足够的空间知足java对象分配请求时,hotspot会进行MinorGC以释放空间,MinorGC相对FullGC而言,持续的时间要短。
经历过几回MinorGC以后仍然活跃的对象最终会被提高到年老代,年老代不足以容纳新提高的对象时,hotspot vm就会进行FullGC。实际上,当hotspot vm发现当前可用空间不足以容纳下一次MinorGC提高的对象时就会促发FullGC。与因空间问题致使的MinorGC过程当中对象提高失败比起来,这种方式的代价要小不少,从失败的对象提高中恢复是一个很昂贵的操做。
永久代没有足够的空间存储新的VM或类元数据时也会触发FullGC
若是FullGC缘于年老代空间已经满,即便永久代空间没有用尽,年老代和永久代都会进行垃圾收集,一样,若是FullGC是由永久代空间不够引发的,年老代和永久代都会进行垃圾收集,不论年老代是否还有空闲空间。
若是使用的-XX:+UseParallelGC或-XX:+UseParallelOldGC,若是关闭-XX:-ScavengeBeforeFullGC,则hotspot在FullGC以前不会进行MinorGC,但FullGC时仍然会收集新生代,若是开启这个选项,则在FullGC以前老是先作一次MinorGC,分担一部分FullGC本来要作的工做。