เพื่อนร่วมงานของคุณไม่มีความคิดในสิ่งที่พวกเขากำลังพูดถึง
การดำเนินงานที่มีราคาแพงที่สุดของคุณจะได้รับการฟังให้กับพวกเขา พวกเขาเสียเวลาของคุณไปผิดที่นำคุณไปยังข้อมูลที่เกินสิบปี(ณ วันที่คำตอบเดิมที่โพสต์คำตอบนี้)เช่นเดียวกับที่คุณต้องใช้เวลาโพสต์ที่นี่และค้นคว้าอินเทอร์เน็ตเพื่อความจริง
หวังว่าพวกเขาจะสำนึกในสิ่งที่พวกเขาได้ยินหรืออ่านมานานกว่าทศวรรษแล้วและไม่รู้อะไรเลย ฉันจะทำทุกอย่างที่พวกเขาพูดด้วยความสงสัยเช่นกันนี่ควรจะเป็นความผิดพลาดที่รู้จักกันดีของใครก็ตามที่คอยติดตามอยู่เสมอ
ทุกอย่างเป็นวัตถุ (ยกเว้นprimitives
)
ทุกอย่างที่ไม่ใช่แบบดั้งเดิม ( int, long, double
ฯลฯ ) เป็นวัตถุใน Java ไม่มีวิธีหลีกเลี่ยงการสร้าง Object ใน Java
สร้างวัตถุในชวาเนื่องจากกลยุทธ์การจัดสรรหน่วยความจำของมันจะเร็วกว่า C ++ ในกรณีส่วนใหญ่และเพื่อวัตถุประสงค์ในทางปฏิบัติทั้งหมดเมื่อเทียบกับทุกสิ่งทุกอย่างใน JVM ถือได้ว่า "ฟรี"
เร็วเท่าช่วงปลายทศวรรษที่ 1990 การใช้งาน JVM ในช่วงต้นทศวรรษ 1990 มีค่าใช้จ่ายด้านประสิทธิภาพในการจัดสรรวัตถุจริง สิ่งนี้ไม่ได้เกิดขึ้นตั้งแต่อย่างน้อยปี 2005
หากคุณปรับแต่ง-Xms
เพื่อรองรับหน่วยความจำทั้งหมดที่คุณต้องการเพื่อให้แอปพลิเคชันของคุณทำงานได้อย่างถูกต้อง GC อาจไม่ต้องเรียกใช้และกวาดขยะส่วนใหญ่ในการใช้งาน GC สมัยใหม่โปรแกรมที่มีอายุสั้น ๆ อาจไม่เคย GC เลย
มันไม่ได้พยายามและเพิ่มพื้นที่ว่างซึ่งเป็นปลาเฮอริ่งสีแดงต่อไปมันเพิ่มประสิทธิภาพการทำงานของรันไทม์ ถ้านั่นหมายความว่า JVM Heap จัดสรรเกือบ 100% ตลอดเวลาดังนั้นไม่ว่าจะเป็น หน่วยความจำฮีป JVM ฟรีไม่ได้ให้อะไรคุณเพียงแค่นั่งอยู่ตรงนั้น
มีความเข้าใจผิดว่า GC จะเพิ่มหน่วยความจำกลับไปยังส่วนที่เหลือของระบบในวิธีที่มีประโยชน์ซึ่งเป็นเท็จอย่างสมบูรณ์!
กอง JVM ไม่เติบโตและหดตัวเพื่อให้ส่วนที่เหลือของระบบที่ได้รับผลกระทบในแง่บวกโดยหน่วยความจำฟรีใน JVM กอง -Xms
จัดสรรทั้งหมดของสิ่งที่ระบุเมื่อเริ่มต้นและการแก้ปัญหาคือไม่ปล่อยหน่วยความจำนั้นกลับไปยังระบบปฏิบัติการเพื่อแบ่งปันกับกระบวนการ OS อื่นใด ๆ จนกว่าอินสแตนซ์ของ JVM จะหยุดทำงานอย่างสมบูรณ์ -Xms=1GB -Xmx=1GB
จัดสรร RAM 1GB โดยไม่คำนึงถึงจำนวนวัตถุที่ถูกสร้างขึ้นตามเวลาที่กำหนด มีการตั้งค่าบางอย่างที่อนุญาตให้ปล่อยเปอร์เซ็นต์ของหน่วยความจำฮีป แต่สำหรับวัตถุประสงค์เชิงปฏิบัติทั้งหมด JVM ไม่สามารถปล่อยหน่วยความจำนี้ได้เพียงพอสำหรับสิ่งนี้ที่เคยเกิดขึ้นดังนั้นจึงไม่มีกระบวนการอื่นใดที่สามารถเรียกคืนหน่วยความจำนี้ได้ดังนั้นส่วนที่เหลือของระบบจะไม่ได้รับประโยชน์จาก JVM Heap ที่ว่างเช่นกัน RFE สำหรับสิ่งนี้คือ"ยอมรับ" 29-NOV-2006 แต่ไม่มีอะไรทำเกี่ยวกับมันเลย พฤติกรรมนี้ไม่ถือว่าเป็นเรื่องที่ผู้มีอำนาจเป็นกังวล
มีความเข้าใจผิดว่าการสร้างวัตถุขนาดเล็กจำนวนมากทำให้ JVM หยุดชั่วคราวเป็นเวลานานนี่เป็นเท็จเช่นกัน
อัลกอริทึม GC ปัจจุบันถูกปรับให้เหมาะสมสำหรับการสร้างวัตถุขนาดเล็กจำนวนมากที่มีอายุสั้นซึ่งโดยทั่วไปแล้วจะเป็น 99% ของการแก้ปัญหาสำหรับวัตถุ Java ในทุกโปรแกรม ความพยายามที่Object Poolingจะทำให้ JVM ทำงานได้แย่ลงในกรณีส่วนใหญ่
Objects เดียวที่ต้องรวมกำไรในวันนี้คือ Object ที่อ้างถึงทรัพยากรที่ จำกัด ที่อยู่ภายนอก JVM Sockets, ไฟล์, การเชื่อมต่อฐานข้อมูล ฯลฯ และสามารถนำกลับมาใช้ใหม่ได้ วัตถุปกติไม่สามารถรวมรวมกันได้ในลักษณะเดียวกับในภาษาที่อนุญาตให้คุณเข้าถึงตำแหน่งหน่วยความจำโดยตรง การแคชวัตถุเป็นแนวคิดที่แตกต่างกันและอาจหรืออาจไม่ใช่สิ่งที่บางคนเรียกอย่างไร้เดียงสาว่าการรวมกำไรแนวคิดทั้งสองนั้นไม่เหมือนกันและไม่ควรมีการรวมกัน
อัลกอริธึม GC สมัยใหม่ไม่มีปัญหานี้เพราะพวกเขาไม่ได้ deallocate ตามกำหนดเวลาพวกเขา deallocate เมื่อต้องการหน่วยความจำว่างในบางรุ่น หากฮีปมีขนาดใหญ่พอจะไม่มีการจัดสรรคืนเกิดขึ้นนานพอที่จะทำให้หยุดชั่วคราว
ภาษาไดนามิกเชิงวัตถุกำลังตี C ถึงตอนนี้ในการทดสอบที่ละเอียดอ่อน