كيف يمكنك أن تجعل الخاصة بك تطبيق جافا الذاكرة كفاءة ؟

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

سؤال

كيف يمكنك تحسين حجم كومة الذاكرة المؤقتة استخدام التطبيق الذي يحتوي على الكثير (الملايين) من عاش فترة طويلة الكائنات ؟ (الكبيرة ذاكرة التخزين المؤقت, تحميل الكثير من السجلات من db)

  • استخدم نوع البيانات
    • تجنب جافا.لانغ.سلسلة لتمثيل أنواع البيانات الأخرى
  • تجنب تكرار الأشياء
    • استخدام enums إذا كانت القيم هي معروفة مقدما
    • استخدام الكائن برك
    • السلسلة.المتدرب() (فكرة جيدة؟)
  • تحميل/حفظ الكائنات تحتاج

أنا أبحث عن البرمجة العامة أو جافا إجابات محددة.لا غير تقليدي التبديل برنامج التحويل البرمجي.

تحرير:

تحسين الذاكرة تمثيل POJO التي يمكن أن تظهر ملايين المرات في كومة.

حالات الاستخدام

  • حمولة ضخمة ملف csv في الذاكرة (تحويلها إلى POJOs)
  • استخدام السبات إلى استرداد ملايين من السجلات من قاعدة البيانات

السيرة الذاتية من الإجابات:

  • استخدام نمط وزن الذبابة
  • نسخ على الكتابة
  • بدلا من تحميل 10M الكائنات مع 3 خصائص ، هو أكثر فعالية من 3 المصفوفات (أو غيرها من البيانات هيكل) من حجم 10M?(يمكن أن يكون الألم التعامل مع البيانات ولكن إذا كنت حقا قصيرة على الذاكرة...)
هل كانت مفيدة؟

المحلول

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

  • إستخدم نمط الطين حيثما كان ذلك ممكنا.
  • التخزين المؤقت للقرص. هناككثير حلول ذاكرة التخزين المؤقت ل Java.
  • هناك بعض النقاش حول ما إذا كانت String.intern هي فكرة جيدة. يرىهنا لسؤال إعادة. string.intern ()، ومقدار النقاش حول ملاءمتها.
  • الاستفادة من ناعم أو ضعيفالمراجع لتخزين البيانات التي يمكنك إعادة إنشاء / إعادة تحميل عند الطلب. يرىهنا لكيفية استخدام المراجع الناعمة مع تقنيات التخزين المؤقت.

معرفة المزيد عن Interals وعمر الكائنات التي تخزنها ستؤدي إلى إجابة أكثر تفصيلا.

نصائح أخرى

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

يمكنك إلقاء نظرة على تغيير تمثيل بياناتك، ESP إذا كانت الكائنات الخاصة بك صغيرة. على سبيل المثال، يمكنك تمثيل جدول البيانات كسلسلة من الأعمدة مع صفائف كائن لكل عمود، بدلا من كائن واحد لكل صف. يمكن أن يوفر هذا قدرا كبيرا من النفقات العامة لكل كائن إذا كنت لا تحتاج إلى تمثيل صف فردي. على سبيل المثال، يمكن أن تستخدم طاولة مع 12 أعمدة و 10،000،000 صف صفات 12 كائنا (واحد لكل عمود) بدلا من 10 ملايين (واحد لكل صف)

ضمان حسن التطبيع من نموذج كائن لا قيم مكررة.

مهم, و, إذا كان فقط الملايين من الكائنات أعتقد أنني لائق 64 بت VM والكثير من ذاكرة الوصول العشوائي؛)

لن يساعدك "Profilers" العادي بشكل كبير، لأنك تحتاج إلى نظرة عامة على جميع كائنات "Live" الخاصة بك. تحتاج إلى محلل تفريغ الكومة. أوصي Eclipse Memory Analyzer..

تحقق من وجود كائنات مكررة، بدءا من السلاسل. تحقق مما إذا كان بإمكانك تطبيق أنماط مثل الوزن، والكتابة الناسونية، والتهيئة الكسول (ستكون Google صديقك).

ألق نظرة على هذا العرض التقديمي مرتبط من هنا. إنه يضع استخدام ذاكرة كائن Java المشترك والبولئرية ويساعدك على فهم أين تذهب جميع الذاكرة الإضافية.

بناء تطبيقات Java كفاءة في الذاكرة: الممارسات والتحديات

يمكنك فقط تخزين كائنات أقل في الذاكرة. .

أريد أن أضيف شيئا ما إلى نقطة قام بها بيتر ريدي (لا يمكن التعليق على إجابته :() من الأفضل دائما استخدام ملف تعريف الذاكرة (تحقق java memory profiler.) من الذهاب عن طريق الإلغاء .80٪ من الوقت روتين أننا نتجاهل بعض المشاكل في فئات تحصيلها أكثر عرضة لتسريب الذاكرة.

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

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

استخدام هياكل البيانات أفضل. المجموعات القياسية في جافا كثيفة الذاكرة بدلا من ذلك.

ما هو بنية بيانات أفضل

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

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

  1. Assign null القيمة لجميع variables و هو no longer تستخدم. هكذا make it available for Garbage collection.
  2. De-reference the collections بمجرد انتهاء الاستخدام، وإلا فلن يكتسح GC تلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top