java内存溢出的几种情况
第一种:
简单的调用System.gc();
第二种:
old区被占满并无法回收。
当新生代将存活时间较长的对象放入旧生代,而旧生代内存容量不足时,会触发full gc 而full gc也无法回收旧生代内存时会发生内存溢出
解决方案:
尽量将对象在minor gc时回收,不要创建大数据或列表
第三种:
permanent generation 永久代内存溢出
permanent generation 会存放java的与class相关的信息,如果大量使用反射调用或大量进行classloader 时permanent generation可能会占满
当配置了CMS收集器时可能会发生full gc,如果发生full gc也无法回收时,会出现内存溢出情况
解决方案:
配置cms收集器,并提升permGen space的大小
第四种:
CMS GC问题
有以下两种情况:
promotion failed 发生在minor gc时,survivor无法存放对象,对象转存到旧生代,而旧生代也存放不下时造成
concurrent mode failure在CMS GC执行时 有对象要从survivor space转入old区,此时old区不足造成
解决方案:
promotion failed尽量减少大对象的创建方式,减少进行old区的情况
concurrent mode failure尽量减少remark和sweeping的时间间隔,可通过调整:-XX:CMSMaxAbortablePrecleanTime=5时间来减少这种情况。
第五种:
minor gc晋升对象平均大小大于old区可存放对象的容量时
minor gc在将大对象放入old区时,会判断是平均晋升对象大小是否大于old区的容量大小,如果大于则进行full gc否则放入对象