คำถามติดแท็ก garbage-collection

Garbage collection (GC) เป็นรูปแบบของการจัดการหน่วยความจำอัตโนมัติซึ่งพยายามเรียกคืนขยะหรือหน่วยความจำที่ถูกครอบครองโดยอ็อบเจ็กต์ที่ไม่ได้ใช้งานโดยโปรแกรมอีกต่อไป

4
แนวทางปฏิบัติที่ดีที่สุดในการลดกิจกรรม Garbage Collector ใน Javascript
ฉันมีแอป Javascript ที่ค่อนข้างซับซ้อนซึ่งมีลูปหลักที่เรียกว่า 60 ครั้งต่อวินาที ดูเหมือนว่าจะมีการรวบรวมขยะจำนวนมากเกิดขึ้น (ตามเอาต์พุต 'ฟันเลื่อย' จากไทม์ไลน์หน่วยความจำในเครื่องมือ Chrome dev) - และสิ่งนี้มักส่งผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน ดังนั้นฉันจึงพยายามค้นคว้าแนวทางปฏิบัติที่ดีที่สุดในการลดปริมาณงานที่พนักงานเก็บขยะต้องทำ (ข้อมูลส่วนใหญ่ที่ฉันสามารถหาได้บนเว็บเกี่ยวกับการหลีกเลี่ยงการรั่วไหลของหน่วยความจำซึ่งเป็นคำถามที่แตกต่างกันเล็กน้อย - หน่วยความจำของฉันได้รับการปลดปล่อยเพียงแค่มีการรวบรวมขยะมากเกินไป) ฉันสมมติว่า สิ่งนี้ส่วนใหญ่มาจากการนำวัตถุกลับมาใช้ใหม่ให้มากที่สุด แต่แน่นอนว่าปีศาจอยู่ในรายละเอียด แอปพลิเคมีโครงสร้างใน 'เรียน' ตามสายของจอห์นเรซิกง่าย JavaScript มรดก ฉันคิดว่าปัญหาหนึ่งคือบางฟังก์ชันสามารถเรียกได้หลายพันครั้งต่อวินาที (เนื่องจากมีการใช้งานหลายร้อยครั้งในระหว่างการวนซ้ำของลูปหลักแต่ละครั้ง) และบางทีตัวแปรการทำงานภายในในฟังก์ชันเหล่านี้ (สตริงอาร์เรย์ ฯลฯ ) อาจเป็นปัญหา ฉันตระหนักถึงการรวมกันของวัตถุสำหรับวัตถุที่ใหญ่กว่า / หนักกว่า (และเราใช้สิ่งนี้ในระดับหนึ่ง) แต่ฉันกำลังมองหาเทคนิคที่สามารถนำไปใช้ทั่วกระดานโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับฟังก์ชันที่เรียกหลายครั้งในการวนซ้ำที่แน่นหนา . ฉันสามารถใช้เทคนิคอะไรเพื่อลดปริมาณงานที่พนักงานเก็บขยะต้องทำ? และบางทีอาจใช้เทคนิคอะไรในการระบุว่าวัตถุใดถูกเก็บขยะมากที่สุด (เป็นโค้ดเบสที่ใหญ่มากดังนั้นการเปรียบเทียบสแน็ปช็อตของฮีปจึงไม่เกิดผลมากนัก)

6
ช่องคงเปิดสำหรับการรวบรวมขยะหรือไม่
ให้คลาสยูทิลิตี้สมมุติที่ใช้ในการตั้งค่าโปรแกรมเท่านั้น: class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } } myObject จะถูกเก็บรวบรวมเมื่อไม่มีการใช้งานอีกต่อไปหรือไม่หรือจะคงอยู่ตลอดชีวิตของโปรแกรม?

4
ตัวรวบรวมขยะดีฟอลต์สำหรับ Java 8
ตัวรวบรวมขยะเริ่มต้นสำหรับ Java 8 คืออะไร? เมื่อฉันตรวจสอบ JMX Beans พวกเขาเปิดเผยว่าเป็นตัวสะสมคู่ขนานสำหรับคนรุ่นใหม่และตัวเก็บอนุกรมรุ่นเก่าสำหรับคนรุ่นเก่า

1
เกินขีด จำกัด ค่าโสหุ้ย GC
เวลาสุ่มตัวอย่างที่ JVM ใช้ในการโยน 'java.lang.OutOfMemoryError: GC เกินขีด จำกัด ค่าโสหุ้ย' คืออะไร ฉันรู้ว่าคุณสามารถควบคุม 98% และ 2% ด้วยพารามิเตอร์ GCTimeLimit และ GCHeapFreeLimit แต่เวลาสุ่มตัวอย่างเป็นอย่างไร

