জাভা থ্রেড ডাম্প পেতে -3 হত্যা


116

আমি kill -3JVM এর থ্রেড ডাম্প ইউনিক্সে দেখতে কমান্ডটি ব্যবহার করছি । তবে এই killকমান্ডের আউটপুট আমি কোথায় খুঁজে পাব? আমি হারিয়ে গেলাম !!


আপনি কোন প্রক্রিয়া হত্যা করছেন? এটি কি জে 2 ইই অ্যাপ্লিকেশন সার্ভার? যদি এটি হয় তবে আপনার স্ট্যান্ড ট্রেসটি স্ট্যান্ডার্ডের মধ্যে খুঁজে পাওয়া উচিত।
লুসিয়ানো ফিয়ান্ডেসিও

আমি জাভা ক্লাস চালাচ্ছে এমন একটি প্রক্রিয়াটি হত্যা করছি
javanerd

2
কনসোলে থ্রেড ডাম্প লিখতে হবে না। যেহেতু জাভা ক্লাসটি
স্ট্যান্ড

উত্তর:


194

আপনি থ্রেড ডাম্প নিতে এবং যেখানে খুশি সেখানে আউটপুট লিখতে বিকল্পভাবে jstack (JDK সহ অন্তর্ভুক্ত) ব্যবহার করতে পারেন। এটি কি ইউনিক্স পরিবেশে পাওয়া যায় না?

jstack PID > outfile

1
হ্যাঁ - সময়ে এটি চালানো হয়। আপনি অতিরিক্ত লক সম্পর্কিত তথ্য প্রিন্ট করে এমন দীর্ঘ তালিকার জন্য -l (লোয়ারকেস এল) নির্দিষ্ট করতে পারেন
জোশুয়া ম্যাককিনন

2
যতক্ষণ না jstack কমান্ড কারণে ধারাবাহিকভাবে ব্যর্থ ;-( "ঠিকানা থেকে থ্রেড অনুমান টাইপ করতে অক্ষম"
noahlz

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

7
এটি লক্ষণীয় যে jstack জেডিকে প্রয়োজন requires যদি আপনি এমন কোনও সার্ভারে অ্যাপস চালাচ্ছেন যার মধ্যে কেবল জেআরই ইনস্টল করা থাকে তবে থ্রেড ডাম্পিংয়ের জন্য আপনাকে অন্য উপায় খুঁজে বের করতে হবে।
jeffkempf

1
উইন্ডোজ পরিষেবাদির মতো বিভিন্ন ব্যবহারকারীর অধীনে চলমান প্রক্রিয়াটির থ্রেড ডাম্প পেতে জাস্ট্যাকটি কীভাবে ব্যবহার করবেন তা এখানে: stackoverflow.com/questions/1197912/…
ভাদজিম

44

থ্রেড ডাম্প সিস্টেমটিতে VM এর বাইরে লেখা থাকে যা আপনি চালিত করেছিলেন kill -3। আপনি যদি কোনও ফাইলে JVM এর কনসোল আউটপুট পুনর্নির্দেশ করে থাকেন তবে থ্রেড ডাম্পটি সেই ফাইলে থাকবে। যদি জেভিএম ওপেন কনসোলে চলছে তবে থ্রেড ডাম্পটি এর কনসোলটিতে প্রদর্শিত হবে।


1
জেভিএম থ্রেড ডাম্প আউটপুটকে পৃথক ফাইলটিতে পুনঃনির্দেশ করার একটি উপায় রয়েছে। আমার উত্তরে দেখুন।
ভাদজিম

32

লগভিএমআউটপুট ডায়াগনস্টিক বিকল্পের সাহায্যে ব্রেক সিগন্যালে জেভিএম থ্রেড ডাম্প আউটপুট পুনর্নির্দেশ করার উপায় রয়েছে :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

5
প্রযুক্তিগতভাবে এটি থ্রেড ডাম্প আউটপুটটিকে "পুনর্নির্দেশ" করে না। এটি jvm.log (যা থ্রেড ডাম্প আউটপুট অন্তর্ভুক্ত) এ JVM লগিং চালু করে কিন্তু কিল-কোয়েট এখনও প্রক্রিয়াটির স্টাডআউট (পাশাপাশি) ডাম্প করবে। অস্পষ্ট জেভিএম বিকল্পগুলির বর্ণনার জন্য
উত্সাহিত

25

ছবিতে জাভা 8 সহ, jcmdপছন্দসই পদ্ধতি।

jcmd <PID> Thread.print

নীচে ওরাকল ডকুমেন্টেশন থেকে স্নিপেট রয়েছে :

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

যাইহোক, অ্যাপ্লিকেশনটি দিয়ে এই শিপিংয়ের লাইসেন্সিং ইমপ্লিকেশনগুলি হতে পারে যা আমি নিশ্চিত নই।


1
দুর্ভাগ্যবশত jcmdউইন্ডোজ পরিষেবা প্রক্রিয়ার সাথে সংযোগ করতে ব্যর্থ সঙ্গে com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachযখন jstack -F: সফল stackoverflow.com/questions/1197912/...
Vadzim

1
জাভা প্রক্রিয়া যেমন ব্যবহারকারীর অধীনে আপনাকে জিসিএমডি <পিড> থ্রেড.ডাম্প চালানো দরকার অন্যথায় আপনার সংযোগগুলি বাদ দেওয়া হবে। স্ট্যাকওভারফ্লো.com
টোভিলাইট

11

জেভিএমের স্টাডআউটটি একই স্থানে স্থাপন করা হয়েছে। আপনার যদি টমকেট সার্ভার থাকে তবে এটি catalina_(date).outফাইল হবে।


8

কিল -3 ব্যবহার করার সময় স্ট্যান্ডার্ড আউটপুটে থ্রেড ডাম্প দেখতে পাওয়া উচিত। বেশিরভাগ অ্যাপ্লিকেশন সার্ভার একটি পৃথক ফাইলে স্ট্যান্ডার্ড আউটপুট লেখেন। কিল -3 ব্যবহার করার সময় আপনার এটি খুঁজে পাওয়া উচিত। থ্রেড ডাম্প পাওয়ার একাধিক উপায় রয়েছে:

  • kill -3 <PID>: স্ট্যান্ডার্ড আউটপুট এ আউটপুট দেয়।
  • সার্ভার চলমান কনসোল উইন্ডোতে যদি কারও অ্যাক্সেস থাকে তবে একজন Ctrl+ ব্যবহার করতে পারেনBreak STDOUT এ স্ট্যাক ট্রেস তৈরি কীগুলির সংমিশ্রণ ।
  • হটস্পট ভিএম এর জন্য আমরা jstackএকটি থ্রেড ডাম্প তৈরি করতে কমান্ডও ব্যবহার করতে পারি । এটি জেডিকে-র একটি অংশ। সিনট্যাক্সটি নিম্নরূপ:

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]

