Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

写在前面

java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题,经常一个引用没处理好就引起内存泄漏,最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎,特别是引用要及时断链。虽然jvm有GC(垃圾回收引擎),但只能清理没有引用的对象,因此对象在不使用时及时置null。当然,笔者对此是很小心的,但万万没想到还是遇到了fullGC(old GC)。

定义

jvm的GC

通常遇到的是堆区内存问题,也就是堆GC。jvm的GC发展到现在也经历很多发展了,现在主要还是分代回收的思路。

eden space

伊甸园,新生对象放置的地方。

survivor space

在jvm中的被回收过对象仍存活的地方。

old Generation

幸存区被清理后仍活着的对象就步入老年了。 大多数GC问题都在老年代中被发现,笔者遇到的问题也是在这里。

eden 和survivor都属于新生代,与old gen有明显差别,也就是这样决定了java程序不用主动回收也能在较好的状态运行。 eden和survivor空间相对old generation小很多,这也意味着存放的内存也少很多。jvm一般将长期引用(jvm会将对象分析其引用计数)的对象(多次GC仍存活的)放在Old generation中。

jvm堆区不同区域使用的是不同算法,eden和survivor的GC属于miniGC,也就是局部GC,特点是速度快,低延迟(1.标记复制算法与空间小的优势,2.GC时需要将所有线程挂起Stop The World)。而old generation发生GC则为FullGC,且old gener

你可能感兴趣的:(Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题)