网站一定要服务器吗,广州网站制作建设,韩国的 电子商务网站,wordpress律师主题这道题是面试常考的#xff0c;一定要区分好区别#xff0c;我之前就是直接认为内存溢出就是内存泄漏了
概念
内存溢出#xff1a;是指程序在申请内存时#xff0c;没有足够的内存空间供其使用。比如#xff0c;申请了一个整数的内存#xff0c;但实际存了一个需要 lon…这道题是面试常考的一定要区分好区别我之前就是直接认为内存溢出就是内存泄漏了
概念
内存溢出是指程序在申请内存时没有足够的内存空间供其使用。比如申请了一个整数的内存但实际存了一个需要 long 类型来存储的数这就会导致内存溢出。系统无法满足程序需要的内存大小导致溢出。
内存泄漏是指程序在申请内存后无法释放已申请的内存空间。虽然单个内存泄漏可能不会带来太大问题但随着内存泄漏的积累系统的可用内存空间会逐渐减少。就像一个容器只能装4个水果但你却放了5个结果溢出并掉落在地上。内存泄漏最终可能会导致内存耗尽也就是内存溢出。
内存溢出分类 PermGen Space PermGenPermanent Generation是指JVM内存的永久保存区域存放类和Meta信息。这个区域不同于存放实例的Heap区域且在运行期间GC不会对其进行清理。如果应用中有大量的Class信息就可能出现PermGen Space错误。比如在Web服务器中对JSP进行precompile时或者应用中使用了大量第三方jar文件超出默认大小4M都可能导致此错误。 Java Heap Space Java Heap是用于存储实例对象的内存区域。默认情况下其大小为物理内存的1/64最大空间为物理内存的1/4。如果内存剩余不到40%JVM会增大堆到最大设置值超过70%则会减小堆到最小设置值。通常Xmx和Xms设置相同避免频繁调整虚拟机堆的大小。如果Xms超过了Xmx值或者堆和非堆的总和超过了物理内存限制都会导致启动问题。
内存泄漏分类
常发性内存泄漏代码重复执行导致内存泄漏。偶发性内存泄漏在特定环境或操作过程下才会发生的内存泄漏。一次性内存泄漏发生一次或由于算法上的缺陷导致总会有一块内存泄漏。隐式内存泄漏程序运行过程中不断分配内存但最终才释放可能最终耗尽系统所有内存。
发生场景以及解决方法
内存溢出
内存溢出通常由以下原因引起
过多数据加载从数据库等源加载大量数据到内存可能引发溢出。未清空集合中的对象引用集合中对象引用未被清空导致JVM无法回收。死循环或对象重复创建存在代码中的无限循环或重复创建大量对象。第三方软件中的问题使用的第三方软件存在bug导致内存溢出。启动参数内存值设定过小设置的启动参数不足以支持应用所需内存。
解决内存溢出的方法
调整JVM启动参数增加内存限制使用 -Xms 和 -Xmx 参数。检查错误日志查看 “OutOfMemory” 错误前是否有其他异常或错误。代码审查和分析检查可能导致内存溢出的代码部分。
具体排查重点
数据查询优化避免一次性加载过多数据库数据尤其使用分页查询方式。死循环和递归调用审查代码中是否存在无限循环或过度递归。对象重复创建检查代码确保大循环未创建大量重复对象。集合对象引用清除确认集合对象在使用完后进行清除避免持有无用对象的引用。动态内存查看工具使用内存查看工具实时监控和分析内存使用情况。
内存泄漏
具体排查重点
检测工具
Valgrind和Dmalloc这些工具能够跟踪内存的分配和释放输出内存使用情况以及追踪错误帮助发现潜在的内存泄漏。
日志记录
记录内存申请和释放在代码中添加日志记录包括内存的申请、释放以及使用情况。观察日志可以发现潜在的内存泄漏。
性能分析器
gprof和perf这些性能分析工具可以识别性能瓶颈和内存使用情况用于检测内存泄漏问题。
解决方法
智能指针的使用采用智能指针如std::shared_ptr或std::unique_ptr来管理内存自动释放内存并避免泄漏。手动释放内存在代码中手动添加释放内存的语句确保每次申请的内存都得到释放。定期清理缓存缓存、连接池等容易导致泄漏定期清理这些资源可以有效避免内存泄漏。增加内存判断在程序中增加内存判断的代码例如使用assert等断言库确保内存的正确使用。