JavaOneで知った!
 これからのJava
            フリュー株式会社
                  阪田 浩一
     @jyukutyo/id:jyukutyo
      1
http://www.youtube.com/watch?v=b-Cr0EWwaTk




                          2
場もあったまった
  ところで


   3
2013 Summer



     4
JDK 8 が来る!



    5
大きなものは



  6
Project Lambda



      7
(前回の関ジャバで
 やりました)


    8
id:jyukutyoと
id:backpaper0の


      9
はてダをご覧ください



    10
1点新たに知ったこと



    11
FileFilter x = (File f) -> f.canRead();

は

FileFilter x = File::canRead;

とも書ける。




                    12
Project Jigsaw



      13
新たな
モジュール管理機構


    14
追加されるもの



   15
•グループ化と依存関係
•バージョン管理
•カプセル化
•オプション
•エイリアス
           16
module-info.java
      に記述


       17
たとえば今、
こういうクラスがある


    18
com.foo.Main
com.foo.Other
com.foo.ui.Shell

        19
com.fooパッケージ
以下をグルーピング


     20
// module-info.java

module com.foo { }




                      21
com.foo.Mainクラス
をエントリポイントに


       22
// module-info.java

module com.foo {
  class com.foo.Main;
}




                      23
依存するJARが
 あるとき


   24
今まで。



 25
$ java -cp app.jar:bar.jar:baz.jar ...




                    26
JAR Hell



   27
これから。



  28
// module-info.java

module com.foo {
  requires org.bar.lib;
  requires edu.baz.util;
}




                      29
バージョニング



   30
// module-info.java

module com.foo @ 1.0.0 {
  requires org.bar.lib @ 2.1-alpha;
  requires edu.baz.util @ 5.2_11;
}




                      31
カプセル化



  32
// module-info.java

module com.foo.secret @ 3 {
  permits com.foo.lib;
}

com.foo.libからしか、
com.foo.secretは呼び出せない。



                      33
オプション



  34
// module-info.java

module com.foo.app {
  requires com.foo.lib;
  requires optional com.foo.extra;
}




                      35
集約



36
// module-info.java

// Module aliases
module com.foo.lib {
  provides com.foo.lib.db;
  provides com.foo.lib.ui;
  provides com.foo.lib.util;
}



                      37
モジュールをまとめる



    38
新しいフォーマット
   jmod


    39
モジュールファイル
  と呼ぶ


    40
jpkgコマンドで
 生成できる


    41
JDK 9では!



   42
セルフチューニングな
    JVM


     43
末尾再帰の継続渡し
  ができる!


    44
ビッグデータ対応!



    45
1つのJVMでの
マルチテナント対応!


    46
の予定です



  47
Java EE



   48
実はNo.1



  49
Java EE 7は
 全世界で
 4000万DL

    50
Java EE 8



    51
•JSF   2.2

•JPA   2.1

•EJB   3.2




             52
クラウド対応



  53
PaaSには
スタンダードが
 ないから

   54
Java EEで吸収



    55
プロビジョニングに
履歴管理モデルを
   導入

    56
伸縮性とクラスタ、
自動サービスレベル管理


     57
マルチテナントを
@Multitenantで


      58
NIO 2のAPIに対応



     59
つまり
WebSocketのような
プロトコルをサポート


      60
ReadListenerと
WriteListener


      61
AsyncIOInputSourceと
 AsyncIOOutputSink


         62
を追加



 63
public class NIOSampleServlet extends HttpServlet
  protected void doGet(HttpServletRequest request,
! ! ! ! ! ! ! ! ! ! ! HttpServletResponse response) {
    final ServletInputStream sis = request.getInputStream();
    final ServletOutputStream sos = response.getOutputStream();

        sis.setReadListener(new ReadListener() {
          public void onDataAvailable() {
            sis.read(new byte[sis.dataAvailable()]);
          }
          ...
        });

        sos.setWriteListener(new WriteListener() {
          public void onWritePossible(int size) {
            try {
              byte b[] = new byte[size];
              sos.write(b);
            }
            ...
        });
    }
}

                                     64
セキュリティ



  65
CSRF対策



  66
XSS対策で
エンコーディングと
エスケープをサポート


    67
その他雑多ネタ



   68
Project Coin



     69
switch文でString
   使えるけど


      70
switch(s) {
  case "a":
  case "b":
    return 10;
  case "c":
  case "d":
    return 20;
  ...
}



                 71
一体
どうなってるの?


   72