6
ไฟล์ชั่วคราว Java ถูกลบเมื่อใด
สมมติว่าฉันสร้างไฟล์ชั่วคราวใน Java ด้วยเมธอด File tmp = File.createTempFile(prefix, suffix); ถ้าฉันไม่เรียกใช้delete()เมธอดอย่างชัดเจนไฟล์จะถูกลบเมื่อใด ตามสัญชาตญาณอาจเกิดขึ้นเมื่อ JVM ยุติการทำงานหรือก่อนหน้านี้ (โดย Garbage Collector) หรือในภายหลัง (โดยกระบวนการกวาดบางระบบปฏิบัติการ)

16
การรวบรวมขยะ Java G1 ในการผลิต
เนื่องจาก Java 7 กำลังจะใช้การรวบรวมขยะ G1 ใหม่โดยค่าเริ่มต้น Java จะสามารถจัดการลำดับขนาดฮีปที่ใหญ่ขึ้นโดยไม่ควรหยุด GC ชั่วคราวได้หรือไม่? มีใครนำ G1 มาใช้จริงบ้างคุณมีประสบการณ์อย่างไรบ้าง? เพื่อความเป็นธรรมครั้งเดียวที่ฉันได้เห็นการหยุด GC ที่ยาวนานจริงๆนั้นอยู่ในกองขนาดใหญ่มากเกินกว่าที่เวิร์กสเตชันจะมี เพื่อชี้แจงคำถามของฉัน G1 จะเปิดประตูสู่ฮีปในหลายร้อย GB หรือไม่ วัณโรค?

4
Android - ตัวสร้างกิจกรรมเทียบกับ onCreate
ฉันเข้าใจว่า Android Activitiesมีวงจรชีวิตที่เฉพาะเจาะจงและonCreateควรถูกลบล้างและใช้สำหรับการเริ่มต้น แต่จะเกิดอะไรขึ้นในตัวสร้าง? มีกรณีใดบ้างที่คุณสามารถ / ควรแทนที่ตัวActivityสร้างด้วยหรือคุณไม่ควรแตะต้องมัน? ฉันสมมติว่าไม่ควรใช้ตัวสร้างเนื่องจากการอ้างอิงถึงActivitiesไม่ได้รับการทำความสะอาดทั้งหมด (จึงขัดขวางตัวเก็บขยะ) และนั่นonDestroyก็เพื่อจุดประสงค์ ถูกต้องหรือไม่

15
การใช้ขั้นสุดท้ายสำหรับตัวแปรใน Java ช่วยปรับปรุงการรวบรวมขยะหรือไม่
วันนี้เพื่อนร่วมงานของฉันและฉันมีการอภิปรายเกี่ยวกับการใช้finalคำหลักใน Java เพื่อปรับปรุงการรวบรวมขยะ ตัวอย่างเช่นหากคุณเขียนวิธีการเช่น: public Double doCalc(final Double value) { final Double maxWeight = 1000.0; final Double totalWeight = maxWeight * value; return totalWeight; } การประกาศตัวแปรในเมธอดfinalจะช่วยให้การรวบรวมขยะล้างหน่วยความจำจากตัวแปรที่ไม่ได้ใช้ในเมธอดหลังจากที่เมธอดออกไป นี่คือเรื่องจริง?

