কিভাবে একটি জাভা প্রোগ্রাম ট্রেস?


25

সিসাডমিন হিসাবে আমি মাঝে মাঝে পরিস্থিতিগুলির মুখোমুখি হই where

অতীতে - জাভা আসার আগে - দুটি পাল্টা ব্যবস্থা ছিল:

  1. আর কিছুই যদি সহায়তা না করে - RTFM ;-)
  2. এমনকি যদি 1. সহায়তা না করে - সিস্টেম-কলগুলি সন্ধান করুন এবং দেখুন কি হচ্ছে

আমি সাধারণত strace -fলিনাক্সের সাথে এই কাজের জন্য ব্যবহার করি (অন্যান্য ওএসের সাথে একই রকম ট্রেস-সরঞ্জাম রয়েছে)। এখন এটি সাধারণত যে কোনও পুরানো ফ্যাশন প্রোগ্রামের জন্য ভাল কাজ করে, জাভা- প্রসেসে একই কাজ করার সময় ট্রেসটি খুব ঝাপসা হয়ে যায়। এমন অনেকগুলি সিস্টেম কল রয়েছে যা আপাতদৃষ্টিতে কোনও বাস্তব ক্রিয়াকলাপের সাথে সম্পর্কিত নয়, এ জাতীয় ডাম্পের মাধ্যমে অনুসন্ধান করা ভয়ঙ্কর।

এটি করার আরও ভাল উপায় আছে (যদি উত্স-কোড উপলব্ধ না হয়)?

উত্তর:


16

চিখন যেমন উল্লেখ করেছে, jstackদুর্দান্ত কারণ এটি জেভিএম-তে সমস্ত সক্রিয় থ্রেডের সম্পূর্ণ স্ট্যাক ট্রেস দেয়। একইটি জাভিএমের স্টাডারের সিগকুইট ব্যবহার করে পাওয়া যাবে।

আর একটি দরকারী সরঞ্জাম jmapযা প্রক্রিয়াটির পিআইডি ব্যবহার করে জেভিএম প্রক্রিয়া থেকে একটি হিপ ডাম্প ধরতে পারে:

jmap -dump:file=/tmp/heap.hprof $PID

এই হিপ ডাম্পের মতো সরঞ্জামগুলিতে লোড করা যায় visualvm(যা এখন স্ট্যান্ডার্ড ওরাকল জাভা এসডিকে ইনস্টল, jvisualvm নামে একটি অংশ)। এছাড়াও, ভিজুয়ালভিএম চলমান জেভিএমের সাথে সংযোগ করতে পারে এবং অভ্যন্তরীণ সিপিইউ ব্যবহার, থ্রেডের গণনা এবং হিপ ব্যবহারের গ্রাফ প্রদর্শন সহ জেভিএম সম্পর্কিত তথ্য প্রদর্শন করতে পারে - লিক ডাউন ট্র্যাক করার জন্য দুর্দান্ত।

আর একটি সরঞ্জাম, jstatJVM- র জন্য একটি সংখ্যাসূচক তর্ক (উদাহরণস্বরূপ vmstat 3) চালানোর সময় অনেক সময় ধরে ভিএমস্ট্যাটের মতো জঞ্জাল সংগ্রহের পরিসংখ্যান সংগ্রহ করতে পারে ।

