1. 概要

このチュートリアルでは、Javaの配列の最大サイズを確認します。

2. 最大サイズ

Javaプログラムは、特定のサイズまでの配列のみを割り当てることができます。 通常、使用しているJVMとプラットフォームによって異なります。 配列のインデックスは int、 おおよそのインデックス値は2^31 –1にすることができます。 この近似に基づいて、配列は理論的には2,147,483,647個の要素を保持できると言えます。

この例では、LinuxおよびMacマシンでJava8およびJava15のOpenJDKおよびOracle実装を使用しています。 結果は、テスト全体を通して同じでした。

これは、簡単な例を使用して確認できます。

for (int i = 2; i >= 0; i--) {
    try {
        int[] arr = new int[Integer.MAX_VALUE - i];
        System.out.println("Max-Size : " + arr.length);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

LinuxおよびMacマシンを使用して上記のプログラムを実行している間、同様の動作が観察されます。 VM引数-Xms2G-Xmx2Gを使用して実行すると、次のエラーが発生します。

java.lang.OutOfMemoryError: Java heap space
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit

最初のエラーは最後の2つとは異なることに注意してください。 last 2つのエラーはVMの制限に言及していますが、最初のエラーはヒープメモリの制限に関するものです。

次に、VM引数 -Xms9G -Xmx9G を使用して、正確な最大サイズを取得してみましょう。

Max-Size: 2147483645
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)

結果は、の最大サイズが2,147,483,645であることを示しています。

byte boolean long 、およびアレイ内の他のデータ型でも同じ動作が見られ、結果は同じです。

3. ArraySupport

ArraysSupport はOpenJDKのユーティリティクラスであり、最大サイズ a s Integer.MAX_VALUE – 8 を使用して、すべてのJDKで動作するようにすることを提案します。バージョンと実装

4. 結論

この記事では、Javaでの配列の最大サイズについて説明しました。

いつものように、このチュートリアルで使用されるすべてのコードサンプルはGitHubで入手できます。