วิธีการเพิ่มหน่วยความจำใน Java?


146

มีวิธีการเพิ่มหน่วยความจำใน Java คล้ายกับfree()ฟังก์ชั่นของ C หรือไม่? หรือการตั้งค่าวัตถุให้เป็นโมฆะและอาศัย GC เป็นตัวเลือกเท่านั้น?


151
ตกลง ... ขอสิ่งหนึ่งที่ตรง เพียงเพราะคุณคิดว่าบางสิ่งบางอย่างเป็นการปฏิบัติที่ไม่ดีและไม่ใช่สิ่งที่จะสนับสนุนการทำไม่ได้ทำให้มันมีค่าลงคะแนน นี่เป็นคำถามที่ชัดเจนและถูกต้องถามว่ามีวิธีที่จะปล่อยหน่วยความจำใน Java โดยไม่ต้องพึ่งพาการเก็บขยะ ในขณะที่มันอาจจะหมดกำลังใจและโดยทั่วไปแล้วไม่มีประโยชน์หรือเป็นความคิดที่ดีคุณไม่สามารถรู้ได้ว่ามีสถานการณ์ที่ไม่จำเป็นต้องใช้โดยไม่รู้ว่าเฟลิกซ์รู้อะไร เฟลิกซ์อาจไม่ได้วางแผนที่จะใช้มัน เขาอาจต้องการทราบว่าเป็นไปได้ ไม่ควรลงคะแนนเลย
Daniel Bingham

7
สำหรับการชี้แจงนั้นมีวัตถุประสงค์เพื่อคนที่โหวตสิ่งนี้ไม่จำเป็นต้องมีความคิดเห็นก่อนหน้านี้
Daniel Bingham

คำตอบ:


96

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

นี้จัดการหน่วยความจำเอกสาร (PDF) อาจช่วยอธิบายสิ่งที่เกิดขึ้น

นอกจากนี้คุณยังสามารถโทรติดต่อSystem.gc()เพื่อแนะนำว่าตัวรวบรวมขยะทำงานได้ทันที อย่างไรก็ตาม Java Runtime ตัดสินใจขั้นสุดท้ายไม่ใช่รหัสของคุณ

อ้างอิงถึงเอกสาร Java ,

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


5
มันบังคับให้ตัวรวบรวมข้อมูลขยะทำงาน แต่ไม่ได้บังคับให้หน่วยความจำฟรี แต่ ...
ปาโบลซานตาครูซ

13
ไม่มี Pablo มันไม่ได้บังคับให้ GC รัน
Jesper

1
ฉันได้รับการบอกเล่าจากบุคคลที่น่าเชื่อถืออย่างมากว่านักสะสมขยะของ HotSpotVM นั้นเพิกเฉยSystem.gc()อย่างสิ้นเชิง
Esko

1
ใน winXp java SE GC ใช้งาน System.gc () หรือเกือบทุกอย่าง แต่เอกสาร API ไม่รับประกัน
teodozjan

2
@Pablo Santa Cruz คุณหมายถึงอะไรมันไม่ได้เป็นหน่วยความจำฟรี ฉันเพิ่งทดสอบมันในโปรแกรมของฉันที่ดูเหมือนจะมีการรั่วไหลและการใช้ ram ดูเหมือนจะเสถียรหรือไม่? และแดเนียลเพิ่งบอกว่ามันแสดงให้เห็นเท่านั้นแล้วเปอร์เซ็นต์การใช้หน่วยความจำจะเสถียรในแต่ละครั้งที่ฉันเรียกวิธีนั้นมาทำไม พวกคุณทำให้ฉันสับสน

65

ดูเหมือนว่าไม่มีใครพูดถึงการตั้งค่าการอ้างอิงวัตถุอย่างชัดเจนnullซึ่งเป็นเทคนิคที่ถูกต้องตามกฎหมายในการ "เพิ่ม" หน่วยความจำที่คุณอาจต้องการพิจารณา

ตัวอย่างเช่นสมมติว่าคุณประกาศวิธีList<String>เริ่มต้นของวิธีการที่ขยายขนาดให้ใหญ่มาก แต่จำเป็นต้องใช้จนถึงวิธีครึ่งทาง ณ จุดนี้คุณสามารถตั้งค่าการอ้างอิงรายการเป็นnullเพื่ออนุญาตให้ตัวรวบรวมขยะสามารถเรียกคืนออบเจ็กต์นี้ได้ก่อนที่วิธีการจะเสร็จสิ้น

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


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

