سؤال

عند تحديد سمات تطبيق Java ، ألاحظ حقيقة مثيرة للاهتمام.عندما يكون JVM في GC ، فإن دوامة تفريغ خيط الموت تبدو كما يلي: Genacodicetagpre

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

هل هذا السلوك له علاقة مع GC ، أم أنه مجرد مصادفة؟

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

المحلول

الإجابة فقط على عنوان السؤال:

كيف يبدو تفريغ الخيط عندما قضى JVM وقتًا في GC؟

الجواب: ليس لديك وسيلة للحصول على مثل هذا التفريغ (بالطريقة المعتادة).

يعالج JVM طلب تفريغ سلسلة الرسائل فقط بعد الوصول إلى نقطة آمنة التي لا يمكن أن تحدث أثناء وجودك في GC.

ولكن هناك طريقة غش للحصول على تفريغ مؤشر ترابط GC النشط بمساعدة وظيفة JVMTI غير الموثقة AsyncGetCallTrace المذكورة في هذا المنشور:

http://jeremymanson.blogspot.com/ 2010/07 / why-many-profilers-have-serious.html

يُلمح أيضًا إلى أن Oracle Solaris Studio يمكنه يُستخدم لأخذ مثل هذه التفريغ المختلط من سلاسل الرسائل الأصلية / جافا.

نصائح أخرى

جرب jmap -histo: العيش بمرور الوقت ، يمكنك مقارنة المخرجات ، ومعرفة أنواع الكائنات التي تنمو.

يجب أن يكون لديك JDK مثبتًا لـ jmap. http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

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

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

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

أثناء إجراء بحث في Google عن الشفرة الخاصة بك ، وجدت إصدارًا مختلفًا http://grepcode.com/file/repo1.maven.org/maven2/org.mortbay.jetty/jetty-util/7.0.0.pre5 / org / mortbay / thread / QueuedThreadPool.java ومع ذلك أظن أن سلاسل المحادثات الخاصة بك هي TIMED_WAIT في طريقة الكتلة هذه (). Genacodicetagpre

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