কিভাবে একটি জাভা থ্রেড ডাম্প বিশ্লেষণ?


100

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

জাভা জন্য অন্তর্নির্মিত সরঞ্জাম ভিজুয়ালভিএম ব্যবহার করে কোনও ওয়েব অ্যাপ থেকে নেওয়া কয়েকটি লাইন এখানে দেওয়া হয়েছে:

"Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    - locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

   Locked ownable synchronizers:
    - None

"Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27ef0310> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
    - locked <0x27ef0310> (a java.lang.ref.Reference$Lock)

প্রথমে আমার কিছু পরিবর্তনশীল নাম সম্পর্কে প্রশ্ন রয়েছে:

  • জোয়ার ও শুঁটকির অর্থ কী?
  • অবজেক্ট.ওয়েটের পরে স্কোয়ারড প্রথম বন্ধনীতে চিত্রটি কী?

তারপরে স্ট্যাক ট্রেসের জন্য:

  • <.....> (একটি জাভা.লং ....) এ অপেক্ষা করার অর্থ কী এবং <..> এ সংখ্যাটি কী
  • এটি লক হওয়া মানে কী <<> (একটি জাভা.লং ....) একই প্রশ্ন, <<> কী আছে

আমি ভেবেছিলাম লক শব্দটি কোনওভাবে অপেক্ষা করার শর্তের সাথে সম্পর্কিত, তবে আমি ভুল ছিলাম। প্রকৃতপক্ষে, আমি ভাবছি কেন লক কেন তিনবার পুনরাবৃত্তি হয়, তবে থ্রেডটি একই ডাম্পের মতো দেখা যায়:

"Thread-0" prio=6 tid=0x02ee3800 nid=0xc1c runnable [0x03eaf000]
   java.lang.Thread.State: RUNNABLE
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:199)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    - locked <0x23963378> (a java.io.BufferedInputStream)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    - locked <0x23968450> (a java.io.InputStreamReader)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    - locked <0x23968450> (a java.io.InputStreamReader)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:145)

সর্বোপরি, এটি ছিল তাদের মধ্যে সবচেয়ে খারাপ:

"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

এই থ্রেডটি চলমান অবস্থায় রয়েছে তবে এটি শর্তে অপেক্ষা করছে। কি শর্ত এবং 0x00000 কি?

থ্রেড ক্লাসের কোনও প্রমাণ ছাড়াই স্ট্যাক ট্রেসটি এত ছোট কেন?

আপনি যদি আমার সমস্ত প্রশ্নের উত্তর দিতে পারতেন তবে আমি খুব কৃতজ্ঞ হব।

ধন্যবাদ

উত্তর:


113

টিআইডি হ'ল থ্যাড আইডি এবং এনআইডি হ'ল নেটিভ থ্রেড আইডি। এই আইডিটি অত্যন্ত প্ল্যাটফর্ম নির্ভর। এটি জাস্ট্যাক থ্রেড ডাম্পগুলিতে এনআইডি। উইন্ডোজে, এটি কেবল কোনও প্রক্রিয়ার মধ্যে ওএস-স্তরীয় থ্রেড আইডি। লিনাক্স এবং সোলারিসে এটি থ্রেডের পিআইডি (যা পরিবর্তে হালকা ওজন প্রক্রিয়া হয়)। ম্যাক ওএস এক্স-তে এটি দেশীয় pthread_t মান হিসাবে বলা হয়।

এই লিঙ্কটিতে যান: জাভা স্তরের থ্রেড আইডি : এই দুটি শর্তের একটি সংজ্ঞা এবং আরও ব্যাখ্যাের জন্য।

আইবিএমের সাইটে আমি এই লিঙ্কটি পেয়েছি: একটি থ্রেড ডাম্প কীভাবে ব্যাখ্যা করবেন । এটি আরও বিস্তারিতভাবে এটি কভার করে:

এটি অপেক্ষা করে কী বোঝায় তা বোঝায়: একটি লক একাধিক সত্তাকে একটি ভাগ করা সংস্থান অ্যাক্সেস করতে বাধা দেয়। জাভা Each এর প্রতিটি বস্তুর একটি সম্পর্কিত লক থাকে (একটি সিঙ্ক্রোনাইজড ব্লক বা পদ্ধতি ব্যবহার করে অর্জিত হয়)। জেভিএমের ক্ষেত্রে, থ্রেডগুলি জেভিএমের বিভিন্ন সংস্থান এবং জাভা অবজেক্টগুলিতে লক করার জন্য প্রতিযোগিতা করে।

তারপরে এটি মনিটরের একটি বিশেষ ধরণের লকিং মেকানিজম হিসাবে বর্ণনা করে যা থ্রেডগুলির মধ্যে নমনীয় সিঙ্ক্রোনাইজেশনের জন্য জেভিএম-এ ব্যবহৃত হয়। এই বিভাগের উদ্দেশ্যে, শর্তাদি মনিটর পড়ুন এবং বিনিময়যোগ্যভাবে লক করুন।

তারপরে এটি আরও যায়:

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

থ্রেড ডাম্প থেকে লাইনে আপনি কী দেখছেন তার আরও গভীরতর ব্যাখ্যা এখানে দেওয়া হল। একটি জাভা থ্রেড অপারেটিং সিস্টেমের একটি স্থানীয় থ্রেড দ্বারা প্রয়োগ করা হয়। প্রতিটি থ্রেডকে গা bold় রেখার দ্বারা প্রতিনিধিত্ব করা হয় যেমন:

"থ্রেড -1" (টিআইডি: 0x9017A0, sys_thread_t: 0x23EAC8, রাষ্ট্র: আর, স্থানীয় আইডি: 0x6E4) প্রিও = 5

