لا Java VM نقل الكائنات في الذاكرة ، وإذا كان الأمر كذلك كيف ؟

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

سؤال

لا آلة جافا الافتراضية من أي وقت مضى نقل الكائنات في الذاكرة ، وإذا كان الأمر كذلك, كيف التعامل مع تحديث المراجع إلى نقل الكائن ؟

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

بلدي اثنين من أفكار حتى الآن هي:

  1. الحفاظ على المرجعية المراوغة في مكان ما لا نقل عن عمر من وجوه ، ونحن التحديث إذا كان الهدف يتحرك.ولكن كيف تكون هذه indirections إدارتها ؟
  2. الاحتفاظ بقائمة عكس المراجع مع كل كائن ، لذلك نحن نعرف ما يجب أن المحدث إذا تم نقل الكائن.بالطبع, هذا يخلق أداء النفقات العامة.

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

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

المحلول

في إشارة إلى التعليق أعلاه عن المشي الكومة.

GC مختلفة هي تفعل ذلك بطرق مختلفة.

عادة نسخ جامعي عندما يمشون كومة أنهم لا يدخلون جميع الكائنات في كومة الذاكرة المؤقتة.بل السير على الكائنات الحية في كومة.وهذا يعني أنه إذا كان يمكن الوصول إليها من "الجذر" كائن كائن حي.

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

اثنين من الفوائد الأساسية من هذا النوع من جامع هي أنه التعاقدات كومة أثناء النسخ المرحلة ، وأنه فقط نسخ الكائنات الحية.هذا هو المهم أن العديد من الأنظمة لأنه مع هذا النوع من جامع كائن تخصيص الأوساخ رخيصة حرفيا أكثر قليلا من تزايد كومة المؤشر.عندما GC يحدث أيا من "ميتة" الكائنات نسخ, حتى لا تبطئ جامع أسفل.كما تبين في الأنظمة الديناميكية أن هناك الكثير أكثر قليلا المؤقتة القمامة من هناك منذ فترة طويلة القمامة.

أيضا ، عن طريق المشي الحية كائن الرسم البياني يمكنك أن ترى كيف GC أن "تعرف" كل كائن ، وتتبع لهم أي عنوان أغراض التكيف يؤديها أثناء النسخ.

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

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

نصائح أخرى

(عمليا) أي القمامة التي تم جمعها نظام التحرك حول الكائنات في الذاكرة إلى حزمة لهم أكثر كثافة و تجنب تجزئة المشاكل.

ما تبحث عنه هو كبير جدا و الموضوع المعقد.أود أن أقترح عليك أن تقرأ على القائم البعيد كائن نمط API:.NET remoting والذهاب إلى أبعد من التقنيات مثل كوربا

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

عند الحفر في التصميم أعتقد أن الكثير من ذلك سوف ينزل إلى كيفية التعامل مع مختلف حالات الفشل.

الرد على التعليقات:

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

أنا لست على دراية بشكل مفرط مع تفاصيل جافا جمع القمامة و أنا متأكد من جاوة .صافي جامعي القمامة لدينا الكثير من التعقيد في تحقيق أقصى قدر من الأداء مع الحد الأدنى من التأثير على التطبيق.

غير أن الفكرة الأساسية لجمع القمامة هو:

  • VM توقف جميع المواضيع من تشغيل التعليمات البرمجية المدارة
  • ينفذ تحليل وسائل الأتصال من مجموعة من المعروف 'جذور':ثابت المتغيرات المتغيرات المحلية على جميع المواضيع.لكل كائن وجد ويترتب على جميع الإشارات داخل الكائن.
  • أي كائن لم يتم تحديدها من قبل وسائل الأتصال التحليل القمامة.
  • الكائنات التي لا تزال على قيد الحياة يمكن أن تكون ثم انتقل إلى أسفل في الذاكرة إلى حزمة لهم كثيفة.وهذا يعني أن أي إشارات إلى هذه الكائنات أيضا إلى تحديث مع العنوان الجديد.من خلال التحكم عندما جمع القمامة يمكن أن تحدث VM قادرة على ضمان أنه لا توجد مراجع الكائنات في الهواء' (ie.في آلة تسجيل) من شأنه أن يسبب مشكلة.
  • بمجرد اكتمال العملية VM يبدأ المواضيع المنفذة مرة أخرى.

