- 内存占用:Java堆区所占的内存大小
- 垃圾收集开销:吞吐量的补数,垃圾收集器所占时间与总时间的比例
- 收集频率:相对于应用程序的执行,收集操作发生的频率
吞吐量(Throughput)
1. 计算方式
虚拟机总共运行了190分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
2. 什么应用需要高吞吐量?
- 离线任务
- 抢购服务
- 竞技游戏服务
- 音视频服务
3. 提高Throughput?
- 给更大的内存(Heap+++)
- 更改GC算法
4. -XX: GCTimeRatio=99
默认 99
5. 总结
- 高吞吐量较好因为这会让应用程序的最终用户感觉只有应用程序线程在做“生产性”工作。直觉上,吞吐量越高程序运行越快
- 低暂停时间(低延迟)较好因为从最终用户的角度来看不管是GC还是其他原因导致一个应用被挂起始终是不好的。这取决于应用程序的类型,有时候甚至短暂的200毫秒暂停都可能打断终端用户体验。因此,具有低的较大暂停时间是非常重要的,特别是对于个交互式应用程序。
- 不幸的是”高吞吐量”和”低暂停时间”是一对相互竞争的目标(矛盾)
- 因为如果选择以吞吐量优先,那么必然需要降低内存回收的执行频率,但是这样会导致GC需要更长的暂停时间来执行内存回收。
- 相反的,如果选择以低延迟优先为原则,那么为了降低每次执行内存回收时的暂停时间,也只能频繁地执行内存回收,但这又引起了年轻代内存的缩减和导致程序吞吐量的下降。
- 在最大吞吐量优先的况下,降低停顿时间
STW
- 指GC造成的停顿(STW)时间
- Stop-the-World ,简称STW ,指的是GC 事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW 。
- STW 事件和采用哪款GC 无关, 所有的GC 都有这个事件。
- 哪怕是G1 也不能完全避免Stop-the-world 情况发生,只能说垃圾回收器越来越优秀,回收效率越来越高, 尽可能地缩短了暂停时间。
- 被STW 中断的应用程序线程会在完成GC 之后恢复, 频繁中断会让用户感觉像是网速不快造成电影卡带一样,所以我们需要减少STW 的发生。
- 开发中不要用System.gc();会stop the world的错误。
- Pause Time: 一次STW的时间
思考:什么类型应用对延迟要求高?
A. 看网页
B. 刷抖音
C. 玩游戏
D. 连麦
思考:内存更大能不能减少Latency?
能
思考:多线程能不能减少Latency?
能