* বন্ধনীতে মানগুলি [উদাহরণস্বরূপ] উদাহরণের সাথে মিলে যাওয়ায় নিম্নলিখিত 6 টি আইটেম এটি ব্যাখ্যা করে:

  1. নাম [ থ্রেড -১ ],
  2. সনাক্তকারী [ 0x9017A0 ],
  3. জেভিএম ডেটা স্ট্রাকচার ঠিকানা [ 0x23EAC8 ],
  4. বর্তমান অবস্থা [ আর ],
  5. নেটিভ থ্রেড আইডেন্টিফায়ার [ 0x6E4 ],
  6. এবং অগ্রাধিকার [ 5 ]।

"ওয়েল অন অন" এটি jvm নিজেই যুক্ত ডেমন থ্রেড হিসাবে প্রদর্শিত হবে এবং অ্যাপ্লিকেশন থ্রেড স্থিরতা নয়। আপনি যখন "অবজেক্ট.ওয়েট ()" এ পাবেন, তার অর্থ এখানে ডেমন থ্রেড, "ফাইনালাইজার" এখানে কোনও বস্তুর লক সম্পর্কে একটি বিজ্ঞপ্তির জন্য অপেক্ষা করছে, এই ক্ষেত্রে এটি আপনাকে কী নোটিফিকেশনটির জন্য অপেক্ষা করছে তা দেখায়: "- <0x27ef0288> (একটি java.lang.ref.ReferencesQueue ock লক) অপেক্ষা করছি "

রেফারেন্সকিউয়ের সংজ্ঞা: রেফারেন্স সারি, যেখানে রেজিস্টার্ড রেফারেন্স অবজেক্টগুলি আবর্জনা সংগ্রাহক দ্বারা যথাযথ পুনঃব্যবহারযোগ্যতা পরিবর্তনগুলি সনাক্ত করার পরে সংযুক্ত করা হয়।

চূড়ান্তকরণকারী থ্রেডটি চালিত হয় তাই আবর্জনা সংগ্রহ কোনও বস্তুর সাথে সম্পর্কিত সংস্থানগুলি পরিষ্কার করতে পরিচালনা করে। যদি আমি এটি সম্পূর্ণরূপে দেখছি, চূড়ান্তকরণকারীটি এই বস্তুটির লকটি পেতে পারে না: java.lang.ref.ReferencesQueue.remove (ReferencesQueue.javaament18) কারণ জাভা অবজেক্ট একটি পদ্ধতি চালাচ্ছে, তাই চূড়ান্তকরণকারী থ্রেডটি সেই অবজেক্টটি বর্তমান কাজটি শেষ না হওয়া পর্যন্ত লক করা আছে।

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

থ্রেড ডাম্পে অবজেক্ট.উইটের পরে স্কোয়ারড প্রথম বন্ধনীর চিত্রটি কী?

এটি থ্রেডের স্মৃতিতে একটি পয়েন্টার। এখানে আরও বিশদ বিবরণ দেওয়া হল:

C.4.1 থ্রেড তথ্য

থ্রেড বিভাগের প্রথম অংশটি থ্রেডটি দেখায় যা মারাত্মক ত্রুটিটিকে উত্সাহিত করেছিল:

Current thread (0x0805ac88):  JavaThread "main" [_thread_in_native, id=21139]
                    |             |         |            |          +-- ID
                    |             |         |            +------------- state
                    |             |         +-------------------------- name
                    |             +------------------------------------ type
                    +-------------------------------------------------- pointer

থ্রেড পয়েন্টারটি জাভা ভিএম অভ্যন্তরীণ থ্রেড কাঠামোর পয়েন্টার। আপনি কোনও লাইভ জাভা ভিএম বা কোর ফাইল ডিবাগ না করা পর্যন্ত এটি সাধারণত আগ্রহী নয়।

এই শেষ বিবরণটি এসেছে: হটস্পট ভিএম সহ জাভা এসই 6 এর সমস্যা সমাধানের গাইড

থ্রেড ডাম্পগুলিতে আরও কয়েকটি লিঙ্ক এখানে দেওয়া হয়েছে:


11

@ জেমস ড্রিংকার্ডের দুর্দান্ত উত্তরটিতে আরও:

মনে রাখবেন যে অন্তর্নিহিত বাস্তবায়নের উপর নির্ভর করে, জাভা.এলং.থ্রেড.এ কোনও থ্রেডের মুলক যা কোনও স্থানীয় পদ্ধতিতে অবরুদ্ধ ছিল সে হিসাবে রিপোর্ট করা যেতে পারে RUNNABLE, যেখানেA thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.

দেখা যাচ্ছে যে এই বিবরণটি কোনও ওএস কল যেমন একটি পোল বা রিড অপারেশন হিসাবে অবরুদ্ধ রয়েছে enc সম্ভবত এটি কারণ কোনও গ্যারান্টি নেই যে কখন কোনও নেটিভ পদ্ধতি কল ওএস স্তরে অবরুদ্ধ হয়েছে জেভিএম জানতে পারে।

জেভিএম থ্রেড ডাম্পগুলির অনেকগুলি আলোচনা যা আমি এই সম্ভাবনাটিকে পুরোপুরি উপেক্ষা করে দেখেছি বা অনাহততার বিষয়টি বিবেচনা না করে এ নিয়ে ঝাপটায় ঝাঁকুনিতে পড়েছি - এর মধ্যে কমপক্ষে কোনওটি নয় যে মনিটরিং সরঞ্জামগুলি বিভ্রান্তিমূলকভাবে জানাতে পারে যে এই জাতীয় বেশ কয়েকটি থ্রেড 'চলমান' রয়েছে এবং আরও তারা সমস্ত 100% এ চলছে।

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