5
สถานที่ที่การตั้งค่าการอ้างอิงวัตถุเป็นโมฆะมีความสำคัญคือเมื่อมีการอ้างอิงจากวัตถุที่มีอายุยาวนานอื่น (หรืออาจมาจาก var แบบคงที่) ตัวอย่างเช่นหากคุณมีอาร์เรย์ของวัตถุขนาดใหญ่ที่มีอายุการใช้งานยาวนานและคุณหยุดใช้วัตถุเหล่านี้คุณควรตั้งค่าการอ้างอิงอาร์เรย์เป็น null เพื่อทำให้วัตถุพร้อมใช้งานสำหรับ GC
Hot Licks

22
System.gc(); 

รันตัวรวบรวมขยะ

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

ไม่แนะนำ.

แก้ไข: ฉันเขียนคำตอบดั้งเดิมในปี 2009 ตอนนี้เป็นปี 2558

นักสะสมขยะได้ดีขึ้นเรื่อย ๆ ในรอบ 20 ปีของ Java ณ จุดนี้หากคุณโทรหาผู้รวบรวมขยะด้วยตนเองคุณอาจต้องพิจารณาแนวทางอื่น ๆ :

  • หากคุณบังคับให้ GC ใช้งานในจำนวนที่ จำกัด เครื่องมันอาจคุ้มค่าที่จะให้ load balancer ชี้ไปที่เครื่องปัจจุบันรอให้มันเสร็จสิ้นการให้บริการกับลูกค้าที่เชื่อมต่อหมดเวลาหลังจากผ่านไประยะหนึ่งสำหรับการเชื่อมต่อที่แขวนอยู่ - เริ่มต้น JVM ใหม่ นี่เป็นวิธีการแก้ปัญหาที่เลวร้าย แต่ถ้าคุณดูที่ System.gc () การบังคับให้รีสตาร์ทอาจเป็นสิ่งที่เป็นไปได้
  • พิจารณาใช้ตัวรวบรวมขยะอื่น ตัวอย่างเช่นตัวสะสม G1 (ใหม่ในช่วงหกปีที่ผ่านมา) เป็นตัวแบบหยุดชั่วคราว มันใช้ซีพียูมากขึ้นโดยรวม แต่ก็เป็นการดีที่สุดที่จะไม่บังคับให้หยุดการทำงานอย่างหนัก ตั้งแต่ตอนนี้ซีพียูเซิร์ฟเวอร์เกือบทั้งหมดมีหลายคอร์นี่เป็น A Good Good Tradeoff ที่จะมี
  • ดูการใช้หน่วยความจำของคุณในการปรับแต่งค่าสถานะ โดยเฉพาะอย่างยิ่งใน Java เวอร์ชันใหม่ถ้าคุณไม่มีอ็อบเจกต์ที่รันในระยะยาวลองพิจารณาขนาดของ newgen ในฮีป newgen (อายุน้อย) เป็นที่ที่มีการจัดสรรวัตถุใหม่ สำหรับเว็บเซิร์ฟเวอร์ทุกอย่างที่สร้างขึ้นสำหรับการร้องขอจะถูกวางไว้ที่นี่และหากพื้นที่นี้เล็กเกินไป Java จะใช้เวลาเพิ่มเวลาในการอัพเกรดออบเจ็กต์ไปยังหน่วยความจำที่มีอายุการใช้งานยาวนานขึ้น (หาก newgen มีขนาดเล็กเกินไปเล็กน้อยคุณจะต้องจ่ายให้) ตัวอย่างเช่นใน G1:
    • XX: G1NewSizePercent (ค่าเริ่มต้นถึง 5 อาจไม่สำคัญ)
    • XX: G1MaxNewSizePercent (ค่าเริ่มต้นคือ 60; อาจเพิ่มได้)
  • ลองบอกกับนักเก็บขยะว่าคุณไม่โอเคกับการหยุดอีกต่อไป สิ่งนี้จะทำให้ GC ทำงานบ่อยขึ้นเพื่อให้ระบบรักษาข้อ จำกัด ที่เหลืออยู่ ใน G1:
    • XX: MaxGCPauseMillis (ค่าเริ่มต้นคือ 200)

