首页 > 系统相关 >内存泄漏与内存溢出的对比

内存泄漏与内存溢出的对比

时间:2023-02-01 10:02:08浏览次数:32  
标签:泄漏 内存 集合 WebView 溢出 引用


内存泄露 (memory leak):是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
内存溢出(out of memory): 指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出,简单来说就是自己所需要使用的空间比我们拥有的内存大内存不够使用所造成的内存溢出。
内存泄漏的解决方法:

a) 内存泄漏也许是因为活动已经被使用完毕,但是仍然在其他地方被引用,导致无法对其进行回收。我们只需要给对活动进行引用的类独立出来或者将其变为静态类,该类随着活动的结束而结束,也就没有了当活动结束但仍然还被其他类引用的情况。
b) 资源性对象在不使用的时候,应该调用它的close()函数将其关闭掉。。
c) 集合容器中的内存泄露 ,我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
d) 需要在退出程序之前,将集合里的东西clear,然后置为null,再退出程序。
WebView造成的泄露,当我们不使用WebView对象时,应该调用它的destory()函数来销毁它,并释放其占用的内存,否则其长期占用的内存也不能被回收,从而造成内存泄露。
我们应该为WebView另外开启一个进程,通过AIDL与主线程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。
内存溢出的原因及解决方法:

内存溢出原因:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小
内存溢出的解决方案:

第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。


标签:泄漏,内存,集合,WebView,溢出,引用
From: https://blog.51cto.com/u_14389461/6030684

相关文章

  • k8s最佳实践:cgroup kmem的内存泄露问题
    k8s最佳实践:cgroupkmem的内存泄露问题1.前言这篇文章的全称应该叫:[在某些内核版本上,cgroup的kmemaccount特性有内存泄露问题],如果你遇到过pod的"cannotallocated......
  • 浅谈SQL Server 对于内存的管理
    简介   理解SQLServer对于内存的管理是对于SQLServer问题处理和性能调优的基本,本篇文章讲述SQLServer对于内存管理的内存原理。 二级存储(secondarystorage)......
  • x64平台下采用malloc申请的内存,用memset清零时报错???????
    问题详述如下示例代码,在x86平台下可以正常运行,改成x64平台报错;(double类型同样会报错)#include<stdio.h>#include<string.h>intmain(){ doubleb[10]; memset((v......
  • 关于IDEA运行时报内存溢出FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - Jav
    IDEA运行时,经常会碰到内存溢出问题:FATALERROR:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory,非常讨厌,浪费时间,现记录解决方案如下:1、全......
  • java内存分析
    1.堆区存放new的对象和数组,可以被所有的线程共享,不会存放别的对象引用2.栈区存放基本变量类型(会包含这个基本类型的具体数量);引用对象的变量(会存放这个引用在堆里面的具......
  • activemq 内存_ActiveMQ:了解内存使用情况
    activemq内存 正如最近的一些邮件列表电子邮件和Google返回的许多信息所表明的那样,ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。我将尝试解释有关M......
  • 内存管理
    内存以及优化方法内存读写速度线程寄存器读写:1个时钟周期延迟线程本地内存读写:非常慢块的共享内存读写:1个时钟周期延迟,但是可能冲突网格全局内存读写:500个时钟周期延......
  • 使用pyfakefs在内存中创建文件,而非硬盘
    pyfakefs是一个假文件系统,它模拟的是python的文件系统,简单来说,它提供了和python的os模块,Path模块一样的功能,所有的文件操作,例如创建,修改,删除,重命名等操作都是在内存中进行......
  • 【KAWAKO】python查看内存空间占用情况
    目录查看变量的内存占用查看运行内存占用查看变量的内存占用importsysc=1145.114print(sys.getsizeof(c))查看运行内存占用importpsutilmemory=psutil.vir......
  • 如何测试监测 app 的内存使用、CPU 消耗、流量使用情况?
    adbshelltopAndroid   应用性能测试通常包括:启动时间、内存、CPU、耗电量、流量、流畅度等根据手机的使用应用频度和强度不同,可将应用使用强度分为如下几种状态:1、......