`
aqxyjay
  • 浏览: 4077 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

EJ.06 消除过期的对象引用

    博客分类:
  • EJ
EJ 
阅读更多
  • Java语言也需要考虑内存管理
//Can u spot the "memory leak"?
public class Stack {
    private Ojbect[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack(int initialCapacity) {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }
    /**
     * Ensure space for at least one more element, roughly doubling the capacity
     * each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size) {
            Object[] oldElements = elements;
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

以上代码存在内存溢出的风险:如果一个栈是先增长,然后再收缩,栈中pop谈出来的对象不会被当作垃圾回收。因为栈内部维护着这些对象的过期引用(obsolete reference)。

  

  • 一旦对象引用已经过期,只需清空这些引用即可
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }

  • 消除过期引用最好的方法是让包含该引用的变量结束其生命周期
遗留任务:学习EJ.45时,在最紧凑的作用域范围内定义每一个变量,以上情景会自然而然地发生。
  • 只要类是自己管理内存,就应该警惕内存泄露问题
  • 内存泄露的另一个常见来源是缓存(EJ p23)
  • 内存泄露的第三个常见来源是监听器和其他回调
遗留任务:确认这句话,并写Demo来验证。“确保回调立即被当作垃圾回收的最佳方法是只保存它们的弱引用(weak reference)”。
分享到:
评论

相关推荐

    TheThridJE~EJ.zip

    TheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zip

    Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001

    Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001

    Eijiro V86 JE~EJ.zip.006

    Eijiro V86 JE~EJ.zip.006Eijiro V86 JE~EJ.zip.006Eijiro V86 JE~EJ.zip.006

    Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005

    Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005

    Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002

    Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002

    Eijiro V86 JE~EJ.zip.004Eijiro V86 JE~EJ.zip.004

    Eijiro V86 JE~EJ.zip.004Eijiro V86 JE~EJ.zip.004

    Eijiro V86 JE~EJ.zipEijiro V86 JE~EJ.zip

    Eijiro V86 JE~EJ.zipEijiro V86 JE~EJ.zip

    ej.rar_c/C++

    标题中的"ej.rar_c/C++"表明这是一个与C++编程语言相关的压缩文件,而"ej.c"可能是包含C语言代码的源文件。描述提到的是一个能在DOS环境下操作光驱的C程序,这意味着我们将探讨如何在DOS操作系统下通过C语言控制硬件...

    Aspnet-ej2-aspmvc-ej1compatibility.zip

    Aspnet-ej2-aspmvc-ej1compatibility.zip,此演示旨在避免在asp.net mvcsyncfusion essential js 1和essential js 2 asp.net mvc兼容性中出现essential js 1和essential js 2兼容性问题。,asp.net是一个开源的web框架...

    EJ.Technologies.Perfino.3.2.1.x64

    本地会话实时分析模式 Profiler能够根据用户定义的启动方式进行设置。用户即刻便能从设置好的JVM中看到实时数据。用户还可以无需自定义,直接从多个IDE插件中选择进行配置。 远程会话实时分析模式 ...

    ej4B.rar_Time

    【ej4B.rar_Time】是一个关于使用时间中断的示波器程序的压缩包,其中包含三个文件:ej4B.c、ej4B.h和ej4B.uir。这个项目主要探讨了在嵌入式系统或微控制器编程中如何利用时间中断来实现示波器功能,这对于电子...

    Matlab_based_DIC_code___Version_1___130814_EJ.zip_DIC speckle pa

    Digital Image Correlation (DIC) is an optical, non-contact method to measure full-field displacements and strains. The only requirement is that the test specimen has a random speckle pattern on its ...

    11 EJ1820使用手册.pdf

    EJ1820系列远程IO模块支持多种功能,包括数字量输入输出、模拟量输入输出以及特殊功能如脉冲输入输出和温度检测等。该系列支持的现场总线类型包括Profibus-DP、DeviceNet、CANopen等。 EJ1820远程IO模块将分布的IO...

    EJ.COM

    在DOS下弹出CD-ROM的小程序,需要先加载MSCDEX.

    EJ511_Datasheet_rev0.97.pdf

    【EJ511 USB3.1 Gen1 视频捕获集成电路】 EJ511是一款专为USB3.1 Gen1视频捕捉设计的集成电路,由Etron Technology, Inc.开发。USB3.1 Gen1是USB 3.0规范的一部分,提供最高5Gbps的数据传输速率,比USB2.0的480Mbps...

    EJ_Technologies_JProfiler_11.0.1_macOS_Downloadly.ir.rar

    1. 内存泄漏:通过内存分析,发现并修复可能导致内存泄漏的对象引用。 2. 性能优化:通过CPU分析,识别耗时操作,优化算法或减少不必要的计算。 3. 并发问题:在多线程环境中,定位和解决死锁、阻塞等问题。 4. ...

    基于51单片机的自动浇灌系统.zip

    《基于51单片机的自动浇灌系统详解》 51单片机,作为微控制器领域的经典之作,因其性能稳定、价格低廉、资源丰富,常被用于各种嵌入式系统设计,包括本次讨论的自动浇灌系统。该系统旨在通过实时监测土壤的温湿度,...

    ej_2000.zip

    标题“ej_2000.zip”所对应的资源是一个包含STK(System Tool Kit)模型的压缩包。STK是一款综合性的空间系统工程软件,它提供了广泛的建模和仿真功能,用于分析各种复杂的航天、通信、地球观测和天文学问题。这个...

Global site tag (gtag.js) - Google Analytics