NingG +

JVM 实践:GC 调优实践

1. 概要

接着上一篇 blog:

2. 主要内容

主要分为 3 个方面:

2.1. 排查工具

几个工具,以及简介:

详细操作使用,可以参考:

其中,从上至下,要解决 5 个问题:

  1. 有哪些 JVM 实例? jps
  2. JVM 启动参数?jinfo
  3. JVM 运行状态(gc 的状态)? jstat
  4. JVM 中,栈?jstack
  5. JVM 中,堆?jmap

2.2. CPU 资源占用过高

具体 case ,可以参考:

2.3. 内存占用过高:OOM,OutOfMemoryError

OOM 异常,细分为 3 类:

2.3.1. OOM:Java heap space

2.3.2. OOM:PermGen space

2.3.3. OOM:null

2.4. 补充

主要补充 3 个方面:

2.4.1. 补充:直接内存

2.4.2. 补充:永久代

2.4.3. 补充:JDK8 的差异

3. 讨论问题

讨论过程中,提到的几个问题:

关于Remembered Set概念:G1收集器中,Region之间的对象引用,以及其他收集器中的,新生代和老年代之间的对象引用,是使用Remembered Set来避免扫描全堆。G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序对Reference类型数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之间(在分代中例子中就是检查是否老年代中的对象引用了新生代的对象),如果是便通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set中。当内存回收时,在GC根节点的枚举范围加入Remembered Set即可保证不对全局堆扫描也不会有遗漏。

G1虽然保留了CMS关于代的概念,但是代已经不是物理上连续区域,而是一个逻辑的概念。在标记过程中,每个区域的对象活性都被计算,在回收时候,就可以根据用户设置的停顿时间,选择活性较低的区域收集,这样既能保证垃圾回收,又能保证停顿时间,而且也不会降低太多的吞吐量。Remark阶段新算法的运用,以及收集过程中的压缩,都弥补了CMS不足。

建议阅读 2 个资料:

4. 参考资料

同类文章:

微信搜索: 公众号 ningg ,即可联系我

Top