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个就属于泄露的部分。