我们的Web应用程序使用IBM Websphere。有日常活动,但是在晚上没有,垃圾收集整天收集回到正常的低线。 GC图形模式中没有内存泄漏问题的迹象。
我们正在尝试了解JVM堆内存图,该图显示在6天内内存分配失败(MAF)的Stair Step模式加倍。
MAFs第1天为0.5mb并保持在该水平,直到它第二天跳到1mb,然后是那个级别然后是2mb,然后是4mb然后是8mb,最后是16mb,然后JVM会在某个时刻自动重启。每次真正加倍。
什么会导致内存分配失败图表的独特阶梯模式?
我们通常只在对象大小图上的内存分配失败中看到一条直线。
答案 0 :(得分:0)
我的想法是你拥有对它们有长期引用的数据结构。例如,如果未解除引用键,则与映射键关联的值将不是gc' d。同样,如果您使用对象作为键而不是从地图中显式删除该键,则只要该地图存在,该键及其值将永远不会超出范围。如果您的情况是当值设置为null时应自动解除引用键,请改用weakhashmap。
如果你不相信地图是一个问题,可能还有很多其他原因,比如永远不会关闭的jdbc连接,随时间累积状态的静态对象,创建并与之关联的对象永远不会删除的长期对象等。要查找答案,请使用visualVM工具查看消耗所有内存的内容。但是,当然,问题是由代码中的内存泄漏引起的。