技術覚書

自分のために技術的なことを色々と書こうと思います。

【行ってきた】(20190718)関ジャバ'19 7月度

こんにちは。
関ジャバに参戦しましたのでエントリーします。

目次

これに参加してきました

kanjava.connpass.com

どうしてこれに参加したの?

  • JVM、サーバレスというキーワードが気になったから。

プログラム内容

  • もう参照渡しとは言わせない 2019 梅雨明け
  • サーバーレスをJavaで組むためのSpring Cloud Function入門
  • JVM再入門

当日やったこと・メモ

もう参照渡しとは言わせない 2019 梅雨明け / Takeda Toyofumiさん

結論

  • Javaに参照渡しはない。

おさらい:Javaの変数

  • プリミティブ型
    • int, boolean, double, charなど。真偽値・数値が入っている。
  • 参照型(クラス型)
    • ポインタ(オブジェクトのアドレス)が格納されている

引数の評価戦略

  • 引数の評価戦略とは:引数がどのようにメソッドに渡されるのか
  • 評価戦略の種類:値渡し、参照渡し、その他etc…
    • 値渡し :値をコピーして渡す。渡った後の値を変えても、呼び出し元の値に影響しない
    • 参照渡し:呼び出し元の値に別名を設定して渡す。渡された値を変えると、呼び出し元の値も変更される。
    • Javaは?:値渡しです。プリミティブも参照型も関係なく値渡し

メソッドの中でオブジェクトを操作することがややこしくしている?

  • 呼び出し元でもaddされてる=参照渡しちゃうんかい??
  • 呼び出し元の参照値が呼び出し先にコピーして渡されているので同じインスタンスを向いているだけ
  • わかりにくさを解消するために生み出した用語が「参照の値渡し」
    • 評価戦略は「どうやって渡すか」の話であって、「何を渡すか」の話はしていない。
    • そもそも「○○渡し」とは、「○○を」渡すではなく、「○○で」渡すということ

よくある反論

  • Javaにおいては参照渡し」でいいのでは?
    • 参照渡しとはプログラム全般の話なので、javaだけ特化するとか変えるとかってわけにはいかない。

サーバーレスをJavaで組むためのSpring Cloud Function入門 / phonypianistさん(阪本 雄一郎さん)

  • 阪本さん・・・「Java本格入門」の著者の一人。

「サーバレスアーキテクチャ」とは?

  • サーバ管理を考慮しなくてよいクラウドアーキテクチャ
    • クラウドベンダが管理
    • 開発者は業務ロジック(Function)にのみ集中
  • 問題点
    • クラウドベンダ依存のコード
      • AWS Lambda、Azure Functionで書き方が違う
      • クラウドベンダ依存⇒ロジックもひきづられる⇒テストやりづらい⇒生産性下がる
    • アプリケーションのライフサイクルがアンコントローラブル

Spring Cloud Functionとは

  • クラウド非依存な書き方
    • クラウドベンダの違いを吸収してくれる。(内部でそれぞれのアダプタがある)
  • API提供
    • Function(Supplier/Consumer)はAPI公開される。
    • FunctionでAPI部品を構築する
    • Controllerが不要
  • 定義による構築
    • application.ymlにFunctionを定義できる。タスクフローも作れる。
    • アプリケーション起動時にコンパイル⇒Bean登録

Spring Cloud Function入門

  • SpringContextの初期化?
    • SpringBootRequesthandler
    • initializeで親クラスのSpringFunctionInitializerへ
    • 初期化済みかどうかをチェック。
    • そうじゃなかったら、SpringBootを初期化する
    • 呼び出すFunction名を取得する
  • Springの初期化→関数が初めて呼び出された「直後」に行われる。※呼び出される直後ではない。

まとめ

  1. Spring Cloud Functionでロジックを「Function」として抽象化してとらえる
  2. Reactorが使える。ただし効果の有無は注意
  3. お宅訪問重要!(コードから本質を理解する)

質疑応答

  • 課金がたくさんかかるかもしれない件

    • Lambdaで落とされる?
    • シンプルなJavaアプリと比べてSpringのアプリはいろんなクラスが呼ばれるので、初期化に時間を要する。 そのため、初回起動時のタイムアウト時間は長めにとっておく必要がある。
  • どうやって勉強してるの?技術追従の方法?

    • 技術系のニュースサイトをウォッチして、気になるキーワードが出てきたら見て、そこから深掘りする

JVM再入門 / aa7thさん(きの子さん)

  • 就活GeekHub
  • Udemy「Java11によるWebアプリケーション開発で学ぶJavaプログラミング入門」

なんでこれを題材に?

  • JVMの勉強
  • 運用フェーズに関わる機会が少ないから

HotSpotVMの話

-JVMのメモリ構造 - Heap領域 - Javaプログラムで生成したオブジェクト - Native領域 - JVM自身が動くのに必要なメモリ - スレッドスタック情報 - クラス/メソッド情報など(Metaspace)

Heap領域

  • new されるたびにメモリに展開されていく
  • スコープから外れたり、null指定されるとGC発動⇒削除される

GCの様子がわかるツールがある

  • GCログ
  • GCViewer
    • JDK11未対応

検証サンプル1:ひたすら空オブジェクトを作るサンプルプログラムを作成

  • Young領域
    • オブジェクトはまずここに作られる
  • Old領域
    • 多く参照されているobjectがここに移動する
  • Young領域のヒープの使用量(灰色線)
  • 全体のヒープ使用量(青色の線)
  • Young領域がいっぱいになったタイミングでマイナーGCが実行されている

検証サンプル2:参照が残るインスタンスをひたすら生成する(ひたすらListにadd)

  • みごとにHeapに蓄積していくさまがわかる。
  • Heapが拡張されていく
  • Old領域がいっぱいになってきて、FullGCが発生する。
    • FullGC:全ヒープ領域が対象(大掃除発動)
  • GC中はアプリケーションスレッドが止まる。(Stop the World)
  • 最後はOutOfMemoryError(OOME)発生する
  • 何度もFullGCが発生しているのがわかる
  • OOME発生時にDumpを出力させることができる(javaコマンドの実行時オプションで指定可能)
  • HeapDumpを見やすくするGUIツールがある(The Eclipse Memory Analyzer)
  • Java11のデータ分析には「JavaMissonControl」を使うといいらしい。(Java11から無償化)

気づき

「もう参照渡しとは言わせない」について

  • Javaの引数については教科書とかネットの情報うのみにしてたなーと改めて思った。

Spring Cloud Functionについて

  • サーバレスアーキテクチャってこんな感じなのかというのは少し理解できてよかった。
  • Spring Cloud Functionを使うことのメリット / デメリット(自分なりにこう思った)
    • メリット :各クラウドベンダの違いを吸収し、ロジックを書くことに集中できる。
    • デメリット:たくさんのクラスが動くので、初期起動に時間を要する。(その分課金が多く発生する)
  • 業務ではサーバレスはもとより、AWSやAzureを使うことがないので、ぴんとこなかったことが多い。もっと勉強が必要。
  • 好奇心をもってアンテナ高く情報収集して、さらに検証を通じて裏どりをして知識を確実なものにしていく姿勢大事。

JVMについて

  • なんとなくは理解してたことが今回の説明で頭が整理された気がする。
  • HeapDumpの見方がわからなかったので、これを機に見方を覚えたり、業務でツールの活用することを検討したい。

参考

www.geekhub.jp

qiita.com

https://www.udemy.com/java11-springbootweb-java/www.udemy.com

spring.io

www.eclipse.org

docs.oracle.com