1
การแสดงความคิดเห็นในโพสต์ของฉันนี้มักจะไม่ทำอะไรเลยและการเรียกมันซ้ำ ๆ อาจทำให้ JVM ไม่เสถียรและไม่เกี่ยวข้อง มันอาจวิ่งไปหาสุนัขของคุณ เข้าหาด้วยความระมัดระวัง
Dean J

1
ผมจะวางเน้นหนักที่ "แนะ" เป็นส่วนหนึ่งของ "เรียกวิธี GC ที่แสดงให้เห็นว่า JVM ขยายความพยายาม"
ด้านข

2
@Jesper, คำตอบของ Dean ระบุ "แนะนำ" ในความเป็นจริงเขาโพสต์เอกสารที่แน่นอนจาก javadocs ของวิธีการ ...
ด้านข

2
@ ซอฟต์แวร์ Monkey: ใช่ฉันสามารถแก้ไขได้ แต่เนื่องจาก Dean J ทำงานอย่างชัดเจน (โพสต์เมื่อไม่กี่นาทีที่ผ่านมา) ฉันคิดว่ามันเป็นมารยาทที่ขอให้เขาทำ หากเขาไม่มีฉันก็จะกลับมาที่นี่และแก้ไขและลบความคิดเห็นของฉัน
Daniel Pryden

1
นอกจากนี้เรายังควรพูดว่าทำไมไม่แนะนำ หาก JVM ให้ความสนใจกับ "ข้อเสนอแนะ" เพื่อเรียกใช้ GC แน่นอนว่ามันจะทำให้แอปของคุณทำงานช้าลงโดยอาจเป็นเพราะขนาดของคำสั่ง!
สตีเฟ่น C

11

* "ฉันใช้ตัวแปร nulling เป็นตัวยึดตำแหน่งสำหรับการลบที่เหมาะสมในอนาคตตัวอย่างเช่นฉันใช้เวลาในการทำให้องค์ประกอบทั้งหมดของอาร์เรย์เป็นโมฆะก่อนที่จะลบจริง ๆ

สิ่งนี้ไม่จำเป็น วิธีการทำงานของ Java GC คือการค้นหาวัตถุที่ไม่มีการอ้างอิงดังนั้นถ้าฉันมี Object x ที่มีการอ้างอิง (= ตัวแปร) a ที่ชี้ไปที่มัน GC จะไม่ลบเนื่องจากมีการอ้างอิง ไปยังวัตถุนั้น:

a -> x

หากคุณไม่มีอะไรเกิดขึ้น:

a -> null
     x

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

ดังนั้นถ้าคุณมีอาร์เรย์อาเรย์ที่อ้างอิงถึงออบเจ็กต์ x, y และ z และตัวแปรที่อ้างอิงถึงอาเรย์นั้นจะมีลักษณะดังนี้:

a -> arr -> x
         -> y
         -> z

หากคุณไม่มีอะไรเกิดขึ้น:

a -> null
     arr -> x
         -> y
         -> z

ดังนั้น GC พบว่าไม่มีการตั้งค่าอ้างอิงและลบมันซึ่งทำให้โครงสร้างนี้แก่คุณ:

a -> null
     x
     y
     z

ตอนนี้ GC พบ x, y และ z แล้วลบออกไป การอ้างอิงแต่ละรายการในอาเรย์จะไม่ทำให้ดีขึ้นมันจะใช้เวลาของ CPU และพื้นที่ในโค้ด (ซึ่งกล่าวว่าจะไม่ทำให้เสียหายได้มากไปกว่านั้น) GC จะยังคงสามารถทำงานได้ตามที่ควร )


5

เหตุผลที่ถูกต้องสำหรับต้องการเพิ่มหน่วยความจำจาก programm ใด ๆ (java หรือไม่) คือการทำให้หน่วยความจำเพิ่มเติมพร้อมโปรแกรมอื่น ๆ ในระดับระบบปฏิบัติการ หากแอปพลิเคชัน java ของฉันใช้งาน 250MB ฉันอาจต้องการบังคับให้ลงเหลือ 1MB และทำให้สามารถใช้งานแอปอื่น ๆ ได้ถึง 249MB


หากคุณจำเป็นต้องเพิ่มพื้นที่ว่าง 249MB อย่างชัดเจนในโปรแกรม Java การจัดการหน่วยความจำจะไม่ใช่สิ่งแรกที่ฉันต้องการใช้งาน
Marc DiMillo

