ข้อดีของการตั้งค่า largeHeap to true คืออะไร?


122

ฉันมีแอปพลิเคชันที่มีคลาสจำนวนมากและมีไลบรารีจำนวนมากรวมอยู่ด้วยฉันกำลังตั้งค่าandroid:largeHeap="true"เมื่อฉันได้รับปัญหาหน่วยความจำมีการแนบรหัสไฟล์ Manifest ของฉัน

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="My Huge Application"
        android:largeHeap="true"
        android:logo="@drawable/logo"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
</application>

ฉันต้องถามว่านี่เป็นแนวทางปฏิบัติที่ดีหรือไม่? กรุณาแนะนำข้อดีและข้อเสีย (ข้อดีข้อเสีย) ของการใช้งาน


หากคุณต้องการหน่วยความจำขนาดใหญ่สำหรับแอปของคุณเช่นเกม 3dmodels เป็นต้น
januprasad

47
50 คลาสนั้นไม่มาก
Chris Hayes


หากคุณกำลังใช้บริการบางอย่างหรือแอพพลิเคชั่นอื่น ๆ ภายในแอพของคุณซึ่งใช้หน่วยความจำแอพของคุณจะมีปัญหาเรื่องหน่วยความจำเช่นกล้องเป็นปัญหาที่พบบ่อยที่สุดของนักพัฒนาซอฟต์แวร์ในขณะที่ใช้แอพหรือหากคุณมีตัวแปรจำนวนมากซึ่งใช้หน่วยความจำหรือคงที่ ตัวแปรอาจเป็นสาเหตุของสิ่งนั้น
Aditi

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

คำตอบ:


116

สายเกินไปสำหรับงานปาร์ตี้ที่นี่ แต่ฉันจะเสนอ 0.02 $ ยังไงก็ได้
ไม่ควรใช้ android:largeHeap="true"ที่นี่เป็นสารสกัดจาก google ที่อธิบายไว้

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

นี่คือลิงค์ฉบับสมบูรณ์ของเอกสาร https://developer.android.com/training/articles/memory.html

UPDATE

หลังจากทำงานอย่างสุดเหวี่ยงกับout of memory errorsฉันจะบอกว่าการเพิ่มสิ่งนี้ลงในรายการเพื่อหลีกเลี่ยงปัญหา oom ไม่ใช่บาปเช่นกันที่ @Milad ชี้ให้เห็นด้านล่างนี้จะไม่ส่งผลกระทบต่อการทำงานปกติของแอป

อัปเดต 2

ที่นี่ไม่กี่เคล็ดลับในการจัดการกับout of memory errors

1) ใช้โทรกลับเหล่านี้ที่จะช่วยให้หุ่นยนต์onLowMemory, onTrimMemory(int) และล้างแคชของภาพเหมือน (Picasso, เหินปูนเปียก .... ) คุณสามารถอ่านข้อมูลเพิ่มเติมเกี่ยวกับพวกเขาที่นี่และที่นี่
2) การบีบอัดไฟล์ของคุณ (ภาพ, PDF)
3) อ่านเกี่ยวกับ วิธีจัดการบิตแมปอย่างมีประสิทธิภาพมากขึ้นที่นี่
4) ใช้ผ้าสำลีเป็นประจำก่อนที่จะผลักดันการผลิตเพื่อให้แน่ใจว่าโค้ดมีความสวยงามและไม่เทอะทะ


1
ทำไมคุณถึงพูดว่า "ไม่มีผลต่อการทำงานปกติของแอป" คำตอบนี้กล่าวถึงผลบางประการ ที่อื่นฉันเคยเห็นเวลาที่แย่กว่านั้นที่วัดได้สำหรับ largeHeap GC ในบางแอพ
ToolmakerSteve

59

ฉันคิดว่านี่เป็นคำถามที่มีประสิทธิภาพมากและให้ฉันเพิ่มรายละเอียดเกี่ยวกับข้อดีและข้อเสียของการใช้ตัวเลือกนี้

สิ่งที่คุณได้รับ:

  • OutOfMemoryErrorเห็นได้ชัดว่าคุณจะได้รับกองขนาดใหญ่ซึ่งหมายความว่ามีความเสี่ยงลดลง

