[小知识]内存泄漏整理

小知识2021年6月3日 am8:48发布3年前 (2021)更新 3xcn.com@站长
0 0 0
广告也精彩
目录

什么是内存泄漏?

总的来说:内存不在GC掌握之内。

当一个对象已经不在使用了,本该回收时,而另外一个正在使用的对象持有它的引用而导致内存不能被回收。本该回收的对象没有被回收,而一直停留在堆内存中,这就产生了内存泄漏。

Java的GC内存回收机制

当对象不再有任何的引用时候才会进行回收。

内存分配的几种策略

静态存储

静态存储是在程序编译时就已经分配,在整个程序运行期间一直存在。

存储对象: 静态数据,全局static和一些常量

栈式存储

执行函数(或方法)时,函数的一些内存变量都可以放在栈上,函数(或方法)执行结束时会自动释放。

优点:栈内存分配的运算速度很快(在处理器的指令集中)

缺点:容量有限。

堆式存储

堆式存储也叫动态内存分配。

可以通过malloc或者new来申请分配一个内存,程序员需要自己负责堆空间的释放(free或者delete)。

动态内存的生命周期由程序员决定。

优点:堆是不联系的内存区域,堆空间比较灵活也比较大

缺点:需要手动申请(malloc/new)和释放(free/delete),频繁的申请和释放会导致内存碎片,最终导致效率低。

案例分析

public class main(){
    
    //全局变量,存在放堆中。
    int  number = 1; 
    
    Person person = new Person();
    
    public void count(){
        // 局部变量
        int sum = 0;
        Person pserson2 = new Person();
    }
    
}
  1. 成员变量全部在堆中(包括基本数据类型,引用和引用的对象实体)

这些变量属于类的,而且类对象最终还是new出来的。

  1. 局部变量,引用存储在堆中,引用的对象存储的堆中。

局部变量和引用属于函数(或方法),这些都是存放的栈中的。

强引用,软引用,弱引用,虚引用

强引用(StrongReference)

回收时机: 从不回收

声明周期: JAV停止的时候才会终止

使用方式: 对象的一般保存(不需要特意说明)

//str 就是强引用
String str = new String("");

软引用(SoftReference)

回收时机: 当内存不足的时候

声明周期: 内存不足时

使用方式: SoftReference<String>

//String str = new String("");
//软引用
 SoftReference softReference = new SoftReference(new String(""));

弱引用 (WeakReference)

回收时机: 在垃圾回收的时候

声明周期: GC后就终止

使用方式: WeakReference<String>

//String str = new String("");
WeakReference ref = new WeakReference(new String(""));

虚引用(PhatomReference)

回收时机: 在垃圾回收的时候

声明周期: GC后就终止

使用方式: 结合ReferenceQueue来跟踪对象呗垃圾回收期回收的活动

//String str = new String("");
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(new String(""), queue);

PS: 用得比较少,反正我没用过。

 历史上的今天

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站文章: 部分来源于网络,仅供站长学习和参考,若侵权请留言
广告也精彩

相关文章

广告也精彩

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...

网站升级中

公告

近期网站升级中,可能存在一些bug。欢迎反馈 https://www.91es.com/we.html

本站域名

本站域名 : 91es.com3xcn.com。本站邮箱 : 站长邮箱 i@oorr.cn,通知邮箱we@oorr.cn ,如有更新,请看公告 。