متغيرات جافا -> استبدال؟ تحسين ذاكرة الوصول العشوائي

StackOverflow https://stackoverflow.com/questions/2800821

  •  25-09-2019
  •  | 
  •  

سؤال

أردت فقط أن أعرف ما يحدث وراء برنامجي عندما أعلن وتهيئة متغيرًا وتهيئته لاحقًا مرة أخرى بقيم أخرى ، على سبيل المثال قائمة ArrayList أو شيء مشابه.

ماذا يحدث في ذاكرة الوصول العشوائي ، عندما أقول على سبيل المثال هذا:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al = new ArrayList<String>();

فهل يتم تخزين قائمة Arraylist الأولى في RAM أم سيتم تخزين قائمة ArrayList الثانية في نفس الموقف حيث كان الأول من قبل؟ أم أنها ستغير مرجع "AL" فقط؟

إذا لم يتم استبداله ... هل هناك طريقة لتحرير ذاكرة الوصول العشوائي يدويًا والتي احتلتها قائمة ArrayList الأولى؟ (دون انتظار جامع القمامة) هل يساعد في تعيينه أولاً = فارغ؟

تحيات جميلة ، poeschlorn

هل كانت مفيدة؟

المحلول

سيتم تخصيص الكود الذي تنشره مثيل ArrayList جديد. إذا كنت تريد إعادة استخدام نفس الشيء ، يمكنك القيام بذلك:

ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....

al.clear();
// now you can use a1

لكن قم بذلك بحذر - إذا قمت بتمرير المثيل الأولي لـ a1 إلى التعليمات البرمجية الأخرى التي ستستخدمها لفترة أطول ، فإن مسحها سيؤدي إلى مشاكل وستحتاج إلى مثيل منفصل.

ولكن لاحظ أيضًا أن المدخرات التي تحصل عليها من صفائف إعادة التدوير وقوائم Arraylists ليست كبيرة. إذا كنت تقوم بتخزين سلاسل بايت 10 × 4096 في قائمة ArrayList ، فإن قائمة المصفوفة نفسها تحتل فقط مساحة تتناسب مع حجم المراجع ، على سبيل المثال ، حوالي 4 بايت × 10 = 40 بايت. هذا تبسيط ، لكن المبدأ صحيح. لذلك ، حتى لو قمت بإعادة استخدام قائمة الصفيف نفسها ، فأنت تنقذ نفسك فقط الذاكرة المستخدمة لتخزين مراجع الكائن ، وليس الكائنات نفسها. مع وضع ذلك في الاعتبار ، ومخاطر التسبب في الحشرات عن طريق تعديل مجموعة عن غير قصد ، أعتقد أن معظم الناس لا يزعجون قوائم إعادة التدوير.

إن إدارة الذاكرة في VM الحديثة جيدة جدًا حقًا ، ويجب أن تبدأ فقط في تقديم "تحسينات" الذاكرة عندما ترى أن هناك حاجة إليها. في الواقع ، يمكن أن يكون لاستخدام كائنات لفترة أطول من حياتها الطبيعية تأثير سلبي على أداء جمع القمامة.

نصيحتي هي ، رمزها بوضوح أولاً ، ملف التعريف ، والتركيز فقط على تحسين استخدام الذاكرة عندما ترى أن هناك مشكلة وحددت السبب.

حظا طيبا وفقك الله!

نصائح أخرى

سيتم تخصيص قائمة ArrayList الجديدة من جزء مختلف من الذاكرة ، ويتم تغيير المرجع للإشارة إليها ، وإذا لم يتم إحالة قائمة Arraylist القديمة بعد الآن ، فسيتم جمع القمامة. لا توجد وسيلة لتحرير الذاكرة يدويًا في جافا. يحدث تلقائيا.

تعد متغيرات الإعدادات إلى NULL غير ذات صلة ، عندما يتم ضبطها على شيء آخر بعد ذلك مباشرة أو يكون متغيرًا محليًا يخرج من النطاق قريبًا (ولكن داخل هياكل البيانات مثل ArrayList ، قم بإعداد عناصر من الصفيف الموجود إلى NULL ، عندما يكون العنصر تمت إزالته ، مطلوب لتجنب تسرب الذاكرة).

سيتم تخصيص مساحة جديدة في الكومة لقائمة ArrayList الجديدة.

لا يمكنك فرض جمع القمامة وتعيين NULL فقط سيعمل على تناول دورات المعالج. تستطيع الاتصال System.gc() لاقتراح JVM تشغيل جامع القمامة ، ولكن لا توجد ضمانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top