มีคำถามหลายข้ออยู่ที่นี่!
1 - วัตถุอายุสั้นมีการจัดการอย่างไร?
ตามที่ระบุไว้ก่อนหน้านี้ JVM ได้อย่างสมบูรณ์แบบสามารถจัดการกับจำนวนมากของวัตถุอายุสั้นเพราะมันเป็นไปตามที่อ่อนแอ Generational สมมติฐาน
โปรดสังเกตว่าเรากำลังพูดถึงวัตถุที่มาถึงหน่วยความจำหลัก (ฮีป) นี่ไม่ใช่กรณีเสมอไป ออบเจ็กต์จำนวนมากที่คุณสร้างไม่เว้นแม้แต่การลงทะเบียน CPU ตัวอย่างเช่นพิจารณาสิ่งนี้สำหรับลูป
for(int i=0, i<max, i++) {
// stuff that implies i
}
อย่าคิดเกี่ยวกับการคลายการวนซ้ำ (การเพิ่มประสิทธิภาพที่ JVM ดำเนินการอย่างมากกับโค้ดของคุณ) ถ้าmax
เท่ากับInteger.MAX_VALUE
คุณวนซ้ำอาจใช้เวลาสักครู่ในการดำเนินการ อย่างไรก็ตามi
ตัวแปรจะไม่หนีจากลูปบล็อก ดังนั้น JVM จะใส่ตัวแปรนั้นในทะเบียน CPU โดยเพิ่มขึ้นเป็นประจำ แต่จะไม่ส่งกลับไปยังหน่วยความจำหลัก
ดังนั้นการสร้างวัตถุหลายล้านชิ้นจึงไม่ใช่เรื่องใหญ่หากใช้เฉพาะในพื้นที่เท่านั้น พวกมันจะตายก่อนที่จะถูกเก็บไว้ในสวนอีเดนดังนั้น GC จะไม่สังเกตเห็นพวกมันด้วยซ้ำ
2 - การลดค่าใช้จ่ายของ GC มีประโยชน์หรือไม่?
ตามปกติมันขึ้นอยู่กับ
ขั้นแรกคุณควรเปิดใช้งานการบันทึก GC เพื่อให้มีมุมมองที่ชัดเจนเกี่ยวกับสิ่งที่เกิดขึ้น คุณสามารถเปิดใช้งานได้ด้วย-Xloggc:gc.log -XX:+PrintGCDetails
ไฟล์.
หากแอปพลิเคชันของคุณใช้เวลาส่วนใหญ่ในวงจร GC ใช่ให้ปรับ GC มิฉะนั้นอาจไม่คุ้มค่าจริงๆ
ตัวอย่างเช่นหากคุณมี GC รุ่นเยาว์ทุกๆ 100 มิลลิวินาทีที่ใช้เวลา 10 มิลลิวินาทีคุณใช้เวลา 10% ใน GC และคุณมี 10 คอลเลคชันต่อวินาที (ซึ่งก็คือ huuuuge) ในกรณีเช่นนี้ฉันจะไม่ใช้เวลาในการปรับ GC เลยเพราะ 10 GC / s เหล่านั้นจะยังคงอยู่ที่นั่น
3 - ประสบการณ์บางอย่าง
ฉันมีปัญหาคล้าย ๆ กันกับแอปพลิเคชันที่กำลังสร้างชั้นเรียนจำนวนมาก ในบันทึก GC ฉันสังเกตเห็นว่าอัตราการสร้างแอปพลิเคชันอยู่ที่ประมาณ 3 GB / s ซึ่งมากเกินไป (มีข้อมูล ... 3 กิกะไบต์ต่อวินาที?!)
ปัญหา: GC บ่อยเกินไปที่เกิดจากการสร้างวัตถุมากเกินไป
ในกรณีของฉันฉันแนบตัวสร้างโปรไฟล์หน่วยความจำและสังเกตเห็นว่าชั้นเรียนเป็นตัวแทนของวัตถุทั้งหมดของฉันเป็นเปอร์เซ็นต์มาก ฉันติดตามการสร้างอินสแตนซ์เพื่อพบว่าคลาสนี้เป็นบูลีนคู่หนึ่งที่ห่อหุ้มด้วยวัตถุ ในกรณีนั้นมีสองวิธีแก้ไข:
ฉันเลือกอันที่สองเนื่องจากมีผลกระทบน้อยที่สุดกับแอปพลิเคชันและแนะนำได้ง่าย ฉันใช้เวลาไม่กี่นาทีในการสร้างโรงงานที่มีแคชที่ไม่ปลอดภัยสำหรับเธรด (ฉันไม่ต้องการความปลอดภัยของเธรดเนื่องจากในที่สุดฉันก็มีอินสแตนซ์ที่แตกต่างกันเพียง 4 รายการ)
อัตราการจัดสรรลดลงเหลือ 1 GB / s และความถี่ของ Young GC ก็เช่นกัน (หารด้วย 3)
หวังว่าจะช่วยได้!