4
Java Thread ขยะเก็บได้หรือไม่
คำถามนี้ถูกโพสต์ในบางไซต์ ฉันไม่พบคำตอบที่ถูกต้องดังนั้นฉันจึงโพสต์ที่นี่อีกครั้ง public class TestThread { public static void main(String[] s) { // anonymous class extends Thread Thread t = new Thread() { public void run() { // infinite loop while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } // as long as this line printed out, …

14
การกำหนดอ็อบเจ็กต์เป็น null ใน Java ส่งผลต่อการรวบรวมขยะหรือไม่
การกำหนดการอ้างอิงอ็อบเจ็กต์ที่ไม่ได้ใช้nullใน Java ช่วยปรับปรุงกระบวนการรวบรวมขยะด้วยวิธีใด ๆ ที่วัดผลได้หรือไม่? ประสบการณ์ของฉันกับ Java (และ C #) สอนฉันว่ามักจะต่อต้านการพยายามและเอาชนะเครื่องเสมือนหรือคอมไพเลอร์ JIT แต่ฉันเคยเห็นเพื่อนร่วมงานใช้วิธีนี้และฉันอยากรู้ว่านี่เป็นแนวทางปฏิบัติที่ดีในการเลือกหรือไม่ หรือหนึ่งในความเชื่อโชคลางการเขียนโปรแกรมวูดู?

1
ปริมาณการใช้หน่วยความจำของ GetRef (การรวบรวมขยะ) เปลี่ยนแปลงด้วย KB4525236
เราพบปัญหาหน่วยความจำไม่เพียงพอหลังจากติดตั้งKB4525236ใน Windows 2016 Servers / Windows 10 Clients GetRefแก้ไขการรักษาความปลอดภัยนี้ดูเหมือนว่าจะมีการเปลี่ยนแปลงช่วงเวลาที่หน่วยความจำที่เก็บขยะเมื่อเรียกฟังก์ชั่นผ่าน ก่อน KB4525236 แต่ละอินสแตนซ์ที่สร้างขึ้นในฟังก์ชั่นที่เรียกใช้ผ่านGetRefได้รวบรวมขยะทันทีที่ตัวแปรอินสแตนซ์ถูกตั้งค่าเป็นnothing โพสต์ KB4525236 เช่นกันสร้างขึ้นในฟังก์ชั่นที่เรียกว่าผ่านGetRefยังคงอยู่ในหน่วยความจำและเก็บขยะเฉพาะเมื่อเสร็จสมบูรณ์ทั้งฟังก์ชั่น เมื่อสร้างอินสแตนซ์ในการวนซ้ำสิ่งนี้สามารถเพิ่มและนำไปสู่หน่วยความจำไม่เพียงพอโดยเฉพาะอย่างยิ่งในกระบวนการ 32 บิต คำถาม เราไม่พบสิ่งที่เกี่ยวข้องทางออนไลน์ดังนั้นเราจึงต้องการได้รับการยืนยันจากผู้อื่นที่ประสบปัญหาเดียวกัน แก้ไขรอยขีดข่วนที่: นี่เป็นปัญหาเดียวกัน แต่ยังไม่มีวิธีแก้ปัญหา ณ (vbscript.dll class_terminate bug ตั้งแต่ KB4524570 (12 พฤศจิกายน 2019) Windows 10 1903) ถ้าใครสามารถตรวจสอบและรู้วิธีแก้ปัญหาที่ใช้การได้นั่นจะยอดเยี่ยม POC สคริปต์ต่อไปนี้ทำงานบนอุปกรณ์ที่ติดตั้ง KB4525236 แสดงความแตกต่างในการรวบรวมขยะเมื่อ เรียกโดยตรง: อินสแตนซ์ที่สองถูกสร้างขึ้นหลังจากอินสแตนซ์แรกถูกทำลาย(นี่คือพฤติกรรมที่เราต้องการ) เรียกผ่านGetRef: อินสแตนซ์ที่สองถูกสร้างขึ้นก่อนที่อินสแตนซ์แรกจะถูกทำลายดังนั้นเมื่อมีสองอินสแตนซ์ที่ใช้หน่วยความจำ บันทึกเป็น: KB4525236.vbs ทำงานเป็น: wscript KB4525236.vbs Dim …

1
พฤติกรรมการเก็บขยะสำหรับนักทำลาย
ฉันมีคลาสง่าย ๆ ที่กำหนดไว้ด้านล่าง public class Person { public Person() { } public override string ToString() { return "I Still Exist!"; } ~Person() { p = this; } public static Person p; } ในวิธีการหลัก public static void Main(string[] args) { var x = new Person(); x = null; GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Person.p …

2
OutOfMemoryException แม้จะใช้ WeakHashMap
หากไม่โทรSystem.gc()ระบบจะส่ง OutOfMemoryException ฉันไม่รู้ว่าทำไมฉันต้องโทรหาSystem.gc()อย่างชัดเจน JVM ควรเรียกgc()ตัวเองใช่ไหม กรุณาแนะนำ ต่อไปนี้เป็นรหัสทดสอบของฉัน: public static void main(String[] args) throws InterruptedException { WeakHashMap<String, int[]> hm = new WeakHashMap<>(); int i = 0; while(true) { Thread.sleep(1000); i++; String key = new String(new Integer(i).toString()); System.out.println(String.format("add new element %d", i)); hm.put(key, new int[1024 * 10000]); key = null; //System.gc(); } …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.