AdrianHu99 / NOTES

0 stars 0 forks source link

深(浅)入(出)剖析G1(Garbage First) #49

Closed AdrianHu99 closed 5 years ago

AdrianHu99 commented 5 years ago

https://mp.weixin.qq.com/s/cPC3SmwZZgtjtDaguUHJ-w

AdrianHu99 commented 5 years ago
  1. 年轻代大小:也就是说,如果配置了-XX:+UseG1GC,那么尽量避免配置-Xmn(或 -XX:NewRatio 等其他相关选项显式设置年轻代大小)。如果设置该参数,G1将不能在需要的时候调整年轻代的大小,也不能根据设置的暂停时间调整收集策略。换句话说,如果配置了-Xmn,也就关闭了参数-XX:MaxGCPauseMillis=200设定的停顿目标,具体YGC的停顿时间,那就完全由-Xmn直接决定了。

  2. 停顿时间:不要使用平均响应时间作为设置参数-XX:MaxGCPauseMillis=200的衡量标准,而应该根据90%(或者更高比例)响应时间来设置这个参数。需要强调的是,这个参数设定的只是一个目标,而不是一定达到的保证。不建议将这个参数设置的过低,例如100ms以内,除非针对你的应用,有充分的压测数据佐证你的设置。

  3. CMS or G1,什么时候选择CMS,什么时候选择G1?这是一个伪命题。其实CMS在较小的堆、合适的workload的条件下暂停时间可以很轻松的短于G1。以JDK8高版本为例(JDK7到JDK8,G1的实现经过了很多的优化),大概在6GB~8GB也可以跟CMS有一比,我之前见过有在-Xmx4g的环境里G1比CMS的暂停时间更短的个案。总之,G1更适合大堆,比如20G,30G,50G,不要犹豫选择G1吧。而对于4G,8G这种中小堆,如果谨慎的话,建议压测后再决定。否则CMS也是一个保(不)守(错)的选择。

AdrianHu99 commented 5 years ago

image