トラブルシューティング時に役立つ(かもしれない)JetBrains IDEとJVM設定の話

Masaru Horioka

こんにちは。JetBrains 堀岡です。

IntelliJ IDEA や PyCharm を始めとする JetBrains IDEで問題があった場合、

「JBRのバージョンを上げてください」
「.vmoptionsファイルを編集します」

というインターネット上の情報を見て、Javaをやっている人は何となく察しがつく一方、JavaScriptやPHP、Ruby、Pythonでプログラミングを始め、Javaの経験の無い方は「何それ???」と戸惑ってしまうのではないでしょうか。

JetBrains IDE は、JVM(Java Virtual Machine)上で動作するプログラムです。そのため、IDEの動作をカスタマイズしたり、トラブルシューティングの際に、IDEがどのようにJVM上で実行されるかを知っておくと、役立つことがあります。

今回のブログポストでは、私自身のトラブルシューティングやテクニカルサポートの経験から、JetBrains IDE ユーザーが知っておくと役立つ(と思われる)IDEの設定とJVM関連のトピックをご紹介します。

  • JBRとその役割
  • JBR関連の問題とその対応(Choose Runtimeプラグインの利用)
  • .vmoptionsファイルとその役割
  • .vmoptions関連の問題とその対応

JBR(JetBrains Runtime)とは

JetBrains IDE製品には、JetBrains Runtime(JBR)と呼ばれるIDE自体の実行に使用されるJava実行環境が同梱されています。これは皆さんが書くコードのコンパイルや実行に使用するためのJDKとは(本来)別のものです。

例えば、私のmacOS環境でJetBrains Toolbox AppでインストールしたIntelliIJ IDEAの場合、以下の場所にJBRのjavaやjavacコマンドがあります。

~/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/201.8538.31/IntelliJ IDEA 2020.1 EAP.app/Contents/jbr/Contents/Home/bin

JetBrainsのJBR confluence ページによると、JBRはOpenJDKをベースとしており、JetBrains IDE用に最適化(主に表示関連の拡張やバグフィクス)されたものであることが記載されています。

JBRは、JBR独自の変更に加え、ベースとなるOpenJDKの変更を取り込むよう日々更新されています。新しいバージョンの変更内容や既知の問題は、以下で公開されています。

JBRリリースノート
https://confluence.jetbrains.com/display/JBR/Release+notes

JBRに報告されている不具合
https://youtrack.jetbrains.com/issues/JBR

Java開発者向け – JDKの設定に関する注意事項

JBRをプロジェクト用のSDKに指定しない

2020.1以前では、(開発対象のコードのコンパイル/ビルドや実行に用いられる)Project SDKにIntelliJ IDEAに同梱されているJBRが指定可能になっていました。本来、皆さんが書くコードのコンパイル/ビルドや実行にJBRを使用することは適切ではありません
現在(2020.1)では以下の通り、マニュアルでも開発コードのビルド用JDKとしてJBRを使用しないよう、注意書きが掲載されています。

IntelliJ IDEA 2020.1以降では、IDEの新規プロジェクト作成やプロジェクト設定画面から、簡単にJDKをダウンロードやインストールしたり、インストール済みのJDKを指定できるようになっているので、Project Settingsのプロジェクトまたはモジュール用SDKの設定で、(IDE起動用のJBRではない)開発用のJDKを必ず指定するようにしましょう。

SDK設定(オンラインマニュアルより)
日本語
https://pleiades.io/help/idea/sdk.html
英語
https://www.jetbrains.com/help/idea/sdk.html

何もしてないのに、プロジェクトを開いたら、StringやSystemクラスに赤い警告でが表示されるようになって壊れた

なんらかの原因でSDK設定がクリアされてしまっていることがあるようです。まずは、上記で紹介したSDK設定を確認し、必要に応じて再設定を行い解決するか確認すると良いでしょう。

Choose Runtime プラグインでIDEの実行に使用されるJBR/JREを変更する

IDEをバージョンアップすると同梱されるJBRのバージョンも新しいものになります。

通常、JBRのバージョンアップは、パフォーマンスや安定性の向上等に寄与するものですが、実際のところ、OpenJDKのベースコードの変更やJBR独自の変更が新たな問題の原因となることも少なくありません。
JetBrainsの日本語ブログでも、過去、以下のようなJBRのバージョンが上がったことで発生した問題を紹介しました。(日本語も含む)キーボード・入力関連の問題や、表示パフォーマンスの問題等の問題はJBRに起因することが多くあるようです。

