Java线上问题排查

1、 垃圾收集算法原理介绍

1) 标记-清除算法:标记所有需要回收的对象,在标记完后统一回收。缺点:标记清除效率不高。产生碎片较多。
2) 复制算法:将内存分成两份,使用其中的一份,把存活的对象复制到另一块去。则一次性清理另一半的内存。(如:Eden空间与survivor空间)
3) 标记-整理算法:与标记-清理类似,但后续步骤是将存活对象向一端移动,然后直接清理掉端边界以外的内存。
4) 分代收集算法:根据存活周期的不同划分。如新生代、老年代。根据生命周期的不同,而进行选择。

2、CMS与G1的比较

1) CMS是标记-清除算法,并发收集,低停顿,会产生空间碎片;
2) G1是标记-清除和标记-整理结合,并行和并发分代收集,空间整合,可预测停顿。

3、对象分配

1) 新生代GC(Minor GC):发生在新生代的垃圾收集动作,java对象大多数都朝生夕灭,所以Minor GC非常频繁。
2) 老年代GC(Major GC/Full GC):发生在老年代。

a. 大多数情况下,对象在新生代Eden区中分配,当Eden不够进行分配时,则进行一次Minor GC; b. 大对象直接进入老年代; c. 长期存活的对象将进入老年代。

4、jvm工具监测

1) jstat -gcutil 查看gc各个代回收的情况;
2) jstack 查看线程情况,以找出最高CPU的代码: top -Hp pid 找出线程id, print "%x\n" threadId 转16进制 jstack pid | grep 16进制数据

3) jmap -heap 查看各个代使用情况
jmap -dump dump内存到文件中,一般可以在发生OOM之前dump,要设置一个参数即可。

4) jhat 快照分析,可以使用MAT 插件来看。

5、常见问题

1)最消耗cpu的代码

见上面分析使用jstack的使用

2) OOM问题产生的原因

a. 内存泄漏,没及时回收;
b. 代码bug,死循环无限期分配容量;
c. 大对象。

3) 频繁Fullgc的原因

a. 直接分配大对象,它会不在young区分配;
b. 老年代空间不足;
c. 内存泄漏,对象生命周期长。

6. Btrace

Btrace可以在线上直接调用代码,查看当前方法返回的结果、入参,可以查看现场情况,后续会专门写一篇文章来介绍。

7. 总结

先从原理、工作角度总结一下,后续会拿实际案例来一一针对分析,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值