كيف يمكنني أخذ تفريغ كومة على جافا 5 دون جمع القمامة أولا؟

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

سؤال

لدينا تطبيق خادم تشغيل طويل يعمل بنظام Java 5، وملف التعريف، يمكننا أن نرى الجيل القديم المتزايد ببطء مع مرور الوقت. يتم تحريره بشكل صحيح على GC بالكامل، ولكن أود أن أكون قادرا على النظر إلى الكائنات غير القابلة للوصول في حصيرة الكسوف باستخدام تفريغ كومة. لقد حصلت بنجاح على تفريغ كومة باستخدام + XX: heapdumponctrlbreak، ولكن JVM دائما يقوم دائما بممتدأ قبل إلقاء كومة الكومة. يبدو أن هذا لا يحدث على Java 6 لكننا عالقون في 5 الآن. هل هناك أي طريقة لمنع ذلك؟

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

المحلول

أقترح ملتذلا ثالثا مثل yourkit., ، والتي قد تسمح لك باتخاذ لقطات دون بدء تشغيل GC أولا. مكافأة إضافية، يمكنك أن تأخذ لقطة دون shenanigans ctrl كامل ctrl.

نصائح أخرى

استخدم JConsole أو VisualVM أو JMC أو ... أخرى وحدة التحكم في إدارة JMX. فتح hotspotdiagnostic في com.sun.management. حدد طريقة dumpheap وإدخال اثنين من المعلمات:

  • المسار إلى ملف التفريغ
  • (صحيح / خطأ) تفريغ الكائنات الحية فقط. استعمال false لتفريغ جميع الكائنات.

لاحظ أنه سيتم كتابة ملف التفريغ بواسطة JVM الذي قمت بتوصيله به، وليس عن طريق Jvisualvm، لذلك إذا كان JVM يعمل على نظام مختلف، فسيتم كتابة هذا النظام.

enter image description here

هل جربت أداة JMAP القياسية التي يتم شحنها مع JDK؟ تم إدخال عدد JMAP رسميا في Java 5.

على سبيل المثال سطر الأوامر: / java / bin / jmap -heap: format = b

يمكن معالجة النتيجة باستخدام أداة JHAT القياسية أو مع تطبيقات GUI مثل MAT.

لدي بعض الكود هنا يمكن أن تأخذ برمجيا تفريغ كومة على JMX:

وصلة: jmxheapdumper.java.

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

jprofiler (EJ-Technologies.) تستطيع فعلها.

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