それが僕には楽しかったんです。

ミドルウェアとかやってます

Java で利用できるオプションをバージョン別で比較してくれるサービスを作った話

2021/07/12 VPSMariaDB ビルド用サーバに化けたのでサイトを運用していないです

はじめに

言語のバージョンを変更すると何らかの原因不明なトラブルに遭遇したりする場合がありますが、そういう時明確に機能変更などがあり原因がある程度サクッとわかる場合もあれば、一体どこか原因かわからないといった場合もあると思います。
それらの中で個人的にしんどいのが Java であればオプションのデフォルト値が変更になっていて、production build でそれらを指定していないがために暗黙的に性能劣化を引き起こしてしまうパターンに遭遇することです。

そういったときにどのバージョンからどのバージョンにあげると何が変わるのかということがサクッと見れると嬉しいですが、意外とそういうサービスがなく不便に思ったので作って見ました、という話です。

作ったもの

https://jvm.lrf141.dev/jvm.lrf141.dev

f:id:RabbitFoot141:20210227223136p:plain

こんな感じのサービスを Springboot + Java 11, React で作成しました。

対象となるオプションたち

サイトタイトルの下にもありますが

java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsInitial -version

各バージョン( 現段階では Java 8 ~ 11 の 4 バージョン ) でこれを実行し、json にした上で resoruces ディレクトリに配置し利用しています。

UnlockDiagnosticVMOptions

これは JVM の診断用オプションを有効にするためのオプションです。
診断用と言ってもなんだそれはとなりそうですが、例えば -XX:+LogCompilation や -XX:+PrintInlining といったオプションたちが当てはまります。
これによって色々捗る場合もあるので一応ここでは取得するオプションリストに突っ込んでいます。

UnlockExperimentalVMOptions

これは試験的に追加されているオプション群を利用可能にするというものです。
一応将来的にはサポート予定となっているオプションもあるようですが、基本的にその段階ではガチでサポートされていないオプションたちになります。
Experimental なオプションがその後サポートされたオプションになったケースもあるようで一応追加しています。

改善したい

一応それなりに使えるようにはなりましたが、フロントエンドの細かい部分とかめんどくさがって結構粗い実装になっていたりするので修正したいのと
諸事情でめちゃくちゃ急いで作ったため、バックエンド側のテストも不十分なのでいい加減追加したいなと考えています。

余談

API をいい感じに追加しようと思って設計とかまじめに考えてやってみたのですが、気軽に 1000 行ぐらいになってしまってやはりこの手の機能をちゃんとレイヤーを分割してコードを書くと結構しんどい。

おわりに

なんかこうしたらいいんじゃないかみたいなことがあれば教えてくださいな。