Java的内存管理问题

当从手动管理内存额语言(C/C++)转换到具有垃圾回收功能的语言的时候,程序员的工作变得更加容易,
因为用完对象之后,他们会被自动回收.当第一次经历对象回收功能的时候,会容易认为自己不要考虑内存管理的问题,其实不然
public class Stack{
    private Objects[] elements;
    private int size=0;
    private static final int DEFAULT_INITIAL_CA{ACITY=16;


    public void push(Object e)
    {
        elements[size++]=e;
    }

    public object pop()
    {
        return elements[--size]l
    }

    private void ensureCapcity(){
        if(elements.length==size)
        {
            elements = Arrays.copyOf(elements ,2*size+1);
        }
    }

}

这段程序有一个内存泄漏,随着垃圾回收器活动的增加,或者由于内存占用的不断增加,程序性能的降低出现.极端的情况下,堆栈磁盘交换(Disk Paging),甚至导致程序失败(OOM)

因为栈内部维护着这些对象额拱桥引用 (obsolete reference)所谓的过期引用,是指永远也不会被解除的引用.在本例子中,凡是在elements 数组的活动部分之外的任何引用都是过期的,活动部分是指elemenes 中下标小于size 的元素;

在垃圾回收的语言中,内存泄漏是隐藏ide/如果一个对象引用被无意识保留起来了,那么,垃圾回收机制不仅不uichul,而且也不会处理被这个对象所引用的所有其他的对象,即使只有少量的对象引用一个被无意识保留,也会有徐徐对对的对象被排除在垃圾回收之外名从而对性能呢个造成影响

解决方法简单,需清空引用即可

public Object pop()
{
    Object result = elements[--size];
    elements[size]=null
    return result;
}
清空过期引用的好处,如果他们以后又被错误解除引用,程序就会NUll.
当程序员第一次被类似的问题困扰的时候,他们往往过分消息,清过期引用的方法是让引用的变量结束声明周期.如果你在最经凑的作用域访问定义每一个变量,

猜你喜欢

转载自blog.csdn.net/qianyedoufulao/article/details/78914971
今日推荐