Java程序运行慢,如何判断是GC引起的?如何找出造成GC的原因?以及如何避免?

AkataMoKa 发布于 2016/04/14 09:19
阅读 335
收藏 2

一共是三个问题:

  1. 如何判断是GC引起的?
  2. 如何找出造成GC的原因?
  3. 以及如何避免?

第一个问题
我想的是,在JVM增加GC参数:-XX:+PrintGCDetails
可以看到GC运行一次的时间,来判断是不是 GC 造成程序卡很久
(这个还需要大家帮忙补充一下)

第二个问题
我想到的是,通过 jmap 导出一份 heap 或者通过 VisualVM 远程看程序创建了什么对象
但是这里有个问题是,有时候对象多,比如String,但也不一定是它造成GC卡

衍生一个问题:
就是,通过 VisualVM 可以看到内容泄露吗?
比如数据库连接未正常关闭等

第三个问题,如何避免?
这个我不知道标准的答案,我想的是,就是规范代码,需要了解 JVM 内容分部
我记得似乎之前有个人提到,在创建对象的时候,如果不变,最好添加 final,似乎 JVM 内存分部会有优化。

这里想请教下大家的建议和看法?

加载中
0
N
NPEer

GC会造成运行慢很久?多大的堆额?

会不会是新生代配的太小了,频繁GC造成的

或者-XX:+PrintGCDetails看时间,换一下收集器试试

AkataMoKa
AkataMoKa
嗯,会卡好几秒。堆是 4G 的,新生代是 2G 的。像新生代,一般是设置为堆的多少比较合适?
返回顶部
顶部