Mendekati internal Java / JVM [ditutup]

15

Saya telah memprogram di Jawa selama sekitar 8 tahun dan saya tahu bahasanya dengan baik sebagai pengembang, tetapi tujuan saya adalah untuk memperdalam pengetahuan saya tentang internal. Saya telah mengambil kursus sarjana dalam desain PL, tetapi mereka adalah ikhtisar akademik yang sangat luas (dalam Skema, IIRC).

Dapatkah seseorang menyarankan rute untuk mulai menggali detail? Secara khusus, apakah ada topik tertentu (misalnya, pengumpulan sampah) yang mungkin lebih mudah didekati atau menjadi titik awal yang baik? Apakah ada buku tingkat tinggi yang layak tentang internal JVM dan desain bahasa pemrograman Java? Pendekatan saya saat ini adalah memulai dengan spesifikasi JVM dan penelitian sesuai kebutuhan.

spinning_plate
sumber
2
Pendekatan pribadi saya adalah (dan sedang) menemukan alasan sebenarnya untuk semua kasus "mengapa persisnya bekerja seperti ini" di Jawa. Bagaimana auto-boxing didefinisikan, bagaimana cara kerja tipe generik. Bagaimana dengan var-args? Apa yang sebenarnya dilakukan SUPERflag pada file kelas? Sebagian besar dijelaskan dalam JVM spec itu sendiri, tetapi membutuhkan beberapa usaha untuk mengeluarkannya dari sana dan ke dalam otak Anda ;-)
Joachim Sauer

Jawaban:

13

Saya melakukan sedikit ini ketika saya mulai dengan Java, bertahun-tahun yang lalu. Pendekatan saya adalah membaca spesifikasi VM , dan untuk melihat output dari javap -c, yang menampilkan bytecode yang dibongkar dari sebuah kelas. Saya juga mencoba membuat kelas-kelas java dengan bytecode tertentu, menggunakan assembler java bytecode. Ada assembler bernama jasmin , jika Anda ingin mencobanya.

Anda mungkin juga ingin melihat dokumen Terjemahan Ekspresi Lambda yang diposting oleh Brian Goetz dari Oracle, yang mencakup strategi yang akan digunakan untuk menerjemahkan lambda (penutupan, pada dasarnya) yang ditambahkan di Java 8.

Anda juga bisa mendapatkan kode sumber untuk Hotspot VM dari OpenJDK , dan versi akses awal kompiler javac dengan dukungan lambda (repositori hg) untuk JDK 8, jika Anda benar-benar ingin menyelam ke ujung kolam.

Melihat ke pengumpulan sampah mungkin merupakan ide yang bagus. Pencarian cepat menemukan artikel Dr. Dobbs tentang GC pertama di Jawa ini. Saya tidak tahu apakah itu perkenalan yang bagus. Saya berasumsi Anda sudah tahu tentang mark-and-sweep dan pengumpul sampah generasi; jika tidak, Anda harus membaca yang pertama.

David Conrad
sumber
3

Beberapa ide tambahan:

  • Terlibatlah dalam proyek OpenJDK . Tidak ada yang mengalahkan memahami internal beberapa perangkat lunak dengan meretasnya!
  • Lihatlah bagaimana bahasa JVM lainnya (misalnya Clojure atau Scala) menghasilkan kode untuk JVM
  • Lakukan proyek mini yang menarik minat Anda dan membutuhkan penggunaan internal JVM. Mungkin menggunakan sesuatu seperti ASM untuk memanipulasi bytecode ..
mikera
sumber
2

Jika Anda belum terbiasa dengan format bytecode Java, maka pertimbangkan untuk menulis compiler kecil yang membuat kode byte Java yang valid (atau assembler Jasmin) dan membuatnya berjalan dengan benar.

Melihat "Hello World" atau "4" (diberikan 2 + 2) yang dihasilkan oleh kode Anda sangat memuaskan.


sumber
1

Selain apa yang orang lain katakan, lihat halaman Java Performance Tuning . Ini berisi banyak artikel tentang pengumpulan sampah dan penyempurnaan kinerja secara umum. Ini juga berisi daftar buku tuning kinerja yang mungkin menarik untuk Anda juga.

Andreas Johansson
sumber