#chiroito ’s blog

Java を中心とした趣味の技術について

2020-01-01から1年間の記事一覧

JJUG CCC 2020 Fall で「パフォーマンスのトラブルシュート入門」という内容で喋ってきました

2020年11月7日(土)に開催された JJUG CCC 2020 Fall にて「パフォーマンスのトラブルシュート入門」というタイトルで話をしてきました。 動画はこちらです。 CCC 2020 Fall A02-パフォーマンスのトラブルシュート入門 スライドはこちらになります。 speake…

The changes of JVM Specifications - JVM仕様の変更点

Java 8 以降の Java 仮想マシンの仕様のうち、各バージョンの差分を洗い出しました。the が that になったり、item が entry になる変更で、文の意味が変らない変更は除いています。 I listed the differences between each version of the Java Virtual Mac…

最初の1リクエスト目で何をしているのか?

1 リクエスト目がもの凄く遅くなると言う話を聞いたので分析してみました。 今回は、SpringBootのアプリケーションを OpenJDK 14 で動かしています。そのアプリケーションへ 5 回のリクエストを投げてみて処理のされ具合にどんな違いがあるのかを確認してみ…

Rediness Probeでアプリケーションが十分にJITされたことを検知する

どうも、趣味でOpenJDKのコミッタをやってます。JVMの専門家ではないです。 今回はJITコンパイルによる暖気が十分に行われてから処理を受けられるようにする方法を紹介します。 今回の実装は Oracle の有償機能から OpenJDK へ寄贈され OpenJDK 11 に追加さ…

JITとコードの暖気の実体

どうも、趣味でOpenJDKのコミッタをしてます。 とあるブログを読んでいたら気になる点があったので検証してみました。 JITと暖気 Javaプロセスはアプリケーションを動かしながら必要に応じてバックグラウンドでバイトコードをネイティブコードにコンパイルし…

OpenJDK開発記:IntelliJ IDEA を使って OpenJDK を開発する (WSL編)

