网站建设网站建设公司,家教网站代理,google adsense,河北网站备案文章目录 一、什么是内存二、定义不同三、产生原因不同四、处理方式不同五、影响程度不同六、检测工具不同 一、什么是内存
内存#xff08;Memory#xff09;是计算机用于存储和访问数据和指令的设备。它是计算机系统中的一个重要组成部分#xff0c;用于临时存储和处理数… 文章目录 一、什么是内存二、定义不同三、产生原因不同四、处理方式不同五、影响程度不同六、检测工具不同 一、什么是内存
内存Memory是计算机用于存储和访问数据和指令的设备。它是计算机系统中的一个重要组成部分用于临时存储和处理数据。内存可以被看作是计算机的”大脑”用于存储正在执行的程序和数据以及中间结果和临时变量。
计算机内存由一系列存储单元组成每个存储单元都有一个少数的地址。这些存储单元可以存储二进制数据包括程序指令和运行时数据。内存的主要特点是可以读取和写入数据以及较快的访问速度。
内存分为几个不同的层次。非常快速但最小容量的是处理器内部的寄存器用于存储指令和数据的中间结果。其次是高速缓存Cache它是位于处理器和主内存之间的一种存储器用于加速对常用数据的访问。最后是主内存RAM它是计算机系统中最大的存储器用于存储当前正在执行的程序和数据。
内存的容量通常以字节Byte为单位进行衡量。常见的内存容量单位有千字节KilobyteKB、兆字节MegabyteMB、千兆字节GigabyteGB和万兆字节TerabyteTB等。随着技术的发展内存容量不断增加以满足现代计算机处理大规模数据和复杂任务的需求。
需要注意的是内存是一种临时存储设备当计算机断电或重新启动时内存中的数据将被清空。 因此为了长期保存数据需要将其存储到永久性存储介质如硬盘或固态硬盘中。
二、定义不同 内存溢出Out Of Memory 即 OOM程序在申请内存时没有足够的内存空间供其使用就会发生内存溢出。 内存泄漏Memory Leak程序在申请内存后无法及时释放已申请的内存空间一次内存泄漏可能影响不大但内存泄漏积累后会极大影响程序运行可能导致内存耗尽甚至系统崩溃。
以发生的方式来分类内存泄漏可以分为4类 常发性内存泄漏发生内存泄漏的代码会被多次执行到每次被执行的时候都会导致一块内存泄漏。 偶发性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏发生内存泄漏的代码只会被执行一次或者由于算法上的缺陷导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存在析构函数中却没有释放该内存所以内存泄漏只会发生一次。 隐式内存泄漏程序在运行过程中不停的分配内存但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏因为最终程序释放了所有申请的内存。但是对于一个服务器程序需要运行几天几周甚至几个月不及时释放内存也可能导致最终耗尽系统的所有内存。所以我们称这类内存泄漏为隐式内存泄漏。
从用户使用程序的角度来看内存泄漏本身不会产生什么危害作为一般的用户根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积这会最终消耗尽系统所有的内存。从这个角度来说一次性内存泄漏并没有什么危害因为它不会堆积而隐式内存泄漏危害性则非常大因为较之于常发性和偶发性内存泄漏它更难被检测到。
三、产生原因不同 内存溢出内存溢出的产生通常是因为程序申请的内存超出了系统能够提供的范围比如试图创建一个超大的数组或对象超过了系统或虚拟机的限制。比如申请了一个integer但给它存了long才能存下的数就会造成内存溢出。 举个例子一个盘子用尽各种方法只能装4个果子你装了5个结果掉倒地上不能吃了。这就是溢出比方说栈栈满时再做进栈必定产生空间溢出叫上溢栈空时再做退栈也产生空间溢出称为下溢。就是分配的内存不足以放下数据项序列称为内存溢出。 再或者比如总内存大小是100MB一次程序运行结束有有10MB 没有释放当前可用内存还有90MB程序还可以运行。但是多次运行后可用内存最终为0 没有可以内存或内存不足时程序在下一次运行时会因为内存不足而出现内存溢出。 放在实际项目中引起内存溢出的常见原因有以下几种 1. 内存中加载的数据量过于庞大如一次从数据库取出过多数据 2. 集合类中有对对象的引用使用完后未清空使得JVM不能回收 3. 代码中存在死循环或循环产生过多重复的对象实体 4. 使用的第三方软件中的BUG 5. 启动参数内存值设定的过小 。 注⚠️内存泄露memory leak会最终会导致内存溢出out of memory 内存泄漏内存泄漏通常是由于程序的设计问题导致的比如忘记释放已经不再使用的内存或者引用已不需要的对象使得这部分内存无法被回收。
单例模式中单例的生命周期和应用程序是一样长的所以单例程序中如果持有对外部对象的引用的话那么这个外部对象是不能被回收的则会导致 内存泄露 的产生。
一些提供close的资源未闭导致 内存泄漏 。数据库连接dataSource.getConnection() 网络连接socket和 IO流的连接必须在finally中 close否则不能被回收的。
读取大文件一次读取的文件大于可用内存会导致 内存溢出 。可用内存是1G怎么读取2G的文件呢建一个100MB的字节数组读10次。
四、处理方式不同 内存溢出对于内存溢出的问题通常需要检查程序是否有不必要的大内存申请或者优化程序使得内存使用更加高效。 放在实际项目中内存溢出的解决方案如下 修改 JVM 启动参数直接增加内存。( -Xms 、 -Xmx 参数一定不要忘记加) 检查错误日志查看 “OutOfMemory” 错误前是否有其它异常或错误。 对代码进行走查和分析找出可能发生内存溢出的位置。
重点排查以下几点 检查数据库查询中是否有一次获得全部数据的查询即全表查询。 一般来说如果一次取十万条记录到内存就可能引起内存溢出。 这个问题比较隐蔽在上线前数据库中数据较少不容易出问题上线后数据库中数据多了一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用条件查询和分页的方式查询。 检查代码中是否有死循环或递归调用。 检查是否有大循环重复产生新对象实体。 检查List、MAP等集合对象是否有使用完后未清除的问题。 List、MAP等集合对象会始终存有对对象的引用使得这些对象不能被GC回收。 使用内存查看工具动态查看内存使用情况。Jmap获取内存堆信息/arthas在线分析。
内存泄漏对于内存泄漏的问题首先需要定位程序中导致内存泄漏的部分然后修复这些问题比如及时释放不再使用的内存或者取消对不再需要的对象的引用。
五、影响程度不同 内存溢出内存溢出会导致程序立即崩溃或者抛出错误影响较大。 内存泄漏一次小的内存泄漏可能不会立即影响程序运行但是如果大量内存泄漏累积最终会导致内存耗尽影响系统的正常运行。
六、检测工具不同 内存溢出可以通过一些性能监控工具来预防内存溢出如JProfiler、MAT等。 内存泄漏一些内存分析工具可以帮助检测内存泄漏如Valgrind、LeakCanary等。