কিল -৩ <পিআইডি> ব্যবহার করতে আমার সমস্যা হচ্ছে। এটি ঠিক কাজ করে তবে কনসোলটিতে থ্রেড ডাম্প লেখার পরেও প্রক্রিয়াটি মেরে ফেলে। এটা করার কথা কি?
অ্যাশলে

@ অ্যাশলে - জেভিএমকে kill -3 <PID>হত্যা করা উচিত নয়। আপনি কোন ধরণের জাভা অ্যাপটি দেখছেন?
slm

2

Jboss এ আপনি নিম্নলিখিতগুলি সম্পাদন করতে পারেন

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

এটি আপনার আউটপুট / থ্রেডাম্পকে উপরের কমান্ডে উল্লিখিত ফাইল কনসোলটিতে পুনর্নির্দেশ করবে।



2

আপনি যদি আপনার স্ট্যান্ডলোন জাভা প্রক্রিয়াটির থ্রেড ডাম্প চান তবে আপনার যে পদক্ষেপগুলি অনুসরণ করা উচিত

পদক্ষেপ 1: জাভা প্রোগ্রামে কল করা শেল স্ক্রিপ্টের জন্য প্রক্রিয়া আইডি পান

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

পদক্ষেপ 2: সন্তানের জন্য প্রক্রিয়া আইডি পান যা রান এএবিসিডি দ্বারা চালিত হয়েছিল। বাচ্চাদের পেতে উপরের পিআইডি ব্যবহার করুন।

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

পদক্ষেপ 3: নির্দিষ্ট প্রক্রিয়াটির জন্য জেএসট্যাক পান। আপনার এক্সওয়াইএসবার সার্ভারের প্রক্রিয়া আইডি পান। অর্থাৎ 8536

linux$ jstack **8536** > threadDump.log
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.