上記のような、特定のJBRバージョンに起因する問題では、

  • IDEが使用するJBRのバージョンを(新しいもの、または古いものに)変更する
  • (JBRではない)OpenJDK を使用する

ことにより、問題を回避することができるケースがあります。

JetBrains IDEの起動に使用されるJREを変更するためには、Choose Runtimeプラグインをインストールし使用する必要があります。Choose Runtimeプラグインを用いると、IDE起動時に使用されるJBRのインストールとダウンロード、および、インストール済みのJRE/JDKを、IDE起動用として指定することが可能です。

Choose Runtimeプラグインのインストールおよび使用方法は以下を参照ください。

Javaラインタイムの変更(オンラインマニュアルより)
日本語:
https://pleiades.io/help/idea/switching-boot-jdk.html
英語:
https://www.jetbrains.com/help/idea/switching-boot-jdk.html

さらに詳しい話は、以下のテクニカルサポート記事をご覧ください。
Selecting the JDK version the IDE will run under
https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under

なおIDEの起動JBR/JREの変更は、どなたでもお試しいただくことは可能ですが、意図しない問題を避けるため、JetBrainsテクニカルサポートの指示またはJetBrainsより公開されている資料に基づき変更することが推奨されています。

IDEの起動JVMオプションを制御する.vmoptionsファイル

.vmoptionsファイルの役割および動作原理

前述のとおり、JetBrains IDEは、JVM上で動作します。メモリの割り当てサイズ等、パフォーマンスに関する項目や、一部のIDEの動作はJVMオプションにより制御されます。

.vmoptionsファイル(拡張子が.vmoptions)は、JetBrains IDE起動時に参照される、JVMオプションを指定するための設定ファイルです。(JetBrains独自の仕組みではないので、実行ファイル化されたJavaアプリケーションが使用する設定ファイルと呼ぶ方が正しいかもしれません。)

通常のJavaプログラムの場合、以下の例のように java コマンドの実行時オプション(引数)として、JVMオプションを指定します。

java -Xmx512m -Dmyprop=myvalue -jar foo.jar

一方、JetBrains IDEでは、IDEの実行ファイルが、実行ファイルと同じディレクトリに存在する「<IDEの実行ファイル>.vmoptions」を読み込み、「<IDEの実行ファイル>.vmoptions」ファイル内で指定されたJVMオプションを用いてプログラムを実行します。

例えば、Windows環境の場合、idea64.exe(64bit用IntelliJ IDEA実行ファイル)を実行すると、idea64.exeが同じディレクトリに存在するidea64.exe.vmoptions ファイルを読み込み、そこで指定されたオプション(上記コマンドの例で言うと「-Xmx512m -Dmyprop=myvalue」相当)がプログラム実行時に使用されます。
例えば、私環境のmacOS環境のToolbox AppでインストールしたIntelliJ IDEAの.vmoptionsファイルは以下のようになっています。

-Xms128m
-Xmx4096m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
-Dide.no.platform.update=true
-Didea.plugins.path=/Users/JBUser/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/201.8743.12/IntelliJ IDEA.app.plugins

.vmoptionsファイルは何のために使用されるか

JetBrains IDEを使っているけど、.vmoptionsファイルの存在はを知らない方も多いかもしれませんが、例えば、以下のケースで使われています。

IDEが使用するメモリの割り当て

IDEのパフォーマンスを向上させるために、以下のようにJetBrains Toolbox AppやIDEのメニューから、IDEが使用するメモリ(最大ヒープサイズ)を変更している方も多いと思います。実は、ここで指定した値は.vmoptionsファイルに保存されています(そして指定値を有効にするには、IDEの再起動が必要です)。

  • IDEからの場合、Help | Change Memory Setting から指定できます。
  • JetBrains Toolbox App の場合、 IDEごとのSettings | Configuration の Maximum heap size から指定できます。

Pleiades日本語化プラグイン

(これはJetBrainsの製品ではありませんが) Pleiades日本語化プラグインでIDEを日本語化*されている方も多いのではないでしょうか? Pleiadesをインストーラー経由でインストールすると、(IDEが指定されたPleiadesプラグインをロードしてUIを日本語化するために).vmoptionsファイルに以下の行が追加されます。

-Xverify:none
-javaagent:(構成ディレクトリのフルパス)/jp.sourceforge.mergedoc.pleiades/pleiades.jar

そのため、Pleiades日本語化プラグインを無効化したい場合、上記行をコメントアウトする必要があります。

