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

内存泄漏怎么导致的(怎么看有没有内存泄漏)

  • 内存
  • 2024-08-24 09:37:24
  • 5213

一、什么会导致内存泄漏1、对象内存过大
保存了很多内存过大的对象,导致超出内存限制。
2.释放资源
程序代码问题:对某些资源(如Context、Cursor、IO流等)的长期引用可能无法释放,导致内存泄漏。


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