Author Archives: susumuis

About susumuis

メイドカフェによく居るWebエンジニア

JVM Operation Casual Talks に参加してきました。

JVM Operation Casual Talks : ATND に参加してきました。

会場はLINE株式会社渋谷オフィス、ヒカリエの27階です。中も景色も綺麗ですね。

 

「カジュアルトーク」なんて言うものだから、きっと、どこかの「基礎勉強会」のような怖い勉強会であることを覚悟して行きました。僕みたいな現場で場当たり的にやってるエンジニアは刺されて来るのではないかと((((;゚Д゚))))ガクガクブルブル

 

コンテンツは

@stanaka15分でわかるJVMのメモリ管理

@oranieCassandra運用で実施しているJVM監視について

@waysakuSpray(Akka)運用でJVMをCPUスケールさせるために行った事

その後LTでした。

 

中でも、最初に発表された@stanakaさんのスライドが非常に網羅的に説明されていますので、JVMに関わる可能性がある方は一度目を通す価値があると思います。

 

さて、僕は、自分がJavaプログラマーとして開発したWebアプリケーションを自社のインフラチームと協力して、時にはGCオプションやインフラの調整を依頼し、時にはアプリのコード改修などを行える立場でJVMと接しています。一方、ここで発表された方々は、他人が作ったJVM上で動くアプリケーションを運用する立場の人たちでした。そういう意味ではうちのインフラチームの人たちに近い立場の方々ですが、自分でソースをいじることが容易ではない状況下での運用の苦しさもあるでしょう。

 

内容は意外と業務を通じて関わってきたことだったので、刺されるというよりは、みんな同じように苦労してるんだなと共感することが多かったです。

 

ちなみに、現時点の僕のうとい理解ではこんな感じです。

G1GC

トータルのGC時間は多く、一回あたりのGC時間が短い

6G、あるいは10GB以上のヒープサイズを割り当てている時に効果がある

Webなどの無停止で運用したいサービスで、メモリサイズが贅沢に割り当てられるときに有効

CMS

トータルGC時間が短い

コンパクションが無いため断片化する。長く無停止運用をすると遅くなる

バッチなど、トータルスループットが求められるときに有効

JVMオプションでのチューニングが必要(nekopさんのエントリを見るべし!)

 

ラストのパネルディスカッションのコーナーでは、なぜJVMを使うのかの問に対して、パネラーの皆さんは「使いたいアプリ(Hadoop、Solr、Cassandra等)がJVM上で動くから」とおっしゃっていました。特にPerlなどのLL出身の人には、GCでStop the Worldしたり、気軽に落とせないということが不満らしく、その反論として落ちないことが良い、という意見がありました。それに対し、いつ落ちてもいいように環境を構築するべきなど色々議論が深まりました。

 

僕にとっては、Javaでしか業務経験がなく、JVMを選択する理由としては「JVMが一番知っているから」というそれこそウルトラ消極的な理由しかありません。今回は、別のバックグラウンドがある人達がJVMに触れた感想を聞くことができたことは非常に有意義でした。

 

ちなみに、この発表の最中僕は下記の間違ったツイートをしたので訂正します。

既に削除していますが、Togetterに残ってしまっているのでごめんなさい。

PalallelGG => Compactionしないので時間が経つと遅くなる #jvmcasual そうなんだよね。

正しくはConcurrent Mark Sweep (CMS)の説明です。「そうなんだよね」とか知ったかもいい加減にです。orz

これは、うちのインフラチームの方がこの辺りチューニングして色々苦労していた話を聞いたので、このことかなと思ったのですが、後になって間違いに気づいた時には既にTogetterにまとめられていたので遅かったです。

 

写真

f:id:s-ishigami:20140408100444j:plain

ヒカリエオフィスエリアのエントランス(広っ!)

 

 

f:id:s-ishigami:20140408100210j:plain

 

 

 

27階景色いい

f:id:s-ishigami:20140408100408j:plain

 

 

入館証もLINE!退館時に返さないとこの会場が使えなくなるから!と言ってました。

f:id:s-ishigami:20140408100411j:plain

クリアファイル配ってました。

 

 

 

 

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 ファンページ)

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