คุณสามารถบังคับให้บัฟเฟอร์เก่าปล่อยหน่วยความจำได้ทันทีด้วย
((DirectBuffer) buffer).cleaner().clean();
ข้อจำกัดความรับผิดชอบ: ฉันใช้สิ่งนี้กับ Sun/Oracle/OpenJDK Java 6 อัปเดต 18 และใหม่กว่าเท่านั้น อาจใช้งานไม่ได้หรือทำงานไม่ถูกต้องกับเวอร์ชันเก่าหรือแพลตฟอร์มอื่นๆ ขอบคุณ @EJP .
เว้นแต่ว่าคุณมีระบบปฏิบัติการ 32 บิต ฉันจะแมปไฟล์ทั้งหมดลงในหน่วยความจำ (โดยใช้การแมปหลายรายการ) ซึ่งจะมีประสิทธิภาพและจัดการง่ายกว่ามาก ในสถานการณ์นี้ ฉันจะล้างข้อมูล ByteBuffers โดยเป็นส่วนหนึ่งของการปิดไฟล์เท่านั้น (ในการทดสอบหน่วย)
คุณสามารถใช้หน่วยความจำเสมือน TB และใช้พื้นที่ทางกายภาพหรือดิสก์เพียงเล็กน้อยได้ ในตัวอย่างนี้ ฉันจับคู่หน่วยความจำเสมือนขนาด 8 TB บนเครื่องที่มีหน่วยความจำ 24 GB และไดรฟ์ขนาด 120 GB
http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
โดยสรุป: บนหน่วยความจำเสมือนของเครื่อง 64 บิตนั้นมีราคาถูกอย่างเหลือเชื่อ ไม่ใช่สิ่งที่คุณต้องกังวล
BTW: เครื่อง 64 บิตส่วนใหญ่จริงๆ แล้วจำกัดอยู่ที่ 48 บิตของหน่วยความจำเสมือน นี่เป็นขีดจำกัดที่ 256 TB แทนที่จะเป็น 16 EB (18,000,000 TB) ที่สามารถระบุได้ในทางทฤษฎี
คุณอาจพบว่าห้องสมุดนี้น่าสนใจ ฉันไม่ได้พูดถึงมันมาก่อนเพราะมันอาจไม่เหมาะกับคุณ แต่คุณอาจพบว่าแนวทางและเทคนิคบางอย่างที่ฉันใช้ในโค้ดน่าสนใจ
https://github.com/peter-lawrey/Java-Chronicle
person
Peter Lawrey
schedule
05.03.2012