Monthly Archives: 3月 2014

sun.misc.Unsafeを使う

コンストラクタを呼ばないでインスタンスを生成してリフレクションで横から強制的に初期化という行為が必要だった。sun.misc.UnsafeというAPIを使用するとできるらしいのでやってみた。あっけなく出来てしまった。まずは今回テストしたコードを下記に貼り付けます。

import java.lang.reflect.Field;
import sun.misc.Unsafe;

public class UnsafeTest {
    public UnsafeTest() {
        throw new RuntimeException("can't instantiate this class");
    }

    private String name = "";

    public void hello() {
        System.out.println("hello, " + name);
    }

    public static void main(String[] args) {
        Unsafe unsafe = getUnsafe();
        try {
            while (true) {
                UnsafeTest instance = (UnsafeTest) unsafe.allocateInstance(UnsafeTest.class);
                instance.name = "hoge";
                instance.hello();
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

    private static Unsafe getUnsafe() {
        try {
            Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
            singleoneInstanceField.setAccessible(true);
            return (Unsafe) singleoneInstanceField.get(null);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

 

実行すると延々と、"hello, hoge"と出力されます。

このクラスはコンストラクタを呼ぶと例外を飛ばす酷いやつですが、ちゃんとインスタンス化できていることがわかります。

 

コードUnsafeインスタンスの取得がリフレクション経由になっていますが、どうやら、この取り方が自分が調べた限り主流のようです。

理由は

  • Unsafeオブジェクトはprivateコンストラクタなのでインスタンス化できない
  • Unsafe.getUnsafe()メソッドはセキュリティ制御されていて、trustedなクラスからしか使用できない
  • けど、そいつのインスタンスはUnsafeクラスのstaticインスタンス theUnsafe に格納されているから、リフレクションで「盗む」ことができる

ということみたいです。

詳しくは http://mishadoff.github.io/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

 

無限ループにしたのは、Unsafeという名前にビビったので、まさかメモリ管理されないとかないか、調べるためです。

実行させたまま、jvisualvmででヒープ情報を見たところ右肩上がりにはなっていないことがわかります。

結果は次の通り

なお、この結果は環境に依存するものですので、他の方の環境では同じ結果になるとは限りませんのでご了承下さい。

 

Java7

f:id:s-ishigami:20140331102547p:plain

 

Java8

f:id:s-ishigami:20140331103427p:plain

Java5

f:id:s-ishigami:20140331100738p:plain

念の為に、heap dumpも取っていましたがUnsafeTestのインスタンス数は0となっていましたので、確かにGCされているようです。

 

 


僕の行きつけのお店「サカノウエカフェ」について

今日は僕がよく訪れるお店を紹介します。


文京区湯島、東京の真ん中にあるのにローカル色が強い土地です。湯島天神は初詣と梅祭りなどの一部の時期は賑わいますが、それ以外は静かなスポットです。そんな僕の住む街にある「サカノウエカフェ」は、その名の通り御徒町方面、お茶の水方面から上る二本の坂の頂に店を構えています。
中は今風のおしゃれなカフェで、帽子の似合うイケメン店長が切り盛りしています。僕はよくノマドワークをするので、MacBookAirを持ちこんで利用しています。もちろん、電源も心良く貸してくれます。

コーヒーは一杯390円、とても香り深く、何杯でもおかわりしたくなってしまいます。
おしゃれなので女性たちのランチ、おしゃべりにも利用されるようですが、夜にこのお店に訪れると別の側面を見ることができます。

この店のオープンは22時までですが、湯島・本郷界隈の夜は真っ暗なので、この店だけほのかに優しい明かりをともして、行き交う人の訪れを待っています。

夜は地元の人たちが集まってきます。聞けば、あの店の主人、この店のママ、近くに住むOLや学生、地元の人のラウンジのようになっています。普段は客同士の交流はありませんが、僕が初めて訪れた日は、湯島に住んで70年、戦時中生まれのたいへん元気なおじいちゃんと仲良くなったことをきっかけに、その他のお客さんも交えて、楽しくお話させて頂きました。

夜はちょっと一杯お酒を飲むのが良い店です。カフェでちょっと一杯するのは、飲み過ぎなくていいですね。

ベイリーズカフェ


赤ワインとナポリタン


ランチのキッシュディッシュ(ランチはコーヒーがおかわり自由!)

良いお店ですが、湯島駅や御茶ノ水駅から少し離れたところにありますので、友達を誘いずらいのが難点です。湯島天神や東大など、近くに用事があって来たときには立ち寄ることをお勧めします。

2014/03/27 追記

書き忘れましたが、ここの店長はFacebookでも頑張っています。毎日遊び心あふれる素敵な投稿をされているので、行きたくなる理由の一つになっています。
サカノウエカフェ (Facebook ファンページ)

また、店内はかわいい小物で一杯です。こういう作り込みもお店の魅力だと思っています。