【JVM】内存溢出与内存泄漏
内存溢出(OutOfMemory):没有足够的内存空间供申请;
内存泄漏(Memory Leak):申请的内存无法释放,一次泄漏可忽略,泄漏堆积后果很严重,无论多少内存,迟早被占光。并非指物理内存的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成浪费
溢出常见原因:
1、启动参数内存值设定过小;
java.lang.OutOfMemoryError: ......java heap space.....
2、查询方法很大,返回过多数据;
3、代码死循环;
4、集合类中有对象引用,用完后未清空,jvm不能回收;
溢出解决方案(根据以上原因):
1、增加-Xms,-Xmx
2、检测数据库查询中,是否有一次获得全部数据的查询,一般,如果一次取10万记录到内存,就可能引起内存溢出
3、检测代码是否有死循环或递归调用
4、检查List、Map等集合对象是否有使用完后,未清除的问题
内存泄漏的问题在于:
1、编译器不能发现这些问题
2、运行时能捕获到这些错误,但错误没有明显的症状,时隐时现
3、对手机登终端开发用户来说,尤为困难
泄漏解决:
1、良好的编码习惯,尽量在涉及内存的程序段就可以检测出内存泄漏
使用了内存分配的函数,一旦使用完要释放掉;
Heap memory:
malloc\realloc ——— free
new \new[] ————— delete \delete[]
GlobalAlloc——————GlobalFree数组对象
MyPointEX *pointArray =new MyPointEX [100];
//其删除形式为:
delete []pointArray基于引用计数的系统对象
只有引用计数为0时,该对象才能正确被删除。使用过程中有其生成的新的系统资源,使用完毕后,如果没有及时删除,都会影响其引用计数
2、重写new/delete
还没有评论,来说两句吧...