[Java] جامع القمامة في Android


Answers

بشكل عام ، في وجود جامع بيانات قمامة ، فإنه ليس من الأفضل إجراء استدعاء يدوي لـ GC. يتم تنظيم GC حول الخوارزميات المجربة التي تعمل بشكل أفضل عند تركها على أجهزتها الخاصة. يؤدي استدعاء GC يدويًا إلى تقليل الأداء.

من حين لآخر ، في بعض الحالات النادرة نسبيًا ، قد يجد المرء أن GC معينًا يخطئ ، وقد يحسِّن استدعاء يدوي إلى GC الأمور ، من حيث الأداء. هذا لأنه ليس من الممكن بالفعل تنفيذ GC "مثالي" والذي سيدير ​​الذاكرة على النحو الأمثل في جميع الحالات. يصعب التنبؤ بهذه الحالات وتعتمد على العديد من تفاصيل التنفيذ الدقيقة. "الممارسة الجيدة" هي ترك GC تدير نفسها ؛ إن الاستدعاء اليدوي إلى GC هو الاستثناء ، الذي لا ينبغي تصوره إلا بعد حدوث مشكلة الأداء الفعلي على النحو الواجب.

Question

لقد رأيت العديد من إجابات Android التي تشير إلى استدعاء جامع البيانات المهملة في بعض المواقف.

هل من الممارسات الجيدة طلب جامع البيانات المهملة في Android قبل إجراء عملية تستهلك الذاكرة؟ إذا لم يكن الأمر كذلك ، فهل يجب أن أسميه فقط إذا حصلت على خطأ OutOfMemory ؟

هل هناك أشياء أخرى يجب استخدامها قبل اللجوء إلى جامع القمامة؟




أود أن أقول لا ، لأن مستندات المطور في حالة استخدام ذاكرة الوصول العشوائي :

...
GC_EXPLICIT

GC صريحة ، مثل عندما تستدعي gc() (الذي يجب عليك تجنب الاتصال والثقة في GC لتشغيلها عند الحاجة).

...

لقد أبرزت الجزء ذو الصلة بالخط العريض.

يمكنك إلقاء نظرة على سلسلة YouTube ، أنماط أداء Android - ستعرض لك نصائح حول إدارة استخدام تطبيقك للذاكرة (مثل استخدام ArrayMap s في Android و SparseArray بدلاً من HashMap s).




إذا حصلت على OutOfMemoryError ، فعادةً ما يكون الوقت قد فات للاتصال بمجمع البيانات المهملة ...

هنا اقتباس من Android Developer:

في معظم الأحيان ، يحدث جمع القمامة بسبب أطنان من الكائنات الصغيرة قصيرة العمر وبعض جامعي القمامة ، مثل جامعي القمامة التوليديين ، يمكن تحسين جمع هذه الكائنات بحيث لا يتم مقاطعة التطبيق في كثير من الأحيان. للأسف ، يتعذر على جامع البيانات المهملة في Android إجراء مثل هذه التحسينات ومن ثم فإن إنشاء كائنات قصيرة العمر في مسارات الشفرات الحرجة للأداء يكون مكلفًا للغاية بالنسبة للتطبيق.

لذلك ، حسب فهمي ، لا توجد حاجة ملحة لاستدعاء gc. من الأفضل أن تنفق المزيد من الجهد في تجنب الإنشاء غير الضروري للأشياء (مثل إنشاء الكائنات داخل الحلقات)







يبدو أن System.gc() لا تعمل على Art Android 6.0.1 Nexus 5x ، لذا أستخدم Runtime.getRuntime().gc(); في حين أن.




Links