คำศัพท์ภาษาฮีป Java: คนรุ่นเก่าและรุ่นถาวร


318

ฉันพยายามที่จะเข้าใจในสิ่งที่แนวความคิดของหนุ่มสาว , เก่าและถาวรชั่วอายุอยู่ในคำศัพท์กอง Java และมากขึ้นโดยเฉพาะการมีปฏิสัมพันธ์ระหว่างสามชั่วอายุคน

คำถามของฉันคือ:

  • คนรุ่นใหม่คืออะไร?
  • คนรุ่นเก่าคืออะไร?
  • รุ่นถาวรคืออะไร
  • คนสามชั่วอายุโต้ตอบกันและเกี่ยวข้องกันอย่างไร

สมมติว่าคุณกำลังพูดถึงดวงอาทิตย์ JDK / OpenJDK ดูหน้าบนเว็บไซต์ OpenJDK ในการบริหารการจัดเก็บข้อมูล มีลิงค์เชื่อมโยงไปยังข้อมูลเพิ่มเติมที่ด้านล่าง
นิโคลัสไรลีย์

1
ยังเกี่ยวข้องกับคำถามนี้ "รุ่นอายุ"
gstackoverflow

คำตอบ:


304

ดูเหมือนว่านี่เป็นความเข้าใจผิดที่พบบ่อย ใน JVM ของ Oracle รุ่นถาวรไม่ใช่ส่วนหนึ่งของกอง เป็นพื้นที่แยกต่างหากสำหรับคำจำกัดความของคลาสและข้อมูลที่เกี่ยวข้อง ใน Java 6 และก่อนหน้านี้สตริง interned ยังถูกเก็บไว้ในรุ่นถาวร ใน Java 7 สตริงการฝึกงานจะถูกเก็บไว้ในฮีปวัตถุหลัก

นี่คือการโพสต์ที่ดีในการสร้างถาวร

ฉันชอบคำอธิบายที่ให้ไว้สำหรับแต่ละพื้นที่ในคำแนะนำของ Oracle ใน JConsole :

สำหรับ HotSpot Java VM พูลหน่วยความจำสำหรับการรวบรวมขยะแบบอนุกรมมีดังต่อไปนี้

  • Eden Space (heap): พูลที่หน่วยความจำเริ่มแรกจัดสรรให้กับวัตถุส่วนใหญ่
  • Survivor Space (heap): สระว่ายน้ำที่บรรจุวัตถุที่รอดชีวิตจากการเก็บขยะในพื้นที่เอเดน
  • Generation tenured (heap): พูลที่มีวัตถุที่มีอยู่ในพื้นที่ของผู้รอดชีวิตมาระยะหนึ่งแล้ว
  • การสร้างแบบถาวร (ไม่ใช่ฮีป): พูลที่มีข้อมูลการสะท้อนกลับทั้งหมดของเครื่องเสมือนเองเช่นวัตถุคลาสและวิธีการ ด้วย Java VMs ที่ใช้การแบ่งใช้คลาสของข้อมูลการสร้างนี้แบ่งออกเป็นพื้นที่อ่านอย่างเดียวและอ่านเขียน
  • Code Cache (ไม่ใช่ฮีป): HotSpot Java VM ยังมีแคชโค้ดซึ่งประกอบด้วยหน่วยความจำที่ใช้สำหรับการคอมไพล์และการจัดเก็บโค้ดเนทีฟ

Java ใช้การรวบรวมขยะทั่วไป ซึ่งหมายความว่าหากคุณมีออบเจ็กต์ foo (ซึ่งเป็นตัวอย่างของบางคลาส) เหตุการณ์การรวบรวมขยะที่มีอยู่ (หากยังคงมีการอ้างอิงถึง) ยิ่งมีการเลื่อนระดับมากขึ้นเท่าไร มันเริ่มต้นในคนรุ่นใหม่ (ซึ่งแบ่งออกเป็นหลาย ๆ ช่องว่าง - Eden และเดนตาย) และในที่สุดก็จะจบลงในรุ่นที่ครอบครองหากรอดชีวิตมานานพอ


2
ฉันเชื่อว่าในฐานะของ Java 7, สตริงจะไม่ฝึกงานในรุ่นถาวร
ทิมกู๊ดแมน

คุณพูดถูกฉันแปลกใจที่มีชีวิตรอดมานานมากก่อนที่จะพูดถึง จากนั้นในรุ่นถาวร Java 8 จะได้รับการแทนที่ด้วย metaspace (แม้ว่าฉันไม่แน่ใจว่าความแตกต่างนี้จะเป็นอย่างไร, นอกเหนือจากการถูก จำกัด โดยค่าเริ่มต้น)
Joshua McKinnon

9
โจชัว - เป็นคำพ้องความหมาย "เก่า" กับ "ดำรงตำแหน่ง" และ "พัวพัน" กับ "ผู้รอดชีวิต"
joadha