3
แต่การเพิ่มพื้นที่เก็บข้อมูลภายใน Java heap ของคุณไม่ได้ (ในกรณีทั่วไป) ทำให้พื้นที่เก็บข้อมูลพร้อมใช้งานกับแอปอื่น ๆ
เลียน่าสนใจ

5

หากต้องการขยายคำตอบและความคิดเห็นโดย Yiannis Xanthopoulos และ Hot Licks (ขออภัยฉันยังไม่สามารถแสดงความคิดเห็นได้!) คุณสามารถตั้งค่าตัวเลือก VM เช่นตัวอย่างนี้:

-XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30

ใน jdk 7 ของฉันนี้จะปล่อยหน่วยความจำ VM ที่ไม่ได้ใช้หากฮีปมากกว่า 30% ว่างหลังจาก GC เมื่อ VM ว่าง คุณอาจต้องปรับพารามิเตอร์เหล่านี้

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

อาร์กิวเมนต์ VM

อัปเดต: สำหรับ java 1.8.0_73 ฉันได้เห็น JVM บางครั้งปล่อยจำนวนเล็กน้อยด้วยการตั้งค่าเริ่มต้น ดูเหมือนว่าจะทำเฉพาะในกรณีที่ไม่ได้ใช้กอง ~ ~ 70% .. ไม่ทราบว่ามันจะปล่อยเชิงรุกมากขึ้นหรือไม่ถ้าระบบปฏิบัติการมีหน่วยความจำกายภาพเหลือน้อย


4

ฉันได้ทำการทดลองกับสิ่งนี้แล้ว

เป็นความจริงที่System.gc();แนะนำให้เรียกใช้ Garbage Collector เท่านั้น

แต่การโทรSystem.gc();หลังจากตั้งค่าการอ้างอิงทั้งหมดnullจะช่วยเพิ่มประสิทธิภาพและการยึดครองหน่วยความจำ


ฉันคิดว่าคุณไม่สามารถพูดได้อย่างแน่นอนว่า "การโทร System.gc (); หลังจากตั้งค่าการอ้างอิงทั้งหมดเป็นโมฆะจะช่วยเพิ่มประสิทธิภาพการทำงานและหน่วยความจำ" เนื่องจากมีความซับซ้อนมากในการคำนวณของ System.gc () และแม้กระทั่งหลังจากเรียก System.gc () & การรวบรวมขยะจริง ๆ แล้ว jvm อาจไม่ให้หน่วยความจำกลับไปที่ระบบปฏิบัติการหรือระบบ JVM อาจเก็บหน่วยความจำไว้เพื่อใช้อ้างอิงในอนาคต ดูคำตอบนี้
Md. Abu Nafee Ibna Zahid

3

หากคุณต้องการจัดสรรและเพิ่มจำนวนหน่วยความจำอย่างแท้จริงคุณสามารถทำได้ด้วย ByteBuffers โดยตรง มีแม้กระทั่งวิธีที่ไม่สามารถพกพาได้เพื่อเพิ่มหน่วยความจำ

อย่างไรก็ตามตามที่ได้รับการแนะนำเพียงเพราะคุณต้องเพิ่มหน่วยความจำใน C ไม่ได้หมายความว่าควรทำเช่นนี้

หากคุณรู้สึกว่าคุณมีกรณีการใช้งานที่ดีฟรี () โปรดรวมไว้ในคำถามเพื่อที่เราจะได้เห็นว่าคุณกำลังทำอะไรอยู่มันน่าจะเป็นวิธีที่ดีกว่า


3

ทั้งหมดจากjavacoffeebreak.com/faq/faq0012.html

เธรดลำดับความสำคัญต่ำจะดูแลการรวบรวมขยะโดยอัตโนมัติสำหรับผู้ใช้ ในช่วงเวลาว่างเธรดอาจถูกเรียกใช้และสามารถเริ่มเพิ่มหน่วยความจำก่อนหน้านี้ที่จัดสรรให้กับวัตถุใน Java แต่ไม่ต้องกังวล - มันจะไม่ลบวัตถุของคุณ!

เมื่อไม่มีการอ้างอิงไปยังวัตถุมันจะกลายเป็นเกมที่ยุติธรรมสำหรับตัวเก็บขยะ แทนที่จะเรียกรูทีนบางอย่าง (เช่นฟรีใน C ++) คุณเพียงแค่กำหนดการอ้างอิงทั้งหมดให้กับวัตถุเป็นโมฆะหรือกำหนดคลาสใหม่ให้กับการอ้างอิง