كما صقل هذه العملية VM يمكن أن تؤدي الأجيال جمع القمامة ، حيث أكوام منفصلة هي حافظت على أساس 'عمر' من كائن.الأشياء تبدأ في كومة 0 و إذا كانوا على قيد الحياة عدة GCs ثم الهجرة إلى كومة 1 و في نهاية المطاف إلى كومة 2 (وهلم جرا .صافي يدعم 3 أجيال فقط على الرغم من).وميزة هذا هو أن GC يمكن تشغيل كومة 0 المجموعات بشكل متكرر جدا, وليس من الضروري أن تقلق بشأن القيام بعمل لإثبات عاش فترة طويلة من الكائنات (التي انتهى بها المطاف في كومة الذاكرة المؤقتة 2) لا تزال على قيد الحياة (التي تقريبا هي بالتأكيد).

وهناك غيرها من التحسينات على دعم المتزامنة جمع القمامة ، التفاصيل حول المواضيع التي هي في الواقع تنفيذ التعليمات البرمجية غير المدارة عندما GC ومن المقرر أن تضيف الكثير من التعقيد في هذا المجال.

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

هناك فرق دقيق ومع ذلك بين الطين ما تقدم و ما كنت تسأل عنه ، وبالتالي التحقيق بلدي.

الفرق هو أنه بقدر ما نشعر بالقلق ، الطين لا توفر "عن بعد" مراجع إلى الكائنات في الواقع كله "عن بعد" مفهوم RMI, الدائرة, الخ.هي غائبة تماما عند استخدام الطين.

بل في الطين كافة الكائنات الموجودة في افتراضية كبيرة كومة.المواضيع سواء على العقدة 1 أو عقدة 2 ، عقدة 3 ، عقدة 4, الخ جميعا الوصول إلى أي كائن في كومة الذاكرة المؤقتة الافتراضية.

ليس هناك برمجة خاصة للتعلم ، أو واجهات برمجة التطبيقات الخاصة, الكائنات في "الظاهرية" كومة يكون بالضبط نفس السلوك كما الكائنات في كومة الذاكرة المؤقتة المحلية.

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

وعلاوة على ذلك, على عكس أي حل يأتي من قبل ذلك الكائن إشارات عبر العقد - مما يعني أنه يمكنك استخدام ==.كل ذلك جزء من الحفاظ على ذاكرة Java نموذج عبر الكتلة التي هي شرط أساسي إلى جعل "العادية" جافا (مثلPOJOs, متزامنة الانتظار/إعلام) عمل (ليس من يعمل إذا كنت لا / لا يمكن الحفاظ على هوية الكائن عبر الكتلة).

لذا فإن السؤال يعود لك إلى مزيد من تركيز بحثك requiements - لغرض ما تحتاج "عن بعد" المؤشرات ؟

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

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

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

يبدو أنك تبحث عن مخبأ توزيع شيء مثل الطين أو جافا أوراكل objece ذاكرة التخزين المؤقت (سابقا tangersol).

إذا كنت على استعداد للذهاب إلى هذا أعماقي, يمكنك إلقاء نظرة على جبوس ذاكرة التخزين المؤقت العمارة مستندات والاستيلاء على بعض التعليمات البرمجية المصدر كمرجع.

هذه ليست بالضبط ما يمكن وصفها ، لكنه يعمل مشابهة جدا.

وهنا الرابط.

http://www.jboss.org/jbosscache/

آمل أن يساعد هذا.

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