هل هناك أي Java VMs يمكنه حفظ حالتهم إلى ملف ثم إعادة تحميل تلك الحالة؟

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

سؤال

هل هناك أي Java VMs يمكنه حفظ حالتهم إلى ملف ثم إعادة تحميل تلك الحالة؟

إذا كان الأمر كذلك، وتلك التي؟

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

المحلول

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

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

نصائح أخرى

الاستمرارية ربما يكون ما تبحث عنه:

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

هناك مكتبان متابعان على الأقل لجافا: استمرارية Rife و Javaflow. أعلم أن JavaFlow على الأقل يسمح للدولة التسلسلية بالقرص:

أ Continuation يمكن التسلسل إذا كانت جميع الكائنات التي التقطتها قابلة للتسلسل أيضًا. بمعنى آخر ، جميع المتغيرات المحلية (بما في ذلك الجميع thisكائنات) يجب تمييزها على أنها Serializable. في هذا المثال ، تحتاج إلى وضع علامة على فئة myrunnable على أنها قابلة للتسلسل. يمكن إرسال استمرار متسلسل إلى جهاز آخر أو استخدامه لاحقًا. - تعليمي Javaflow

يجب عليك إجراء تسلسل كائنات خاصة بالمجال والتي يمكن إلغاء تخصيصها بواسطة وقت تشغيل JVM آخر.

لست على علم بأي أدوات تستمر JVM بأكمله. الأقرب الذي حصلت عليه في القيام بذلك كان إنشاء تفريغ أساسي من عملية JVM قيد التشغيل GCORE, ، ثم باستخدام jsadebugd, JMAP أو jstack لتصحيحه.

على سبيل المثال:

$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX

تحديث

لا أعتقد أنك ستجد حلًا محمولًا بين البنية حتى الآن.

تجدر الإشارة إلى أنه لا يمكن تسلسل العديد من الأشياء لأنها تحتوي على حالة خارج سياق Java. EG Sockets ، مؤشرات الترابط ، الملفات المفتوحة ، اتصالات قاعدة البيانات. لهذا السبب ، من الصعب حفظ حالة تطبيق مفيد بطريقة عامة.

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

يمكن استخدام هذا لتجميع التطبيقات ، و/أو جعل heapstate مستمرة. في الواقع ، يمكنك استخدامه لبدء JVM لأعلى والتقاط المكان الذي توقفت فيه. لمزيد من المعلومات تحقق من:http://www.infoq.com/articles/open-terracotta-intro

أتمنى أن يساعدك هذا.

لقد عملت عليها مشروع Java مضمن التي استخدمت هذا النهج للبدء بسرعة. كان JVM من Wind River ، يركض فوق Vxworks.

لقد أجرت Sun بعض الأبحاث حول "الثبات المتعامد" ، الذي يوفر "ثباتًا للنموذج الحسابي الكامل الذي يحدد محددة لغة Java":

http://research.sun.com/forest/com.sun.labs.forest.doc.opjspec.abs.html

Pjama هو تنفيذ النموذج الأولي:

http://research.sun.com/forest/opj.main.html

على حد علمي ، لا يوجد شيء لالتقاط حالة JVM واستعادتها ، لكن الناس يحاولون إجراء تسلسل/إلغاء تخصيص فئة الخيط لتحقيق شيء مشابه. كان أقرب شيء إلى تطبيق العمل الذي وجدته الفرامل, ، ولكن قد تجد المزيد عندما تكون Google لـ "تسلسل الخيط".

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

أتساءل كم عدد مكونات الإطار والمكتبات التي ستنهار هذه الوظائف. فجأة ، أنت تقوم بإحياء حالة JVM من التخزين ؛ في غضون ذلك ، تم تخطي الساعة غامضة إلى الأمام لمدة 23 ساعة ، لم تعد اتصالات الشبكة صالحة ، ولم تعد كائنات واجهة المستخدم الرسومية لديها أي مقابض O/S الأساسية ... أقول إن هذا غير نقي ، ومستحيل في الحالة العامة بدون تعديل الإطار على نطاق واسع.

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

ومع ذلك ، فإنه لا يخزن حالة JVM الكاملة (مكدس الاتصال ، حالة GC وما إلى ذلك). إذا كنت بحاجة حقًا إلى هذا المستوى من التفاصيل ، فقد تكون هناك حاجة إلى JVM متخصصة.

الجواب في هذا الوقت هو رقم, ، لا توجد JVMs يمكنها "السبات" مثل نظام التشغيل الخاص بك أو مثل VMware et al.

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

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