【JVM】内存溢出与内存泄漏

以你之姓@ 2022-05-16 02:18 398阅读 0赞

内存溢出(OutOfMemory):没有足够的内存空间供申请;
内存泄漏(Memory Leak):申请的内存无法释放,一次泄漏可忽略,泄漏堆积后果很严重,无论多少内存,迟早被占光。并非指物理内存的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成浪费

溢出常见原因:
1、启动参数内存值设定过小;

  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

发表评论

表情:
评论列表 (有 0 条评论,398人围观)

还没有评论,来说两句吧...

相关阅读