求助>必须要在发生问题的时候dump内存快照才行吗>
2回复

必须要在发生问题的时候dump内存快照才行吗



各位大佬求问,机器会偶然连续发生几次fullgc同时线程数量有陡增,然后会快速恢复,必须要在发生问题的时候及时dump内存快照才可以吗?之前是发生问题之后才dump没有发现问题,看线程block堆栈怀疑是log4j打日志量太大的原因,各位大佬请教一下如何准确定位发生fullgc和线程block的原因?

686 阅读
请先登录,再评论

最好是在fullgc发生之前dump,在发生之后dump时,就相当于用jmap命令加了-live参数一样,dump下来的基本是活跃对象。如果fullgc是因为超大量的短期对象提前晋升,那么dump后就无法显示出这些待回收对象了。

准确定位发生fullgc的原因最好的办法是打印GC日志,日志中会给出每次fullgc的触发原因。定位block的最好办法是借助jstack等工具打印线程栈,找出对应线程的调用栈,然后查看一下基本就能知道大概在做什么业务了。

11月前

fullgc后现场已经丢失,事后的dump肯定是效果不大了;
在发生fullgc前dump,是否有效果要看你的情况,从gc日志观察下内存分配回收情况,有两种可能:
一个是大量对象堆积导致的fullgc,那么观察内存增长情况,在增长到fullgc前dump几次对比,就可以观察到;
或者是一次大对象直接分配导致,那么事前是观查不到的,建议找一个节点,开下jvm参数,在fullgc前后自动dump下;

11月前