The Magnificent Java程序员Java学习笔记

Java内存溢出

2017-02-19  本文已影响100人  HeartGo

Java内存溢出

堆溢出

大量对象占据了堆空间,而且这些对象是强引用,导致无法回收

直接内存溢出

Java的NIO支持直接内存使用,从堆外获得内存空间,由于直接内存没有被Java虚拟机完全托管,若使用不当,容易触发直接内存溢出。

多线程导致内存溢出

线程的栈空间也是在堆外分配的,和直接内存相似,线程过多,会导致内存溢出。

永久区溢出

永久区是存放元数据的区域。如果定义了太多类型,那么永久区有可能溢出。

GC效率低下引起内存溢出

内存回收时,如果GC效率低下,那么系统的性能会收到严重的影响。如果系统堆空间太小,那么GC所占的时间就会较多,并且回收所释放的内存就会较少,
根据GC所占用的系统时间,以及释放的内存大小,虚拟机会评估GC的效率,一旦认为GC的效率过低,就会抛出内存溢出异常。

关于String的内存溢出

java.lang.String主要由3部分组成:代表字符数组的Value、偏移量offset和长度count.
例如:
字符串value数组包含100个字节,而count长度只有1个字节,那么这个String实际只有1个字节,却占据100个字节,那剩余99个就属于泄露的部分。

上一篇下一篇

猜你喜欢

热点阅读