অবশেষে, লোড-সময়ে সমস্ত অবজেক্টের সমস্ত পদ্ধতিতে উপকরণের দিকে ঠেলাতে কোনও জাভা এজেন্ট ব্যবহার করা সম্ভব। লাইব্রেরি এটি javassistকরতে খুব সহজ করতে সহায়তা করতে পারে। সুতরাং, আপনার নিজের ট্রেসিং যুক্ত করা সম্ভব। এর সাথে শক্ত অংশটি কেবলমাত্র যখন আপনি চেয়েছিলেন এবং সর্বকালের জন্য নয় কেবল তখনই ট্রেস আউটপুট পাওয়ার কোনও উপায় খুঁজে পাবে, যা সম্ভবত জেভিএমকে একটি ক্রলের দিকে ধীর করবে। একটি প্রোগ্রাম রয়েছে যা dtraceএই পদ্ধতিতে কাজ করে। আমি চেষ্টা করেছিলাম, তবে খুব একটা সফল হয়নি। নোট করুন যে এজেন্টরা সমস্ত ক্লাসের উপকরণ চালাতে পারে না কারণ এজেন্ট ইনস্ট্রুমেন্ট চালানোর আগে জেভিএম বুটস্ট্র্যাপ করার জন্য প্রয়োজনীয় লোড হয় এবং তারপরে those ক্লাসগুলিতে উপকরণ যুক্ত করতে খুব দেরি হয়।

আমার পরামর্শ - ভিজ্যুভিএম দিয়ে শুরু করুন এবং দেখুন যে এটি আপনাকে কী জানা দরকার তা যেহেতু এটি জেভিএমের বর্তমান থ্রেড এবং গুরুত্বপূর্ণ পরিসংখ্যানগুলি প্রদর্শন করতে পারে।


যাইহোক, এটি একটি দুর্দান্ত প্রশ্ন; আমি আশা করি আরও জনগণ অন্যান্য ধারণার সাথে উত্তর যুক্ত করবেন। আমি যখন লোকেদের জাভা নিয়ে বহু বছর ধরে ট্রেসিংয়ের বিষয়ে কাজ করার বিষয়ে জিজ্ঞাসা করেছি, তারা আমাকে ফাঁকা স্টিয়ার দিয়েছিল। সম্ভবত তারা স্ট্রেসের দুর্দান্ততা জানেন না।
ছাই

10

লিনাক্স সিস্টেমে প্রোগ্রামগুলি ডিবাগ করার সময় একই বৃথা গেলে আপনার সিস্টেমে চলমান জেভিএম ডিবাগ করার জন্য অনুরূপ সরঞ্জামগুলি ব্যবহার করতে পারেন।

সরঞ্জাম # 1 - jvmtop

অনুরূপ top, আপনার সিস্টেমে চলমান জেভিএম-এর মধ্যে কী ক্লাসগুলি রয়েছে তা দেখতে আপনি jvmtop ব্যবহার করতে পারেন । একবার ইনস্টল হয়ে গেলে আপনি এটির মতো অনুরোধ করুন:

$ jvmtop.sh

এর আউটপুটটি একইভাবে সরঞ্জামটির মতো দেখতে স্টাইলযুক্ত top:

 JvmTop 0.8.0 alpha   amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

সরঞ্জাম # 2 - jvmmonitor

অন্য বিকল্প হ'ল jvmmonitor ব্যবহার করা । জেভিএম মনিটর একটি জাভা প্রোফাইলার যা সিপিইউ, থ্রেড এবং জাভা অ্যাপ্লিকেশনগুলির মেমরির ব্যবহার নিরীক্ষণের জন্য গ্রহটির সাথে একীভূত হয়েছে। আপনি হয় স্থানীয় হস্টে স্বয়ংক্রিয়ভাবে চলমান জেভিএম অনুসন্ধান করতে এটি ব্যবহার করতে পারেন বা এটি কোনও পোর্ট @ হোস্ট ব্যবহার করে দূরবর্তী জেভিএমগুলির সাথে সংযুক্ত হতে পারে।

jvmmonitor এর ss

সরঞ্জাম # 3 - ভিজ্যুভ্যালি

জেভিএম-এর সাথে সমস্যাগুলি ডিবাগ করার সময় ভিজ্যুয়ালভিএম সম্ভবত "সরঞ্জাম"। এর বৈশিষ্ট্য সেটটি বেশ গভীর এবং আপনি অভ্যন্তরের অভ্যন্তরে খুব গভীরতার সাথে দেখতে পারেন।

