سؤال

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

ومع ذلك، لاحظت أنه بعد كمية معينة من الخيوط، أحصل على تعطل غريب. أعلم أن هذا بسبب هذه StringBuilder، لأنه عندما أقصر من قدرتهم الأولية، يمكنني أن أبدأ المزيد من المواضيع. الآن لهذه StringBuilders، فهي تخلق مثل هذا في منشئ كائن الموضوع:

stringbuilder a = stringbuilder جديد (30000)؛
StringBuilder B = Stringbuilder جديد (30000)؛

النقطة التي تعطل فيها عموما حوالي 550 مؤشرات ترابط، مما يؤدي إلى أكثر قليلا من 62 ميجابايت. جنبا إلى جنب مع بقية البرنامج، فإن الذاكرة المستخدمة على الأرجح 64 ميغابايت، والتي قرأتها عبر الإنترنت في مكان ما كانت حجم Defaulf لمسبح تخصيص الذاكرة JVM. لا أعرف ما إذا كان هذا صحيحا أم لا.

الآن، هل هناك شيء أخطأ، أن بطريقة ما بسبب التصميم، وأنا أخصيص الذاكرة بطريقة خاطئة؟ أم أن هذه هي الطريقة الوحيدة وإذا أخبرت JVM زيادة بركة الذاكرة الخاصة بها؟ أو أي شيء آخر تماما؟

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

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

نصائح أخرى

إذا كنت تخزن الكثير من المعلومات في Stringbuilder، فهل ستظهر مرة أخرى إلى ذلك في مرحلة ما؟ إذا لم يكن الأمر كذلك، ما عليك سوى كتابة ذلك إلى وسيلة أخرى (DB، ملف، إلخ). يحتوي البرنامج على كمية محدودة من الموارد، ولا يمكن أن تعقد كل حالة نظام كامل في وقت واحد. سوف يمنحك XMX مساحة أكبر للتخزين في الذاكرة، ومع ذلك لن تجعل قدرة التخزين لانهائية التخزين.

النظر في استخدام أ ThreadPoolExecutor, ، واضبط حجم التجمع لعدد CPU على جهازك. إنشاء المزيد من الخيوط من وحدة المعالجة المركزية هو مجرد إضافة النفقات العامة.

ExecutorService service = Executors.newFixedThreadPool(cpuCount))

أيضا، يمكنك تقليل استخدام الذاكرة عن طريق كتابة سلاسلك إلى ملفات بدلا من الاحتفاظ بها في الذاكرة StringBuilderس.

افترض 1MB لكل موضوع. هذه هي تكلفة ذاكرة الوصول العشوائي في إنشاء كل واحد، وفوق الذاكرة المخصصة لها.

كما قال غريغوري، إعطاء JVM، بعض الخيارات مثل -xmx.

ضع في اعتبارك أيضا استخدام Threadpool أو Executor للتأكد من أن كمية معينة فقط من المواضيع تعمل في وقت واحد. وبهذه الطريقة يمكن الحفاظ على مقدار الذاكرة محدودا دون تباطؤ (نظرا لأن المعالج غير قادر على تشغيل مؤشرات الترابط 550 في نفس الوقت على أي حال).

وعند استخدام برنامج تنفيذي لا ينشئ StringBuilders في المنشئ، ولكن في طريقة التشغيل.

يمكنك استخدام FileWriter. لإخراج النص إلى ملف، ثم اسحبه مرة أخرى مع filereader. بهذه الطريقة تحتاج فقط إلى تخزين اسم الملف في الذاكرة، بدلا من محتويات السلسلة بأكملها.

لخفض المواضيع، يمكنك استخدام ExecutorService، أو ما عليك سوى استخدام عدد قليل من الخيوط التي تقرأ من قائمة الانتظار.

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

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