性能注意事项
垃圾收集性能有两个主要指标。 吞吐量是在长时间内考虑的未用于垃圾收集的总时间的百分比。吞吐量包括分配所花费的时间(但通常不需要调整分配速度。) 暂停是应用程序因为垃圾收集正在发生而无响应的时间。
用户对垃圾收集有不同的要求。例如,有些人认为Web服务器的正确度量标准是吞吐量,因为垃圾收集期间的暂停可能是可以容忍的,或者只是被网络延迟所掩盖。但是,在交互式图形程序中,即使短暂停顿也可能对用户体验产生负面影响。
一些用户对其他考虑因素很敏感。 足迹是一个过程的工作集,以页面和缓存行来衡量。在具有有限物理内存或许多进程的系统上,占用空间可能会影响可伸缩性。 提示性是指对象变为死亡和内存可用之间的时间,这是分布式系统的一个重要考虑因素,包括远程方法调用(RMI)。
通常,特定的一代尺寸选择在这些考虑之间进行权衡。例如,非常大的 年轻一代可以最大化吞吐量,但这样做是以占用空间,及时性和暂停时间为代价的。 年轻一代的停顿可以用一个小的最小化 的年轻的吞吐量为代价产生。对于第一近似,一代的大小不影响另一代的收集频率和暂停时间。
没有一种正确的方法来规模化。最佳选择取决于应用程序使用内存的方式以及用户要求。因此,虚拟机对垃圾收集器的选择并不总是最佳的,并且可以由用户以命令行选项的形式覆盖。
垃圾收集器,堆和运行时编译器
在J2SE平台版本1.4.2中,默认情况下进行了以下选择
串行垃圾收集器
堆大小
初始堆大小为4 MB
最大堆大小为64 MB
客户运行编译器
在J2SE平台版本5.0中,一类称为服务器级机器的机器已被定义为具有的机器
2个或更多物理处理器
2个或更多GB的物理内存
默认情况下,在服务器级计算机上选择以下内容。
吞吐量垃圾收集器
堆大小
初始堆大小为1/64的物理内存,最大为1Gbyte
最大堆大小为1/4的物理内存,最大为1Gbyte
Server runtime编译器
基于行为的调整
在J2SE平台版本5.0之前,针对垃圾收集的调优主要包括指定整个堆的大小以及可能堆中的代的大小。调整垃圾收集的其他控制措施包括年轻一代幸存者空间的大小以及从年轻一代到老一代的晋升门槛。调整需要使用这些参数的不同值进行一系列实验,并使用专门的工具或只是做出好的判断来决定垃圾收集何时表现良好。
在版本5.0中,引入了基于应用程序的期望行为的两个参数。这些是
最大暂停时间目标
应用吞吐量目标。
设置这些目标可用于调整垃圾收集。应该强调的是,目标不能总是得到满足。应用程序需要足够大的堆以至少保存所有实时数据。最小堆大小我无法达到这些预期目标。
最大暂停时间目标
暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的意图是限制这些暂停的最长时间。垃圾收集器维持平均停顿时间和平均时差。平均值是从执行开始时获得的,但是经过加权,以便更近期的暂停次数更多。如果平均加上暂停时间的方差大于最大暂停时间目标,则垃圾收集器认为目标未得到满足。
使用命令行标志指定最大暂停时间目标
-XX:MaxGCPauseMillis = <NNN>
这被解释为垃圾收集器的提示,需要<nnn>毫秒或更短的暂停时间。垃圾收集器将调整Java堆大小和其他与垃圾收集相关的参数,以试图使垃圾收集暂停时间小于<nnn>毫秒。默认情况下,没有最大暂停时间目标。这些调整可能导致垃圾收集器更频繁地发生,从而降低了应用程序的整体吞吐量。在某些情况下,无法满足所需的暂停时间目标。
吞吐量收集器是世代收集器,因此年轻一代和老一代有单独的集合。平均值和方差分别为每一代保留。最大暂停时间目标分别应用于平均值加上每一代集合的方差。每一代可能单独地无法满足暂停时间目标。
吞吐量目标
吞吐量目标是根据收集垃圾所花费的时间和垃圾收集之外的时间(称为应用程序时间)来衡量的。目标由命令行标志指定
-XX:GCTimeRatio = <NNN>
垃圾收集时间与应用时间的比率是
1 /(1 + <nnn>)
例如-XX:GCTimeRatio = 19设置1/20的目标 个或总时间为垃圾收集5%。
垃圾收集所花费的时间是年轻一代和老一代收藏相结合的总时间。如果未满足吞吐量目标,则增加代的大小以努力增加应用程序在集合之间运行的时间。
足迹目标
如果已满足吞吐量和最大暂停时间目标,则垃圾收集器会减小堆的大小,直到无法满足其中一个目标(总是吞吐量目标)。然后解决未达到的目标。
调整策略
除非您知道需要大于默认最大堆大小的堆,否则不要为堆选择最大值。选择足以满足您应用程序的吞吐量目标。
堆将增大或缩小到支持所选吞吐量目标的大小。可以预期在初始化期间和应用程序行为发生变化期间堆大小的一些振荡。
如果堆增长到最大值,则在大多数情况下这意味着在最大堆大小内无法满足吞吐量目标。将最大堆大小设置为接近平台上的总物理内存但不会导致应用程序交换的值。再次执行该应用程序。如果仍未满足吞吐量目标,则应用程序时间的目标对于平台上的可用内存来说太高。
如果可以满足吞吐量目标,但暂停时间过长,请选择最大暂停时间目标。选择最大暂停时间目标可能意味着您的吞吐量目标将无法满足,因此请选择对应用程序可接受的折衷值。
当垃圾收集器试图满足竞争目标时,堆的大小通常会振荡。即使应用程序已达到稳定状态,也是如此。实现吞吐量目标(可能需要更大的堆)的压力与目标竞争最大暂停时间和最小占用空间(两者都可能需要小堆)。
其他变化
线程局部分配缓冲区
重新调整了线程局部分配缓冲区的大小。当线程局部分配缓冲区填满时,新缓冲区的大小取决于线程的分配模式。分配更多内存的线程将获得更大的缓冲区。
测量及方式
使用特定于应用程序的度量来最好地测量吞吐量和占用空间。例如,可以使用客户端负载生成器测试Web服务器的吞吐量,而可以使用pmap命令在Solaris操作系统上测量服务器的占用空间。另一方面,通过检查虚拟机本身的诊断输出,可以容易地估计由于垃圾收集引起的暂停。
命令行参数-verbose:gc在每个集合上打印信息。请注意,-verbose:gc输出的格式可能会在J2SE平台的发行版之间发生变化。例如,这是从大型服务器应用程序输出:
[GC 325407K-> 83000K(776768K),0.2300771 secs]
[GC 325816K-> 83372K(776768K),0.2454258 secs]
[Full GC 267628K-> 83769K(776768K),1.8479984 secs]
在这里,我们看到两个小集合和一个主要集合。箭头前后的数字
325407K-> 83000K(第一行)
表示垃圾收集前后活动对象的总大小。在次要集合之后,计数包括不一定存活但不能被回收的对象,因为它们直接存活,或者因为它们在终身代内或从其中引用 。括号中的数字
(776768K)(在第一行)
是总可用空间,不计算永久代的空间 ,即总堆减去一个幸存者空间。次要收藏大约花了四分之一秒。
0.2300771秒(第一行)
第三行中主要集合的格式类似。标志-XX:+ PrintGCDetails打印有关集合的其他信息。使用此标志打印的附加信息可能随每个版本的虚拟机而更改。带有-XX:+ PrintGCDetails标志的附加输出尤其随着Java虚拟机开发的需要而变化。此处显示了使用串行垃圾收集器的J2SE平台1.5版的-XX:+ PrintGCDetails输出示例。
[GC [DefNew:64575K-> 959K(64576K),0.0457646 secs] 196016K-> 133633K(261184K),0.0459067 secs]]
表明未成年人收集了大约98%的 年轻一代,
DefNew:64575K-> 959K(64576K)
并花了大约46毫秒。
0.0457646秒
整个堆的使用率降低到约51%
196016K-> 133633K(261184K)
并且如最后一次所示,收集(超出年轻一代的收集)有一些额外的开销 :
0.0459067秒
标志-XX:+ PrintGCTimeStamps还将在每个集合的开头打印时间戳。
111.042:[GC 111.042:[DefNew:8128K-> 8128K(8128K),0.0000505 secs] 111.042:[Tenured:18154K-> 2311K(24576K),0.1290354 secs] 26282K-> 2311K(32704K),0.1293306 secs]
该集合开始执行应用程序大约111秒。次要收集大约在同一时间开始。此外,还显示Tenured描绘的主要收藏品的信息。的 终身代使用减少到约10%的
18154K-> 2311K(24576K)
花了大约0.13秒。
0.1290354秒
---------------------
作者:a_Ygygs_Dxdsr_XdMss
来源:CSDN
原文:https://blog.csdn.net/weixin_42749765/article/details/87363823
版权声明:本文为博主原创文章,转载请附上博文链接!