当前位置:首页 > 内存 > 正文

内存泄漏如何造成的(前端内存泄漏和内存溢出)

  • 内存
  • 2024-08-20 23:25:05
  • 908

一、ThreadLocal是如何导致内存泄漏的ThreadLocal造成内存泄漏的机制主要是通过对象依赖和清理策略。使用ThreadLocal存储数据时;每个线程都会维护自己的数据存储(ThreadLocalMap),该映射中的Entry对象引用ThreadLocal实例和用户代码设置的值。ThreadLocalMap的输入通常包含弱引用;如果没有其他强引用,则具有弱引用的对象将在垃圾回收期间被清除。
但是,如果线程专有映射中的条目没有及时清除。虽然用户代码不再引用该值。由于强引用,该值不会被重用。ThreadLocal实例会导致内存泄漏。您可以通过调用ThreadLocal#remove()来删除映射中的条目;或者您可以等到线程完成。条目无法访问并且内存被释放。此外,ThreadLocalMap还设计了清理过期条目的机制,例如将ThreadLocal设置为null或在get()和set()操作期间清除它。
当应用程序生命周期短于应用程序生命周期时,例如Tomcat容器中的应用程序,就会发生内存泄漏。例如,当FooApp应用程序中的过滤器将用户信息插入ThreadLocal时。当应用程序被卸载时,虽然陆家搜索类和模型都可以发布。因为引用了线程的ThreadLocalMap的用户信息;由于数据无法被GC重用,因此类和PermGen空间逐渐累积,最终填满内存。


二、内存泄露,内存越界和栈溢出的区别和联内存溢出(outofmemory)
是指程序使用内存时,没有足够的内存空间可以使用。
内存泄漏(memorleak)
是指程序使用内存后,无法释放已使用的内存空间,占用了有用的内存。
注意:内存泄漏最终会导致内存溢出
从理解上来说,内存溢出就是需要分配的内存超过了系统提供的内存。内存泄漏是指系统分配内存供使用(新建),但使用后不归还(删除),造成有效内存占用。
内存泄漏可以分为4类:
1频繁内存泄漏
引起内存泄漏的代码会被执行多次,每次执行都会造成内存泄漏泄漏
2。偶尔发生内存泄漏
在某种环境下执行导致内存泄漏的代码,就会引起内存泄漏
内存泄漏的两种方式中,测试环境和测试方法对于程序生命周期的重要性缺一不可。
3.一次性内存泄漏
代码只会执行一次,但总会出现内存泄漏,这种情况在构造类时比较常见,并且析构函数不会释放内存。4.隐式泄漏
程序运行时不断分配内存,直到结束才释放内存,但是一般服务器程序会运行很长时间,不及时释放也会导致内存耗尽。
总之,一次性的内存泄漏对于用户程序的维护并没有太大的危害,但在现实生活中,我们还是尽量避免此类事件的发生。
内存越界
是指向系统申请一块内存后,使用时超出了申请范围。例如,一些对内存进行操作的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当执行导致内存泄漏的代码时,产生的错误是不可避免的,通常会导致
1破坏堆中的内存分配信息数据
2
3。销毁空闲内存块
附录:如果你的程序之前运行正常,但是因为你添加了一些新的类的成员变量或者修改了部分代码(前提是要保证你(这些修改是绝对正确的)))如果程序中出现错误,考虑内存是否损坏,重点检查内存是否越界。
缓冲区溢出(堆栈溢出)
为了临时访问数据,程序一般会分配一些称为缓冲区的内存空间。如果将无法装入缓冲区的数据写入缓冲区,可能会导致缓冲区外部的存储单元被覆盖,这称为缓冲区溢出。堆栈溢出是缓冲区溢出的一种,原理是一样的。分为上游和下游。其中,溢出是指栈已满,向其中添加了新数据,导致下面数据溢出,是指栈为空,执行了删除操作等,导致空间溢出。