これは何? OpenJDK には、リポジトリを IntelliJ IDEA で開けるように変換するスクリプトがあります。このスクリプトを使うと、IntelliJ IDEA で OpenJDK の Java の部分の開発ができるようになります。 しかし、このスクリプトは Linux と Cygwin (たぶん…

OpenJDK開発記:JDK-8249720: Generated bytecodes of EventWriter don't be output to the logを直してみた。

これは何? 今回、パッチを書いたのはJDK-8249720のGenerated bytecodes of EventWriter don't be output to the logです。 [JDK-8249720] Generated bytecodes of EventWriter don't be output to the log - Java Bug System VM起動引数に-Xlog:jfr+system+…

Java のメモリ上にあるバイトコードをクラスファイルとして出力

開発者は Java 言語でソースコードを書き、そのソースコードは Javac というコンパイラでバイトコードに変換されクラスファイルとなり、クラスファイルは Jar ファイルとしてまとめられ、 Java コマンドでアプリケーションとして実行します。 アプリケーショ…

JFR Under the hood : JFRイベントの書き込み -Java編-

結論 C/C++ 側で Java のjdk.jfr.internal.EventWriterが作成されます。このインスタンスにはThreadLocalに作られたJava用のバッファへのポインタを保持しています。イベントが書込まれるとEventWriterはそのイベントをこのバッファへ書込みます。この書き込…

JFR Under the hood : StartFlightRecordingのVM引数をJFRへ適用する処理

結論 VM起動引数として指定された-XX:StartFlightRecording=xxx=xxx,yyy=yyyという形式のパラメータは、VMを起動する途中で、JFRのパラメータを初期化するメソッド(JfrOptionSet::initialize)でjcmd の方法に変換されます。その後、VMはJFRのパラメータを設…

JFR Under the hood : ローカルで動くJFR Event Streamingのリアルタイム性

結論 ローカルに作られるリポジトリからイベントを読み込みます。イベントは非同期でこのファイルに書込まれます。そのため、本当の意味でのリアルタイムにはイベントは処理されないため気を付けましょう。 JFR Event Streamingとは Java 14 で追加された JF…

Quarkus で JFR Event Streaming

Java 14 から JDK Flight Recorder で取得した情報を Java プロセス内で処理する JFR Event Streaming が導入されました。今回はこれを Quarkus で使ってみたいと思います。 今回のサンプルでは JFR では標準的な情報を取得するようにします。JFR Event Stre…

Infinispan と Spring Session を使ったセッションレプリケーション

環境 SpringBoot 2.3.0 Infinispan 10.1.7 サンプルソースはこちら GitHub - chiroito/spring-session-sample 手順 Java EE がインフラの設定だけで実現できることと比べ、SpringBoot はアプリ側を少し書き換えて設定しないと行けません。 手順は以下のとお…

HotRod ストアを使ったWildflyのセッションレプリケーション

これまでは、リモートストアを使用して HTTP セッションを Infinispan やその商用製品である Red Hat Data Grid へオフロードしていました。ですがその方法は Wildfly 14 (JBoss EAP 7.2)から古くなったようです。新しい方法は同バージョンから導入されたely…

OpenShift のクラスタモニタリングスタックを Infra ノードで動かす

OpenShift のクラスタモニタリングスタックの設定を変更するには、クラスタモニタリングの ConfigMap を変更する必要があります。この ConfigMap が存在しない場合は、参考の URL にあるマニュアルにある通り作成します。 設定をする前にまずはクラスタモニ…

OpenShift の Router が Infra ノードで動くようにする

Infraノードを足しても OpenShift のインフラである Router が Infra ノードに移らなかったので、移るようにするメモです。 ノードは以下の様になっています。 $ oc get nodes -n openshift-machine-api NAME STATUS ROLES AGE VERSION ip-10-0-129-22.us-ea…

OpenShift でプロジェクトのテンプレートを変更する

プロジェクト(名前空間)を作る時に最初からいろいろな制限など決まり切った内容を毎回行う場合があると思います。そのような作業を減らすため、テンプレートを使って最初から反映したプロジェクトを作れるようにしてみます。 テンプレートの変更 まずはテ…

Htpasswd ファイルを使って OpenShift にユーザを追加する

最初にユーザを作る時はパスワードファイル(passwordfile)も同時に作成します。 $ htpasswd -c -B -b passwordfile user1 MyPassword! 2人目移行のユーザを作る時はパスワードファイルの作成は不要なので、-cオプションを外します。 $ htpasswd -B -b passwo…

AWS 上に構築した OpenShift に Infra ノードを追加する

コンテナイメージレジストリやルータなどインフラを構成する要素のみをホストするようなマシンをインフラノードと言います。今回はこの様なノードを AWS 上で構築した OpenShift 4.3 に追加します。 インフラノードとワーカーノードの違いは以下の要素を含ん…

AWS 上に IPI で OpenShift を構築したら削除処理が止まった

AWS も OpenShift も超初心者なので OpenShift を壊してしまったため IPI で再構築しようとopenshift-install destroy clusterで削除してたら止まってしまった。 openshift-install --log-level debug destroy clusterで再実行したら以下の様なログが出た。…

家電のケーブルを整理してる方法をまとめてみた

ケーブルが長く弛んでいるととても見栄えが悪いし邪魔なので普段から付属のケーブルを破棄して良い感じのケーブルを買うようにしています。毎回自分の購入履歴から探して買うのですが、せっかくなので公開してみました。 ケーブルを整理するためには、基本的…

Github上の最新のInfinispanを使う

Infinispanを使う時はDownload - Infinispanのようなダウンロードサイトで必要なファイルをダウンロードして使います。しかし、開発しているGithub上の最新バージョンを使って動かしたい時もあるでしょう。そんな時はビルドした後に出来上がる成果物を使いま…

OpenJDK の Author から Committer になりました

これまで通算11個のパッチを書いたので、推薦してもらい、OpenJDKコミュニティ内での信任投票の結果 OpenJDK の Committer になりました。 ※推薦してもらった時点では12個でしたが、その間に1個ダメになったので11個でした。 他のOSSだと1個パッチを書くだけ…

Infinispan Hot Rod の Distributed-cache で Cache Store/Loader を使う

キャッシュからデータを取得する時に、キャッシュにデータが乗っていないためキャッシュミスが発生し、RDBMSやオブジェクトストレージなどのデータストアからデータを取得し、次に備えてキャッシュに載せると言うことがあります。また、キャッシュの更新や他…

Infinispan Hot RodのDistributed-cacheで自作のエンティティを使う

インメモリデータグリッドを使用するにあたり分散キャッシュを使って自作のデータ型となるエンティティを使うことは避けられないでしょう。今回はHot Rodを使ったDistributed-cacheでどうやって自作のエンティティを使うかを紹介します。 オブジェクトを読み…

Infinispan の Hot Rod で設定ファイルとコードによる設定を組み合わせる

Infinispanを触ってて、設定ファイルで設定した内容に加え、コードによる設定を足したいなと思うことがあったので書いてみました。 以下の通りにするとHot Rodの設定ファイルであるresources/hotrod-client.propertiesを読み込みつつ、コードによる設定もで…

Infinispan のクライアントサーバモードでget/putの性能測定

Infinispan をクライアントサーバモードで動かした時の、実行回数をスレッド数を変えて性能測定してみました。 環境 クライアントとサーバのマシンを1台ずつ用意しています。サーバマシンにはInfinispanを2プロセス起動しています。 使用したInfinispanは10.…

Infinispan をクライアントサーバモードで使ってみる

今回は、Infinispan をクライアントサーバモードでキャッシュを使用してみます。 デフォルト設定で作成してあるmycacheという名前のキャッシュを使用します。サンプルコードではまず、このキャッシュを取得します。最後にそのキャッシュにあるデータの件数や…

Infinispan のライブラリモードでget/putの性能測定

Infinispan をライブラリモードで動かした時の、実行回数をスレッド数を変えて性能測定してみました。 環境 Lenovo X1 Xtremeで、4コアのI5-9400H を搭載しています。 ベンチマーク 今回試した処理は get と put です。 以下が実行回数のグラフで、get は左…

Infinispan をライブラリモードで使ってみる

今回は、Infinispan をライブラリモードでキャッシュを使用してみます。 デフォルト設定でキャッシュを作成し、そのキャッシュにmycacheという名前を付けます。そして、mycacheというキャッシュを取得します。最後にそのキャッシュにあるデータの件数やデー…