Apakah ada batasan jumlah elemen yang bisa diisi oleh array Java? Jika demikian, apakah itu?
Apakah ada batasan jumlah elemen yang bisa diisi oleh array Java? Jika demikian, apakah itu?
Jawaban:
Belum melihat jawaban yang benar, meskipun sangat mudah untuk diuji.
Dalam HotSpot VM baru-baru ini, jawaban yang benar adalah Integer.MAX_VALUE - 5. Setelah Anda melampaui itu:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
Anda mendapatkan:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
MAX_VALUE-2elemen. Ini independen dari apa yang saya alokasikan, dan saya benar-benar bertanya-tanya untuk apa VM dapat menggunakan dua "hal" untuk (panjangnya tidak muat dalam 2 byte).
Integer.MAX_VALUE+1, Anda akan memiliki integer overflow. Ukuran array di Jawa inttidak long; tidak peduli apa tipe data yang Anda simpan dalam array, byte atau referensi Anda. String hanyalah referensi Objek.
Integer.MAX_VALUE - 22 147 483 645. Java berhasil mengalokasikan array seperti itu jika Anda menjalankannya -Xmx13G. Gagal dengan OutOfMemoryError: Java heap spacejika Anda lulus -Xmx12G.
Ini (tentu saja) benar-benar tergantung pada VM.
Browsing melalui kode sumber dari OpenJDK 7 dan 8 java.util.ArrayList, .Hashtable, .AbstractCollection, .PriorityQueue, dan .Vector, Anda dapat melihat ini klaim sedang berulang:
/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
yang ditambahkan oleh Martin Buchholz (Google) pada 2010-05-09 ; diulas oleh Chris Hegarty (Oracle).
Jadi, mungkin kita dapat mengatakan bahwa jumlah "aman" maksimum adalah 2 147 483 639 ( Integer.MAX_VALUE - 8) dan "upaya untuk mengalokasikan array yang lebih besar dapat menghasilkan OutOfMemoryError ".
(Ya, klaim mandiri Buchholz tidak termasuk bukti pendukung, jadi ini adalah banding yang diperhitungkan kepada otoritas. Bahkan di dalam OpenJDK sendiri, kita dapat melihat kode seperti return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;yang menunjukkan bahwa MAX_ARRAY_SIZEbelum ada penggunaan yang nyata .)
-8?
-8karena byte kata-kata header yang dicadangkan akan menempati.
Sebenarnya ada dua batasan. Satu, elemen maksimum yang dapat diindeks untuk array dan, dua, jumlah memori yang tersedia untuk aplikasi Anda. Bergantung pada jumlah memori yang tersedia dan jumlah yang digunakan oleh struktur data lain, Anda dapat mencapai batas memori sebelum Anda mencapai elemen array yang dapat dialamatkan maksimum.
Pergi dengan artikel ini http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays :
Java telah dikritik karena tidak mendukung array lebih dari 2 31 −1 (sekitar 2,1 miliar) elemen. Ini adalah batasan bahasa; Spesifikasi Bahasa Jawa, Bagian 10.4, menyatakan bahwa:
Array harus diindeks oleh nilai int ... Upaya untuk mengakses komponen array dengan nilai indeks yang panjang menghasilkan kesalahan waktu kompilasi.
Mendukung array besar juga akan memerlukan perubahan pada JVM. Keterbatasan ini memanifestasikan dirinya di bidang-bidang seperti koleksi terbatas pada 2 miliar elemen dan ketidakmampuan untuk file peta memori yang lebih besar dari 2 GiB. Java juga tidak memiliki array multidimensi yang sebenarnya (secara bersamaan dialokasikan blok memori tunggal yang diakses oleh satu tipuan), yang membatasi kinerja untuk komputasi ilmiah dan teknis.
Array adalah bilangan bulat non-negatif yang diindeks, jadi ukuran array maksimum yang dapat Anda akses akan menjadi Integer.MAX_VALUE. Hal lain adalah seberapa besar array yang bisa Anda buat. Itu tergantung pada memori maksimum yang tersedia untuk Anda JVMdan jenis konten array. Setiap elemen array memiliki ukurannya, contoh. byte = 1 byte, int = 4 bytes,Object reference = 4 bytes (on a 32 bit system)
Jadi jika Anda memiliki 1 MBmemori yang tersedia di mesin Anda, Anda dapat mengalokasikan array byte[1024 * 1024]atau Object[256 * 1024].
Menjawab pertanyaan Anda - Anda dapat mengalokasikan ukuran array (memori maksimum yang tersedia / ukuran item array).
Ringkasan - Secara teoritis ukuran maksimum array adalah Integer.MAX_VALUE. Secara praktis itu tergantung pada berapa banyak memori yang Anda JVMmiliki dan berapa banyak yang telah dialokasikan untuk objek lain.
Saya mencoba membuat array byte seperti ini
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
Dengan konfigurasi run ini:
-Xms4G -Xmx4G
Dan versi java:
Versi Openjdk "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mode campuran)
Ini hanya berfungsi untuk x> = 2 yang berarti ukuran maksimum array adalah Integer.MAX_VALUE-2
Nilai di atas memberi itu
Pengecualian di utas "main" java.lang.OutOfMemoryError: Ukuran array yang diminta melebihi batas VM di Main.main (Main.java:6)
Ya, ada batasan pada array java. Java menggunakan integer sebagai indeks ke array dan toko integer maksimum oleh JVM adalah 2 ^ 32. sehingga Anda dapat menyimpan 2.147.483.647 elemen dalam array.
Jika Anda membutuhkan lebih dari panjang maksimal, Anda dapat menggunakan dua array berbeda tetapi metode yang disarankan adalah menyimpan data ke dalam file. karena menyimpan data dalam file tidak memiliki batas. karena file yang disimpan di driver penyimpanan Anda tetapi array disimpan di JVM. JVM menyediakan ruang terbatas untuk eksekusi program.
Jumlah maksimum elemen arrayis (2^31)−1atau2 147 483 647
Integer.MAX_VALUE - 1, Anda akan mendapatkan "java.lang.OutOfMemoryError: Ukuran array yang diminta melebihi batas VM". Jumlah maksimum elemen dalam JDK 6 dan di atas adalah Integer.MAX_VALUE - 2= 2 147 483 645.
Sebenarnya ini pembatasan java caping di 2 ^ 30-4 menjadi 1073741820. Tidak 2 ^ 31-1. Entah mengapa tetapi saya mengujinya secara manual di jdk. 2 ^ 30-3 masih melempar vm kecuali
Sunting: diperbaiki -1 hingga -4, diperiksa pada windows jvm