ตัวอย่าง:

public static void main(String args[])
{
  // Instantiate a large memory using class
  MyLargeMemoryUsingClass myClass = new MyLargeMemoryUsingClass(8192);

  // Do some work
  for ( .............. )
  {
      // Do some processing on myClass
  }

  // Clear reference to myClass
  myClass = null;

  // Continue processing, safe in the knowledge
  // that the garbage collector will reclaim myClass
}

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

System.gc();

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


1

ในกรณีของฉันเนื่องจากโค้ด Java ของฉันตั้งใจที่จะส่งไปยังภาษาอื่น ๆ ในอนาคตอันใกล้ (ส่วนใหญ่ C ++) ฉันอย่างน้อยฉันต้องการจ่ายค่าบริการปากเพื่อเพิ่มหน่วยความจำอย่างถูกต้องดังนั้นจึงช่วยกระบวนการย้ายในภายหลัง

ฉันเองพึ่งพาตัวแปรโมฆะเป็นตัวยึดตำแหน่งสำหรับการลบที่เหมาะสมในอนาคต ตัวอย่างเช่นฉันใช้เวลาในการลบล้างองค์ประกอบทั้งหมดของอาร์เรย์ก่อนที่จะลบ (ทำให้เป็นโมฆะ) อาร์เรย์

แต่กรณีของฉันมีความเฉพาะเจาะจงมากและฉันรู้ว่าฉันได้รับความนิยมในการแสดงเมื่อทำสิ่งนี้


1

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

สิ่งนี้ถูกต้อง แต่วิธีนี้อาจไม่สามารถใช้การได้ทั่วไป ในขณะที่การตั้งค่าการอ้างอิงวัตถุรายการเป็นโมฆะ - จะทำให้หน่วยความจำสำหรับการเก็บขยะนี้เป็นจริงสำหรับวัตถุรายการประเภทดั้งเดิม หากวัตถุรายการมีประเภทการอ้างอิงแทนการตั้งค่ารายการวัตถุ = null จะไม่ตรวจสอบ - ใด ๆ ของประเภทการอ้างอิงที่มีอยู่ในรายการ ในกรณีนี้การตั้งค่า List object = null จะทำให้กำพร้าประเภทการอ้างอิงที่มีอยู่ซึ่งวัตถุนั้นจะไม่พร้อมใช้งานสำหรับการรวบรวมขยะยกเว้นว่าอัลกอริทึมการรวบรวมขยะนั้นฉลาดพอที่จะระบุว่าวัตถุนั้นถูกกำพร้าแล้ว


1
อันที่จริงมันไม่เป็นความจริง ตัวรวบรวมขยะ Java นั้นฉลาดพอที่จะจัดการกับมันได้อย่างถูกต้อง หากคุณเป็นโมฆะรายการ (และวัตถุภายในรายการไม่มีการอ้างอิงอื่น ๆ ถึงพวกเขา) GC สามารถเรียกคืนวัตถุทั้งหมดที่อยู่ในรายการ อาจเลือกที่จะไม่ทำในเวลาปัจจุบัน แต่จะเรียกคืนได้ในที่สุด กันไปสำหรับการอ้างอิงครบวงจร โดยทั่วไปวิธีการทำงานของ GC คือการมองหาวัตถุที่ไม่ถูกต้องโดยอัตโนมัติแล้วจึงเรียกคืนวัตถุเหล่านั้น นี่คืองานทั้งหมดของ GC วิธีที่คุณอธิบายมันจะทำให้ GC ไร้ประโยชน์อย่างที่สุด
Dakkaron

1

Java Althrough ให้เก็บขยะอัตโนมัติบางครั้งคุณจะต้องการทราบว่ามีขนาดใหญ่วัตถุและวิธีการมากของมันถูกทิ้งหน่วยความจำด้วยการใช้ programatically import java.lang;และRuntime r=Runtime.getRuntime(); จะได้รับค่าของหน่วยความจำโดยใช้mem1=r.freeMemory();การเรียกหน่วยความจำฟรีr.gc();วิธีการและการโทรfreeMemory()


1

คำแนะนำจาก JAVA คือกำหนดให้เป็นโมฆะ

จากhttps://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html

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

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

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

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