@blog.justoneplanet.info

日々勉強

Javaでメモリリークする

■失敗例

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack() {
        this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object elm) {
        ensureCapacity();
        elements[size + 1] = elm;
    }
    public Object pop() {
        if(size == 0) {
            throw new EmptyStackException();
        }
        return elements[--size];
    }
    private void ensureCapacity() {
        if(elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1)
        }
    }
}

■修正

以下のようにしてオブジェクトの参照にnullをセットして参照を取り除く。

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack() {
        this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object elm) {
        ensureCapacity();
        elements[size + 1] = elm;
    }
    public Object pop() {
        if(size == 0) {
            throw new EmptyStackException();
        }
        Object elm = elements[--size];
        elements[size] = null;// 廃れた参照を取り除く
        return elm;
    }
    private void ensureCapacity() {
        if(elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1)
        }
    }
}

一般的に独自のメモリ管理をするコードは意図しないオブジェクト保持を起こしやすい。また、キャッシュにおいてもオブジェクトが参照を残したままにする事によってメモリリークを起こすためWeakHashMapなどを用いるべきである。

■まとめ

  • 使い終えたオブジェクトにnullを代入するのは例外的ある
  • 廃れた参照を排除する最善の方法は、参照が含まれていた変数をスコープの外に出す事である(スタック云々)

自己署名のSSL証明書を生成する

以下のコマンドで自己署名のSSL証明書を生成することができる。

■コマンド

openssl genrsa -out server.key 1024 #秘密鍵の生成
openssl req -new -key server.key -out server.csr #CSR(証明書署名要求)の生成…(a)
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key #パスフレーズの削除
openssl x509 -req -days 100 -in server.csr -signkey server.key -out server.crt #自己署名する

(a)の時、Common Nameには証明書を使用するサーバのホスト名と正確に一致する必要がある。

参考

OpenSSLのインストールとキーペアの生成

JavaでSingleton

public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() {}
    private Object readResolve() throws ObjectStreamException {return INSTANCE;}
}
// Elvis.INSTANCE
public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() {}
    public getInstance() {return INSTANCE;}
    private Object readResolve() throws ObjectStreamException {return INSTANCE;}
}
// Elvis.getInstance();
public enum Elvis {
    INSTANCE;
}
// Elvis.INSTANCE