参考:「IntelliJ IDEA / PyCharm 等 JetBrains IDE 2020.1 アップデート関連の問題と対処」
https://blog.jetbrains.com/ja/2020/04/11/2966/
*2020年7月現在、IDE製品の日本語化については、JetBrains Japanese Language PackのEAP版が公開されています。こちらは.vmoptionsを変更することなく、IDEのプラグインとして簡単にインストールや更新、不必要な場合の無効化も可能です。まだ試されたことがない方はご確認ください。

IDE上での特定の機能における文字化けの回避

https://youtrack.jetbrains.com/issue/IDEA-237684 のような問題を回避のため使用しているケースもあるようです。

.vmoptionsファイルを直接開いてJVMオプションを確認・指定する

IDEの動作に関連のあるJVMオプションについては、オンラインマニュアルに記載があります。

パフォーマンスチューニング等のため、.vmoptionsファイルの編集が必要な場合は、後述するトラブルを避けるため以下で表示されるファイルのみ編集すると覚えておくと良いでしょう。

  • IDEの Help | Edit Custom VM options…
  • Toolbox Appの IDEごとのSettings | Configuration | Java Virtual Machines options にある 「Edit…」
    • IDEの右側の六角ナットアイコンをクリックし、Settings を選択
    • Configuration | Java Virtual Machines options にある 「Edit…」をクリックすると、.vmoptionsファイルをエディタで開き、編集することができます。
      • Windows で[Edit…] ボタンを押してもエディタが起動しない場合、適当な場所(デスクトップ等)に拡張子が.vmoptionsの ファイル(例: foo.vmoptions)を作成し、Windows上でエディタ等と.vmoptionsファイルの関連付けを行ってから再度お試しください。

複数の.vmoptionsファイルの存在に注意

ここまで.vmoptionsファイルがどのように使用されるかという基本を紹介しました。実際はもう少し複雑です。

JetBrainsサポート記事 「Configuring JVM options and platform properties」の記載によると

VM options are loaded from the IDE_HOME\bin\<product>[bits][.exe].vmoptions file or from the copy of this file in the config directory (if it exists). Please note that .vmoptions file from the config directory has the priority over the original file in the bin directory.

と書かれています。
すなわち、
・.vmoptionsファイルは実行ファイルと同じ場所に加え、configディレクトリにコピーが存在する。
・configディレクトリにある.vmoptionsファイルが存在する場合、実行ファイルと同じ場所にある.vmoptionsファイルより優先される
と書かれています。
このconfigディレクトリにある.vmoptionsファイルはIDEのメニューからメモリ設定またはCustom VM Optionsの設定を行うと作成されるものです。

さらに、Toolbox App からインストールしたIDEの場合、前述のToolbox App管理下の.vmoptionsファイルが優先して使用されます。

というやや複雑な状況のため、

  • 「ある時はToolboxやIDEのGUIのメニューから開いた.vmoptionsファイルを変更し」
  • 「ある時はインターネット上で探したトラブルシューティング記事を参考に、IDE実行ファイルと同じ場所にある.vmoptionsファイルを編集したり」
  • 「編集した.vmoptionsファイルがバージョンアップに伴い、古いバージョンから引き継がれてきたり」
    という状況が重なった場合、変更を期待して編集した.vmoptionsファイルと実際IDEが実行時に参照するファイルが異なるという状況が発生し、期待した動作にならずにハマってしまうということが起こりえます。

.vmoptionsファイルの設定でハマったら

.vmoptionsファイルの変更が期待通り効いていない場合は、
ログディレクトリにあるidea.logファイルを見てみましょう。

以下の例のように

  • どのようなJVMオプションが指定されているか
  • どのパスの.vmoptionsファイルが使用されているか

を確認することができます。

INFO – #com.intellij.idea.Main – JVM Args: -Xms128m -Xmx4096m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 …

-Djb.vmOptionsFile=/Users/<USER_NAME>/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/201.8538.31/IntelliJ IDEA.app.vmoptions

ただし、自分て見ても解決出来そうにない場合は、テクニカルサポートに気軽にご相談ください。
参考:
JetBrainsテクニカルサポートの利用方法

おわりに

細かい話になりましたが、JetBrains IDEとJVM周りの話(JBRや.vmoptions)について、テクニカルサポートでよく問題になるポイントを紹介しました。
本記事について、不明点や内容に関してフィードバックがありましたら、日本語営業窓口まで遠慮なくお知らせください。