看到杨柳_的内存溢出和内存泄漏文章, 这个方面还真没做过总结, 所以转载并整理下:
1: 概念区别
内存溢出 out of memory, 是指程序在申请内存时 (就是你写代码申请内存空间), 没有足够的内存空间供其使用, 出现 out of memory, 比如申请了一个 integer, 但给它存了 long 才能存下的数, 那就是内存溢出.
内存泄露 memory leak, 是指你向系统申请分配内存进行使用 (new), 可是使用完了以后却不归还 (delete), 结果你申请到的那块内存你自己也不能再访问 (也许你把它的地址给弄丢了), 而系统也不能再次将它分配给需要的程序; 一次内存泄露危害可以忽略, 但内存泄露堆积后果很严重, 无论多少内存, 迟早会被占光.
memory leak 会最终会导致 out of memory! (泄漏终究会导致溢出)
2: 内存溢出的常见原因
内存中加载的数据量过于庞大, 如一次从数据库取出过多数据;
集合类中有对对象的引用, 使用完后未清空, 使得 JVM 不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
启动参数内存值设定的过小;
3: 内存溢出的解决方案
第一步, 修改 JVM 启动参数, 直接增加内存 (-Xms,-Xmx 参数一定不要忘记加.);
第二步, 检查错误日志, 查看 "OutOfMemory" 错误前是否有其它异常或错误;
第三步, 对代码进行走查和分析, 找出可能发生内存溢出的位置;
找位置, 主要看以下几点:
检查对数据库查询中, 是否有一次获得全部数据的查询;
检查代码中是否有死循环或递归调用;
检查是否有大循环重复产生新对象实体;
检查 List,MAP 等集合对象是否有使用完后, 未清除的问题;
第四步, 使用内存查看工具动态查看内存使用情况.
4: 总结
关于内存溢出, 主要还是代码中 new 了对象却没 delete 导致, 但是析构函数中只要记得 delete 就可以了.
原文还是有点错误的, 所以以后写博客不能不看就直接复制了, 哈哈哈哈
我是小狼程序员, 希望在自己在计算机方面的知识懂的越来越多, 技术越来越熟练.
欢迎大家加我 qq 交流: 809291807
目前交流方向可以有: 数据结构与算法, 计算机操作系统, C++ 编程, Java 编程, Linux 等.
来源: http://www.bubuko.com/infodetail-2869521.html