主页 > 知识库 > 网络编程 > JSP/Java >

java内存泄漏的定位与分析

来源:中国IT实验室 作者:佚名 发表于:2013-05-15 14:33  点击:
ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小 认真阅读本文,我相信一定会对你有帮助。比如为什么ArrayList里面提供了一个受保护的removeRange方 法?提供了其他没有被调用过的私
ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小……    认真阅读本文,我相信一定会对你有帮助。比如为什么ArrayList里面提供了一个受保护的removeRange方法?提供了其他没有被调用过的私有方法?
    首先看到对ArrayList的定义:
    [java]
    public class ArrayList<E> extends AbstractList<E>  implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    从ArrayList<E>可以看出它是支持泛型的,它继承自AbstractList,实现了List、RandomAccess、Cloneable、java.io.Serializable接口。
    AbstractList提供了List接口的默认实现(个别方法为抽象方法)。
    List接口定义了列表必须实现的方法。
    RandomAccess是一个标记接口,接口内没有定义任何内容。
    实现了Cloneable接口的类,可以调用Object.clone方法返回该对象的浅拷贝。
    通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。序列化接口没有方法或字段,仅用于标识可序列化的语义。
    ArrayList的属性
    ArrayList定义只定义类两个私有属性:
    [java]
    /**
    * The array buffer into which the elements of the ArrayList are stored.
    * The capacity of the ArrayList is the length of this array buffer.
    */
    private transient Object[] elementData;
    /**
    * The size of the ArrayList (the number of elements it contains)。
    *
    * @serial
    */
    private int size;
    [java]
    很容易理解,elementData存储ArrayList内的元素,size表示它包含的元素的数量。
    有个关键字需要解释:transient.
    Java的 serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制 来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient.
    ansient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
    有点抽象,看个例子应该能明白。
    [java]
    public class UserInfo implements Serializable {
    private static final long serialVersionUID = 996890129747019948L;
    private String name;
    private transient String psw;
    public UserInfo(String name, String psw) {
    this.name = name;
    this.psw = psw;
    }
    public String toString() {
    return "name=" + name + ", psw=" + psw;
    }
    }
    public class TestTransient {
    public static void main(String[] args) {
    UserInfo userInfo = new UserInfo("张三", "123456");
    System.out.println(userInfo);
    try {
    // 序列化,被设置为transient的属性没有被序列化
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
    "UserInfo.out"));
    o.writeObject(userInfo);
    o.close();
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    try {
    // 重新读取内容
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(
    "UserInfo.out"));
    UserInfo readUserInfo = (UserInfo) in.readObject();
    //读取后psw的内容为null
    System.out.println(readUserInfo.toString());
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }
    }
    被标记为transient的属性在对象被序列化的时候不会被保存。

有帮助
(0)
0%
没帮助
(0)
0%