เข้าใกล้ Java / JVM internals [ปิด]


15

ฉันตั้งโปรแกรมใน Java เป็นเวลาประมาณ 8 ปีและฉันรู้ภาษาค่อนข้างดีในฐานะนักพัฒนา แต่เป้าหมายของฉันคือการเพิ่มความรู้เกี่ยวกับ internals ให้ลึกซึ้งยิ่งขึ้น ฉันเรียนหลักสูตรระดับปริญญาตรีในสาขาการออกแบบ PL แต่พวกเขาเป็นภาพรวมทางวิชาการที่กว้างมาก (ใน Scheme, IIRC)

มีคนแนะนำเส้นทางให้เริ่มเจาะลึกรายละเอียดได้ไหม โดยเฉพาะมีหัวข้อพิเศษ (เช่นการเก็บขยะ) ที่อาจเข้าถึงได้ง่ายกว่าหรือเป็นจุดเริ่มต้นที่ดี มีหนังสือระดับสูงที่ดีเกี่ยวกับ internals ของ JVM และการออกแบบภาษาการเขียนโปรแกรม Java หรือไม่? แนวทางปัจจุบันของฉันจะเริ่มต้นด้วยข้อมูลจำเพาะ JVMและการวิจัยตามต้องการ


2
วิธีการส่วนตัวของฉันจะเป็น (และเป็น) เพื่อหาเหตุผลที่แท้จริงสำหรับสิ่งเล็ก ๆ น้อย ๆ ทั้งหมด "ทำไมมันทำงานเหมือน" กรณีนี้ใน Java auto-boxing ถูกกำหนดอย่างไรประเภททั่วไปทำงานอย่างไร แล้ว var-args ล่ะ? การSUPERตั้งค่าสถานะในไฟล์คลาสทำอะไรได้จริง? ส่วนใหญ่นั้นอธิบายไว้ในสเปค JVM แต่มันต้องมีงานบางอย่างที่จะนำมันออกมาและเข้าไปในสมองของคุณ ;-)
Joachim Sauer

คำตอบ:


13

ฉันทำสิ่งนี้เล็กน้อยเมื่อฉันเริ่มต้นกับ Java เมื่อหลายปีก่อน วิธีการของฉันคือการอ่านข้อมูลจำเพาะของ VMและดูผลลัพธ์ของ javap -c ซึ่งแสดง bytecode ที่แยกส่วนของคลาส ฉันยังพยายามสร้างคลาส java ด้วย bytecode โดยเฉพาะโดยใช้แอสเซมเบลอร์ java bytecode มีแอสเซมเบลอร์ชื่อjasminหากคุณต้องการลอง

คุณอาจต้องการดูเอกสารLambda Expression Translationที่ Brian Goetz ของ Oracle ได้โพสต์ซึ่งครอบคลุมถึงกลยุทธ์ที่จะใช้ในการแปลแลมบ์ดา (การปิด, โดยพื้นฐาน) ที่เพิ่มใน Java 8

คุณสามารถรับซอร์สโค้ดสำหรับHotspot VM จาก OpenJDKและเวอร์ชันการเข้าถึงต้นของคอมไพเลอร์ javac พร้อมการสนับสนุนแลมบ์ดา (hg repository) สำหรับ JDK 8 ถ้าคุณรู้สึกอยากดำดิ่งลงไปในสระลึก

การดูการรวบรวมขยะอาจเป็นความคิดที่ดี ค้นหาอย่างรวดเร็วเปิดบทความดร. ดอบส์นี้เกี่ยวกับ GC ขยะครั้งแรกของ Java ฉันไม่รู้ว่าเป็นการแนะนำที่ดีหรือไม่ ฉันถือว่าคุณรู้แล้วเกี่ยวกับนักสะสมขยะที่มีเครื่องหมายและกวาดและรุ่นทั่วไป ถ้าไม่คุณจะต้องอ่านก่อน


3

แนวคิดเพิ่มเติมบางประการ:

  • เข้าร่วมในโครงการOpenJDK ไม่มีอะไรที่จะเข้าใจการทำงานของซอฟต์แวร์บางตัวได้โดยการแฮ็คมัน!
  • ดูว่าภาษา JVMอื่น ๆ(เช่น Clojure หรือ Scala) สร้างรหัสสำหรับ JVM ได้อย่างไร
  • ทำโปรเจ็กต์ขนาดเล็กที่คุณสนใจและต้องการใช้ JVM internals บางทีอาจใช้บางอย่างเช่นASMเพื่อจัดการกับ bytecode ..

2

หากคุณยังไม่คุ้นเคยกับรูปแบบ Java bytecode ให้ลองเขียนตัวแปลเล็ก ๆ ซึ่งสร้างรหัส Java byte ที่ถูกต้อง (หรือ Jasmin Assembler) และทำให้มันทำงานอย่างถูกต้อง

การเห็น "Hello World" หรือ "4" (รับ 2 + 2) ที่สร้างโดยรหัสของคุณเป็นที่น่าพอใจมาก


1

นอกเหนือจากสิ่งที่คนอื่นพูดให้ดูที่หน้าการปรับแต่งประสิทธิภาพ Java มันมีบทความมากมายเกี่ยวกับการรวบรวมขยะและการปรับแต่งประสิทธิภาพโดยทั่วไป นอกจากนี้ยังมีรายการหนังสือปรับแต่งประสิทธิภาพที่อาจน่าสนใจสำหรับคุณเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.