1
อนุญาตให้ใช้ gen ได้เฉพาะก่อนหน้า Java 8
lwpro2

2
ในกรณีที่คุณยังรอคำตอบอยู่ใช่คุณถูก @joadha ลองดูลิงค์นี้: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

กองถูกแบ่งออกเป็นคนหนุ่มสาวและคนชราดังนี้:

คนรุ่นใหม่ : มันเป็นสถานที่ที่อาศัยอยู่ในช่วงเวลาสั้น ๆ และแบ่งออกเป็นสองช่องว่าง:

  • Eden Space : เมื่อวัตถุที่สร้างขึ้นโดยใช้หน่วยความจำคำหลักใหม่ที่จัดสรรในพื้นที่นี้
  • พื้นที่ผู้รอดชีวิต : นี่คือสระว่ายน้ำที่มีวัตถุที่รอดชีวิตมาได้หลังจากการรวบรวมขยะจาวาจากพื้นที่เอเดน

คนรุ่นเก่า : กลุ่มนี้มีพื้นที่ว่างและเสมือน (สงวนไว้) โดยทั่วไปและจะเก็บวัตถุเหล่านั้นซึ่งรอดชีวิตหลังจากการรวบรวมขยะจากคนรุ่นใหม่

  • พื้นที่ครอบครอง:พูลหน่วยความจำนี้มีวัตถุที่รอดชีวิตหลังจากการรวบรวมขยะหลายครั้งหมายความว่าวัตถุที่รอดชีวิตหลังจากการรวบรวมขยะจากพื้นที่ผู้รอดชีวิต

การสร้างแบบถาวร:พูลหน่วยความจำนี้ตามชื่อยังมีข้อมูลเมตาของคลาสถาวรและตัวให้คำอธิบายเพื่อให้พื้นที่ PermGen สงวนไว้สำหรับคลาสเสมอและคลาสที่เชื่อมโยงกับคลาสเช่นสมาชิกแบบสแตติก

อัพเดต Java8: PermGenถูกแทนที่ด้วยMetaspaceซึ่งคล้ายกันมาก
ความแตกต่างที่สำคัญคือ Metaspace ปรับขนาดแบบไดนามิกเช่นมันสามารถขยายได้ที่รันไทม์
พื้นที่ Java Metaspace: ไม่ จำกัด (ค่าเริ่มต้น)

Code Cache (เสมือนหรือสงวนไว้): หากคุณใช้ HotSpot Java VM สิ่งนี้จะรวมถึงพื้นที่แคชโค้ดที่มีหน่วยความจำซึ่งจะใช้สำหรับการรวบรวมและจัดเก็บรหัสเนทีฟ

ป้อนคำอธิบายรูปภาพที่นี่

มารยาท


@Premraj หมายความว่าMetaspace ปรับขนาดแบบไดนามิกเช่นมันสามารถขยายได้ที่รันไทม์ ? ความแตกต่างเพียงอย่างเดียวโดยค่าเริ่มต้นมันไม่ได้ขึ้นขอบ?
gstackoverflow

1
ยอดเยี่ยม. ฉันอาจรู้ว่าเมธอดของพื้นที่ใด, nativestack และพูลคงที่แบบรันไทม์อยู่ในภาพนี้หรือไม่? และสิ่งที่พวกเขาถือตาม

หากใช้รหัสแคชสำหรับโค้ดวิธีเนทีฟวิธีเนทีฟสแต็ก (แต่ละเธรดจะมีหนึ่งรายการ) จะมีอะไรบ้าง

49

คนรุ่นใหม่คืออะไร?

คนรุ่นใหม่เป็นที่ซึ่งวัตถุใหม่ทั้งหมดได้รับการจัดสรรและมีอายุ เมื่อคนรุ่นใหม่เติมเต็มสิ่งนี้จะทำให้เกิดการรวบรวมขยะเล็กน้อย คนรุ่นใหม่ที่เต็มไปด้วยวัตถุที่ตายแล้วจะถูกรวบรวมอย่างรวดเร็ว วัตถุที่รอดชีวิตบางอย่างมีอายุและในที่สุดก็ย้ายไปยังคนรุ่นเก่า

คนรุ่นเก่าคืออะไร?

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

รุ่นถาวรคืออะไร

การสร้างแบบถาวรประกอบด้วยข้อมูลเมตาที่ JVM ต้องการเพื่ออธิบายคลาสและวิธีการที่ใช้ในแอปพลิเคชัน การสร้างแบบถาวรถูกเติมข้อมูลโดย JVM ที่รันไทม์ตามคลาสที่ใช้โดยแอ็พพลิเคชัน

PermGen ถูกแทนที่ด้วย Metaspace ตั้งแต่ Java 8 รีลีส

พารามิเตอร์PermSize & MaxPermSizeจะถูกละเว้นในขณะนี้

