战队----就是jvm中的stack(栈)和heap(堆)----及内存泄漏

                     这段时间看了下有关java面试方面的文章,有些问的还是需要深入去了解的,下面讲一下自己最近所学:

                     java 的内存分为两类,一类是 stack 栈内存,一类是heap堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

                   堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用 final修饰后,放在堆中,而不是栈中。

                     以上是heap和stack的解释:下面主要讲一下,java内存泄漏问题,首先为什么会出现内存泄漏———所谓内存泄漏就是不在被程序使用对象或变量一直存在内存当中。

(java 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于 Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么 GC 也是可以回收它们的,例如下面的代码可以看到这种情况的内存回收)如下例:----------》以下方法引用网上别人的方法,大家可以看看

   

package com.ycg.exteriorline.modules.sys.web;

import java.util.EmptyStackException;

public class Stack {


    private Object[] elements=new Object[10];
    private int size = 0;

    public void push(Object e){

        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop(){
        if( size == 0) {
            throw new EmptyStackException();
        }
        return elements[--size];
    }

    private void ensureCapacity(){
        if(elements.length == size){
            Object[] oldElements = elements;
            elements = new Object[2 * elements.length+1];
            System.arraycopy(oldElements,0, elements, 0, size);
        }
    }
}

 

上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,

没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收。

但是就是存在这样的东西也不一定会导致什么样的后果,如果这个堆栈用的比较少,也就浪费了几个 K 内存而已,反正我们的内存都上 G 了,哪里会有什么影响,再说这个东西很快就会被回收的,有什么关系。下面看两个例子。

例子1

public class Bad{

public static Stack s=Stack();

static{

s.push(new Object());

s.pop(); //这里有一个对象发生内存泄露

s.push(new Object()); //上面的对象可以被回收了,等于是自愈了

}

}

因为是 static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如

果你的 Stack 最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack 内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!

 

-----------------------------------------------以上我理解的不深,哪位大神理解的话,可以分享下,共同学习哈----------------------------------------------------------

 

 

转载于:https://my.oschina.net/u/3139755/blog/810316

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值