สิ่งที่คุณสูญเสีย:

  • คุณอาจสูญเสียเฟรมบางอย่างที่อาจทำให้เกิดการผูกที่มองเห็นได้ กองขยะที่ใหญ่ขึ้นทำให้การรวบรวมขยะใช้เวลานานขึ้น เนื่องจากโดยพื้นฐานแล้วเครื่องเก็บขยะจะต้องสำรวจชุดวัตถุที่มีชีวิตทั้งหมดของคุณ โดยปกติเวลาหยุดเก็บขยะจะอยู่ที่ประมาณ 5 มิลลิวินาทีและคุณอาจคิดว่าไม่กี่มิลลิวินาทีไม่ใช่เรื่องใหญ่ แต่ทุกๆมิลลิวินาทีจะมีค่า อุปกรณ์ Android ต้องอัปเดตหน้าจอในทุกๆ 16 ms และเวลา GC ที่นานขึ้นอาจทำให้เวลาในการประมวลผลเฟรมของคุณเกินขีด จำกัด 16 มิลลิวินาทีซึ่งอาจทำให้เกิดการสะดุดที่มองเห็นได้

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

สรุป:

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


17

ฉันมีแอพที่มีเกือบ 50 คลาส

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

นอกจากนี้คุณยังสามารถใช้ภาพห้องสมุดโหลดเช่นปิกัสโซ , UILหรือร่อน ทั้งหมดนี้มีคุณสมบัติของการแคชรูปภาพในหน่วยความจำและ / หรือบนดิสก์


1
สำหรับการโหลดรูปภาพโดยทั่วไปฉันแนะนำให้ใช้ picaso หรือ universal image loader
Mightian

5
Glide ดีขึ้นและปรับให้เหมาะสมขึ้นอีกเล็กน้อยจากนั้น Picasso
Damien Praca

1
@DamienPraca ฉันไม่คิดอย่างนั้นอย่างน้อยถ้าคุณใช้แท็กอย่างถูกต้อง (setTag (), pauseTag (), resumeTag ()) ใน Picasso
Ruslan Berozov

15

จริงๆแล้วAndroid: largeHeapเป็นเครื่องมือสำหรับเพิ่มหน่วยความจำที่จัดสรรให้กับแอป

ไม่มีคำจำกัดความที่ชัดเจนถึงความจำเป็นในการใช้แฟล็กนี้ หากคุณต้องการหน่วยความจำเพิ่ม - Android มีเครื่องมือสำหรับเพิ่มหน่วยความจำให้คุณ แต่ความจำเป็นในการใช้คุณกำหนดเอง


4
ใช่มีคำจำกัดความที่ชัดเจนอ้างอิงลิงค์นี้developer.android.com/training/articles/memory.html
Mightian

3
@war_Hero - บทความนั้นอาจมีการเปลี่ยนแปลงเนื้อหาหรือไม่? ไม่มีการกล่าวถึง largeHeap อยู่ในนั้น
ToolmakerSteve

7

หากคุณต้องใช้ (และรักษา) android:largeHeap="true"จำนวนมากของหน่วยความจำแล้วใช่คุณสามารถและควรจะใช้ แต่ถ้าคุณใช้งานคุณควรเตรียมพร้อมที่จะให้แอปของคุณล้างออกจากหน่วยความจำเมื่อใดก็ตามที่แอปอื่น ๆ อยู่เบื้องหน้า

เมื่อ "เตรียมพร้อม" ฉันหมายความว่าคุณควรออกแบบให้เหมาะกับความเป็นไปได้นั้นเพื่อให้การเขียนonStop()และonResume()วิธีการของคุณมีประสิทธิภาพมากที่สุดในขณะเดียวกันก็มั่นใจได้ว่าสถานะที่เกี่ยวข้องทั้งหมดจะได้รับการบันทึกและเรียกคืนในลักษณะที่แสดงลักษณะที่ราบรื่นต่อผู้ใช้

มีสามวิธีที่เกี่ยวข้องกับพารามิเตอร์นี้: maxMemory(), และ getMemoryClass()getLargeMemoryClass()

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

เมื่อคุณใช้largeHeapพารามิเตอร์maxMemory()จะเพิ่มเป็นระดับที่สูงขึ้นเฉพาะอุปกรณ์ในขณะที่getMemoryClass()จะยังคงเหมือนเดิม

getMemoryClass()ไม่ได้ จำกัด ขนาดฮีปของคุณ แต่จะบอกให้คุณทราบจำนวนฮีปที่คุณควรใช้หากคุณต้องการให้แอปของคุณทำงานได้อย่างสะดวกสบายและเข้ากันได้ภายในขีด จำกัด ของอุปกรณ์ที่คุณใช้งานอยู่

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

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

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

ตรวจจับขนาดฮีปของแอปพลิเคชันใน Android

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


1
"ละทิ้งความระมัดระวังและหลีกเลี่ยงทางผ่านบุฟเฟ่ต์ที่คุณกินได้ไม่อั้น" 😂
Joshua Pinter

4

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

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

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