คนสามชั่วอายุโต้ตอบกันและเกี่ยวข้องกันอย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

บทความเกี่ยวกับการสอนเทคนิคและแหล่งที่มาของรูปภาพ oracle: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" กระบวนการรวบรวมขยะทั่วไป " ในบทความด้านบนอธิบายการโต้ตอบระหว่างพวกเขากับไดอะแกรมมากมาย

ดูแผนภาพสรุป:

ป้อนคำอธิบายรูปภาพที่นี่


ยอดเยี่ยม. ฉันอาจรู้ว่าเมธอดของพื้นที่ใด, nativestack และพูลคงที่แบบรันไทม์อยู่ในภาพนี้หรือไม่? และสิ่งที่พวกเขาถือตาม

อ้างถึงdocs.oracle.com/javase/specs/jvms/se7/html/jvms-2.htmlสำหรับรายละเอียดเพิ่มเติม พื้นที่เมธอดถูกสร้างบนการเริ่มต้นเครื่องเสมือน แม้ว่าพื้นที่เมธอดนั้นเป็นส่วนหนึ่งของฮีปอย่างมีเหตุผลการใช้งานแบบง่ายอาจเลือกที่จะไม่เก็บขยะหรือทำให้กะทัดรัด พูลคงที่แบบรันไทม์แต่ละรายการได้รับการจัดสรรจากพื้นที่เมธอด Java Virtual Machine
Ravindra babu

คุณแน่ใจหรือว่า ... ฉันเคยอ่านว่าส่วนหนึ่งของพื้นที่ permgen (ซึ่งไม่ใช่กอง)? journaldev.com/2856/…

เอกสารของออราเคิลเป็นของแท้มากขึ้น
Ravindra babu

มีการตั้งค่าขีด จำกัด สำหรับวัตถุรุ่นใหม่ในหน่วยเวลา (เช่น ms) หรือไม่ หรือรอบ GC?
วัตถุประสงค์มาก

16

เครื่องเสมือน Java ถูกแบ่งออกเป็นสามชั่วอายุ: คนรุ่นใหม่รุ่นเก่าและรุ่นถาวร วัตถุส่วนใหญ่ได้รับการจัดสรรเริ่มต้นในคนรุ่นใหม่ คนเฒ่าคนแก่มีวัตถุที่มีชีวิตรอดจากการสะสมของคนรุ่นใหม่จำนวนหนึ่งรวมถึงวัตถุขนาดใหญ่บางอย่างที่อาจถูกจัดสรรโดยตรงในคนรุ่นเก่า การสร้างแบบถาวรจะเก็บอ็อบเจ็กต์ที่ JVM พบว่าสะดวกในการจัดการตัวรวบรวมขยะเช่นอ็อบเจ็กต์ที่อธิบายคลาสและเมธอดรวมถึงคลาสและเมธอดด้วยตนเอง


1

หน่วยความจำใน SunHotSpot JVM แบ่งออกเป็นสามชั่วอายุ: คนรุ่นใหม่รุ่นเก่าและรุ่นถาวร

  • คนรุ่นใหม่: วัตถุที่สร้างขึ้นใหม่จะถูกจัดสรรให้กับคนรุ่นใหม่
  • Old Generation: หากวัตถุใหม่ร้องขอพื้นที่ฮีปที่ใหญ่ขึ้นวัตถุนั้นจะถูกจัดสรรโดยตรงไปยัง gen เก่า นอกจากนี้วัตถุที่มีชีวิตรอด GC รอบสองสามได้รับการเลื่อนตำแหน่งให้กับ Gen เก่าเช่นวัตถุที่มีชีวิตยืนยาวใน Gen เก่า
  • การสร้างแบบถาวร: การสร้างแบบถาวรจะเก็บวัตถุที่ JVM พบว่าสะดวกในการจัดการตัวเก็บขยะเช่นวัตถุที่อธิบายคลาสและวิธีการรวมถึงคลาสและวิธีการด้วยตนเอง

FYI: gen ถาวรไม่ถือเป็นส่วนหนึ่งของ Java heap

คนสามชั่วอายุโต้ตอบกันและเกี่ยวข้องกันอย่างไร วัตถุ (ยกเว้นวัตถุที่มีขนาดใหญ่) ได้รับการจัดสรรให้กับคนรุ่นใหม่ก่อน ถ้าวัตถุยังมีชีวิตอยู่หลังจาก x ไม่ ของรอบการรวบรวมขยะที่จะได้รับการเลื่อนระดับให้เป็นรุ่นเก่า / อายุใช้งาน ดังนั้นเราจึงสามารถพูดได้ว่าเจนอายุน้อยมีวัตถุอายุสั้นในขณะที่เจนอายุมีวัตถุที่มีอายุยืนยาว ยีนถาวรไม่ได้มีปฏิสัมพันธ์กับอีกสองชั่วอายุคน

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