// Desugared
int $t = -1;
switch(s.hashCode()) {
  case 0x61: // "a".hashCode()
    if(s.equals("a")) $t = 1; break;
  case 0x62:
    if(s.equals("b")) $t = 2; break;
  ...
}

switch($t) {
  case 1:
  case 2:
    return 10;
  case 3:
  case 4:
    return 20;




                                 73
Project Lambdaで
 ダイアモンド継承


       74
interface A { void m() default ...; }

interface B extends A { void m()
! ! ! ! ! ! ! ! ! ! ! ! default ...; }

interface C extends A { }

class D implements B, C { ... }
// which is called when call D.m()...




                      75
interface A { void m() default ...; }

interface B extends A { void m()
! ! ! ! ! ! ! ! ! ! ! ! default ...; }

interface C extends A { }

class D implements B, C { ... }
// B.m used if no D.m

Bがm()をオーバーライドしているので、
より特化したBのm()が使われる


                      76
じゃあこれは?



   77
interface A { void m() default ...; }

interface B { void m() default ...; }

class C implements A, B {
  public void m() {
    m();
  }
}
// what happens?



                      78
コンパイルエラー



   79
interface A { void m() default ...; }

interface B { void m() default ...; }

class C implements A, B {
  public void m() {
    A.super.m();
  }
}
// A.m()を明示的に呼び出す必要がある(ダサい)



                      80
次は



81
セッションを1つ
ダイジェストで


   82
Low Latencyに
するためのGC基礎


     83
in HotSpot VM



      84
オブジェクトの
アロケーションは
very cheap

    85
だいたい
10 CPU命令


   86
だから
生存期間が短い
オブジェクトの

   87
アロケーションは
  全然OK


   88
マイナーGCで
すぐ回収される


   89
マイナーGCは
 早いし
 問題なし

   90
アロケーションより
オブジェクトの保存の
   方が

    91
レイテンシに
インパクトがある


   92
ただし、頻繁なGCは
年齢が早く上がり


    93
プロモーションが
  起こって


   94
フルGCが走るから
 そこは注意


    95
そして



 96
並行GCを使おう



   97
並行GC =
アプリケーションが
  停止しない

    98
-XX:+UseParallelOldGC
          か
 -XX:+UseParallelGC


          99
(JDK6のほとんどの
環境でデフォルト)


     100
CMS(Concurrent
Mark & Sweep)
 を使ってもいい

      101
–XX:+UseConcMarkSweepGC




           102
けど、
Conncurrentは


     103
ライトバリアが
いるので注意


   104
オーバーヘッドになる
   ので


    105
case by caseで



      106
Stop the World
    するGCは


      107
ライトバリアが
 いらない


   108
理想的には



  109
Parallel GCで、
Old世代の解放を避ける


       110
ちなみに



 111
大きなオブジェクトは



    112
アロケートも
 初期化も
高価です!

  113
ヒープに
フラグメンテーション
発生させちゃうかも

    114
配列とかのリサイズも
  そうだよ


    115
オブジェクト
プーリングも
潜在的に問題

  116
GCは生きている
 オブジェクトを
マークしていくもの!

    117
プールはロックが
  いるし、
スケーラビリティ--

    118
GCの振る舞いを
 観察しよう


   119
-XX:+PrintGCDetails
      と一緒に



         120
-XX:+PrintGCTimeStamps
          か
-XX:+PrintGCDateStamps
         を指定


          121
GCログの可視化は
GChisto(java.net)
        で

        122
あとは
  VisualVMの
VisualGCプラグイン
     とか
      123
ミッション
コントロール
 とか

  124
早すぎる最適化は
  しない!


   125
プロファイル
しましょう


  126
という感じでした



   127
一番おもしろかった
  セッション


    128
トラブルシューターの頭の中身
∼7年間のJavaトラブルシュートサービ
        スから




         129
(ひいき目なしに)



    130
おまけ



 131
Java資格試験も
  変わる!


    132
オラクルマスターと
   同様


    133
134
ブロンズ、シルバー、
  ゴールドへ


    135
旧資格保持者には
 移行試験あり


   136
最後に



 137
JavaOneでは
関ジャバメンバーも
活躍しました!

     138
@cero_t



   139
140
パネルディスカッションと
 BOFセッションで登壇



      141
@kiy0taka



    142
143
Special LT
   で登壇


    144
ご清聴
ありがとう
ございました

  145

関ジャバ JavaOne Tokyo 2012報告会