Saya tahu bahwa metode ini tidak dapat lebih besar dari 64 KB dengan Jawa. Keterbatasan menyebabkan kita masalah dengan kode yang dihasilkan dari Javacct tata bahasa. Kami punya masalah dengan Java 6 dan mampu memperbaiki hal ini dengan mengubah tata bahasa. Memiliki batas yang telah berubah Jawa untuk 7 atau direncanakan untuk Java 8?
Hanya untuk membuat jelas. Saya don't perlu metode yang lebih besar dari 64 KB dengan diriku sendiri. Tapi saya menulis tata bahasa yang mengkompilasi yang sangat besar metode.
Menurut JVMS7 :
fakta bahwa end_pc eksklusif adalah kesalahan sejarah di desain mesin virtual Java: jika mesin virtual Java code untuk metode ini persis 65535 byte yang panjang dan berakhir dengan sebuah instruksi itu adalah 1 byte panjang, maka instruksi yang tidak dapat dilindungi oleh handler pengecualian. Compiler penulis dapat bekerja di sekitar bug ini oleh membatasi ukuran maksimum yang dihasilkan mesin virtual Java code untuk setiap metode, contoh inisialisasi metode, atau statis penginisialisasi (ukuran dari kode array) untuk 65534 byte.
Tapi ini adalah tentang Jawa 7
. <menyerang>tidak Ada spesifikasi akhir untuk Java 8, jadi tidak ada (kecuali pengembang) bisa menjawab pertanyaan ini.</strike>
UPD (2015-04-06) Menurut JVM8 hal ini juga berlaku untuk Jawa 8
.
Pertanyaan yang bagus. Seperti biasa kami harus pergi ke sumber untuk menemukan jawabannya ("Java® Mesin Virtual Spesifikasi"). Bagian yang tidak secara eksplisit menyebutkan batas (seperti yang dilakukan Java6 VM spec) meskipun, tapi agak hati-hati:
jumlah terbesar dari lokal variabel lokal variabel array dari sebuah frame dibuat atas permintaan dari metode (§2.6) adalah terbatas untuk 65535 dengan ukuran max_locals item Kode atribut (§4.7.3) memberikan kode metode, dan 16-bit variabel lokal pengindeksan Mesin Virtual Java set instruksi.
Cheers,
Itu tidak berubah. Batas kode dalam metode ini masih 64 KB di Jawa 7 dan Java 8.
Referensi:
statis kendala pada Mesin Virtual Java kode dalam sebuah file kelas menentukan bagaimana Java Virtual Machine petunjuk harus diletakkan dalam kode array dan apa operan dari individu instruksi harus.
statis kendala pada instruksi dalam kode array adalah sebagai berikut:
- kode array tidak boleh kosong, jadi code_length item tidak memiliki nilai 0.
- nilai code_length item harus kurang dari 65536.
nilai code_length item memberikan jumlah byte dalam kode array untuk metode ini.
nilai code_length harus lebih besar dari nol (seperti kode array harus tidak boleh kosong) dan kurang dari 65536.
Andremoniy telah menjawab jawa 7
bagian dari pertanyaan ini sudah, tapi tampaknya pada waktu itu segera memutuskan tentang jawa 8
jadi saya lengkapi jawaban untuk menutupi bagian:
Mengutip dari jvms:
fakta bahwa end_pc eksklusif adalah sejarah kesalahan dalam desain Mesin Virtual Java: jika Mesin Virtual Java code untuk metode ini persis 65535 byte yang panjang dan berakhir dengan sebuah instruksi yang 1 byte panjang, maka instruksi yang tidak dapat dilindungi oleh pengecualian handler. Compiler penulis dapat bekerja di sekitar bug ini dengan membatasi ukuran maksimum yang dihasilkan Mesin Virtual Java kode untuk setiap metode, contoh inisialisasi metode, atau statis penginisialisasi (ukuran dari kode array) untuk 65534 byte.
Seperti yang anda lihat ini tampaknya sejarah masalah doesn't tampaknya untuk memperbaiki setidaknya di versi ini (java 8).
Sebagai solusi, and if anda memiliki akses ke parser's kode, anda bisa memodifikasinya untuk bekerja dalam apa pun yang 'batas-batas yang dikenakan oleh JVM compiler ... (Dengan asumsi itu den't mengambil selamanya untuk menemukan bagian-bagian di parser kode untuk mengubah)