প্রোফাইল অ্যাপ্লিকেশন কর্মক্ষমতা বা মেমরি বরাদ্দ বিশ্লেষণ:

s ভিজ্যুভিএম # 2 এর এসএস

থ্রেড ডাম্পগুলি নিয়ে যান এবং প্রদর্শন করুন:

ভিজ্যুভ্যম # 3 এর এসএস

তথ্যসূত্র


4

বিবেচনা করুন jstackstraceএক- pstackঅ্যানালগের জন্য বেশিরভাগ ম্যাচ নয় , তবে কমপক্ষে আপনাকে একটি স্ন্যাপশটের একটি ছবি সময় দেবে। আপনার যদি করতে হয় তবে কোনও ক্রুড ট্রেস পেতে একসাথে স্ট্রিং'ম করতে পারত।

এই এসও নিবন্ধেও পরামর্শগুলি দেখুন: /programming/1025681/call-trace-in-java


2

আপনি যদি আরএইচইএল ওপেনজেডিকে ব্যবহার করছেন (বা সিম্পায়েন্ট করুন তবে মুলতটি হ'ল এটি ওরাকলের জেডিকে নয়) আপনি তার জন্য সিস্টেমট্যাপ ব্যবহার করতে পারেন ।

বেশ কয়েকটি প্রোবের ক্ষেত্রে জাভা কমান্ড লাইন বিকল্পগুলি ব্যবহার দ্বারা সক্ষমিত -XX:+DTraceMethodProbes, -XX:+DTraceAllocProbes, -XX:+DTraceMonitorProbes। নোট করুন যে এই প্রোবগুলি সক্ষম করা প্রোগ্রামের কর্মক্ষমতাকে লক্ষণীয়ভাবে প্রভাবিত করবে।

এখানে সিস্টেমট্যাপ স্ক্রিপ্ট উদাহরণ:

#!/usr/bin/stap

probe hotspot.class_loaded {
    printf("%12s [???] %s\n", name, class);
}

probe hotspot.method_entry, 
      hotspot.method_return {
    printf("%12s [%3d] %s.%s\n", name, thread_id, class, method);
}

probe hotspot.thread_start, 
      hotspot.thread_stop {
    printf("%12s [%3d] %s\n", name, id, thread_name);
}

probe hotspot.monitor_contended_enter, 
      hotspot.monitor_contended_exit {
    printf("%12s [%3d] %s\n", name, thread_id, class);
}

আপনি jstack()প্রক্রিয়াটির জাভা স্ট্যাক পেতেও ব্যবহার করতে পারেন তবে আপনি যদি জেভিএমের আগে সিস্টেমট্যাপ শুরু করেন তবে এটি কাজ করবে ।


নোট করুন যে সিস্টেমট্যাপ প্রতিটি পদ্ধতি সনাক্ত করবে । এটি পদ্ধতির যুক্তি পেতে সক্ষম হয় না। আরেকটি বিকল্প হ'ল জেভিএম নিজস্ব ট্রেসিংয়ের ক্ষমতা ব্যবহার করে যার নাম জেভিএমটিআই। সর্বাধিক বিখ্যাত জেভিএমটিআই বাস্তবায়নগুলির একটি হ'ল বিট্রেস


0

আপনাকে জ্যাকপ্লে চেষ্টা করার পরামর্শ দেওয়া হচ্ছে , এটি একটি জেভিএম ট্রেসিং টুল যা আপনাকে পদ্ধতিতে প্রবেশের সন্ধান করতে দেয় এবং কোড পরিবর্তন বা পুনরায় নিয়োগ ছাড়াই প্রস্থান করে।


আপনি এটি কোনও চলমান জেভিএমের সাথে সংযুক্ত করতে পারবেন না। তা ছাড়াও - আকর্ষণীয় সরঞ্জাম
নীল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.