আপনি কীভাবে শেল থেকে আবর্জনা সংগ্রহের জন্য বাধ্য করেন?


106

তাই আমি একটি রিমোট বাক্সে জ্যাম্যাপ সহ একটি স্তূপের দিকে তাকিয়ে আছি এবং আমি এটিতে আবর্জনা সংগ্রহ করতে বাধ্য করতে চাই। Jvisualvm বা jconsole এবং বন্ধুদের মধ্যে পপিং না করে আপনি কীভাবে এটি করবেন?

আমি জানি আপনার জঞ্জাল সংগ্রহের জন্য জোর করার অনুশীলন করা উচিত নয় - আপনার স্তূপটি কেন বড় / বাড়ছে তা ঠিক খুঁজে বের করা উচিত।

আমি আরও বুঝতে পারি যে সিস্টেম.জিসি () আসলে আবর্জনা সংগ্রহ করতে বাধ্য করে না - এটি কেবলমাত্র জিসিকে বলে যে আপনি এটি ঘটতে চান।

সহজেই এটি করার কোনও উপায় আছে তা বলার পরে? কিছু কমান্ড লাইন অ্যাপ আমি অনুপস্থিত?


না হিসাবে একই stackoverflow.com/questions/1481178/...
Raedwald

উত্তর:


25

আপনি ফ্রি জেএমএক্সটার্ম প্রোগ্রামের মাধ্যমে এটি করতে পারেন ।

এটিকে এভাবে জ্বালিয়ে দিন:

java -jar jmxterm-1.0-alpha-4-uber.jar

সেখান থেকে, আপনি একটি হোস্টের সাথে সংযোগ করতে এবং জিসিকে ট্রিগার করতে পারেন:

$>open host:jmxport
#Connection to host:jmxport is opened
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>run gc
#calling operation gc of mbean java.lang:type=Memory
#operation returns: 
null
$>quit
#bye

এটিকে ব্যাশ / পার্ল / রুবি / অন্যান্য স্ক্রিপ্টগুলিতে এম্বেড করার বিষয়ে তথ্যের জন্য jmxterm ওয়েব সাইটে ডকগুলি দেখুন। এটি করার জন্য আমি পাইথনে পপেন 2 বা পার্লের ওপেন 3 ব্যবহার করেছি।

আপডেট: এখানে jmxterm ব্যবহার করে একটি ওয়ান-লাইনার:

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port

346

JDK 7 যেহেতু আপনি JDK কমান্ড সরঞ্জাম 'jcmd' যেমন ব্যবহার করতে পারেন:

jcmd <pid> GC.run


22
আপনি লোকেরা আমাকে এই বিষয়গুলি সম্পর্কে বলেন না কেন ?! :)
noahlz

2
যদি আপনি "সংযুক্তি সমর্থনযোগ্য ধারণা: সকেট ফাইল খুলতে অক্ষম" পান তবে এই উত্তরের সাথে আমার সংযোজনটি
টমাস রেবেল

এবং আপনি যদি তা Explicit GC is disabled, no GC has been performedপান তবে -XX:+DisableExplicitGCভিএম যুক্তির কারণে হতে পারে । দেখুন: mail.openjdk.java.net/pipermail/serviceability-dev/2017-
Roth

এটি কেবল ওরাকল জেডিকে-র জন্যই কাজ করবে, এটি ওপেন-জেডিকে-র জন্য কাজ করবে না।
আলী সালেহ

104

আপনি যদি চালনা jmap -histo:live <pid>করেন তবে এটি কোনও ছাপার আগেই পুরো গিসিকে গাদাতে বাধ্য করবে।


3
সমস্ত জাবাতে জঞ্জাল সংগ্রহের জন্য বাধ্য করুন: পিএস axf | গ্রেপ জাভা | grep -v গ্রেপ | awk '{মুদ্রণ "jmap -histo: লাইভ" $ 1}' | sh
gtrak

1
সেই নথিটি কোথায়? কীভাবে ছাড়া: লাইভ (উদাহরণস্বরূপ -F প্রয়োজন হয়)?
এনএফজি

7
2014 এর রহস্যময় ভবিষ্যত থেকে হ্যালো। jcmdএখন কাজের সঠিক সরঞ্জাম।
noahlz

16

ছাড়াও user3198490 এর উত্তর। এই আদেশটি চালানো আপনাকে নিম্নলিখিত ত্রুটি বার্তা দিতে পারে:

$ jcmd 1805 GC.run    
[16:08:01]
1805:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
...

এই স্ট্যাকওভারফ্লো উত্তরের সাহায্যে এটি সমাধান করা যেতে পারে

sudo -u <process_owner> jcmd <pid> GC.run

<process_owner>ব্যবহারকারী যেখানে পিআইডি দিয়ে প্রক্রিয়া চালায় <pid>। আপনি উভয় থেকে topবা পেতে পারেনhtop


নিম্নলিখিত সম্পর্কে কি? একই জিনিস? java.io.IOException: Operation not permitted
hাকি

আমি এখনও এই ত্রুটি বার্তাটির মুখোমুখি হই নি। সম্ভবত এটি সাথে কাজ করে sudo -u <process_owner> jcmd <pid> GC.run, আপনি চেষ্টা করতে পারেন? কমান্ডটি নিরাপদ হওয়া উচিত
টমাস রেবেল

আমার কাছে থাকবে তবে আমার কাছে সেই মেশিনে সুডো অ্যাক্সেস নেই।
hাকি

সরঞ্জামটি সঠিকভাবে কাজ করে। অপারেটিং সিস্টেমে এটি কার্যকর করার জন্য আপনার কাছে ঠিক অনুমতি নেই। একই ব্যবহার অন্যান্য অ্যাপ্লিকেশনগুলিতেও হয়, এমনকি জাভা ব্যবহার না করে।
aled

6

আরও কয়েকটি সমাধান রয়েছে (ইতিমধ্যে এখানে প্রচুর ভাল রয়েছে):

নিম্নলিখিত উদাহরণটি cmdline-jmxclient এর জন্য:

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc

এটি দুর্দান্ত কারণ এটি কেবল একটি লাইন এবং আপনি এটি খুব সহজেই একটি স্ক্রিপ্টে রাখতে পারেন।


5

লিনাক্সের জন্য:

$ jcmd $(pgrep java) GC.run

jcmdজেডিকে দিয়ে প্যাকেজ করা হয়, জাভাটির $(pgrep java)প্রসেস আইডি পায়


এটি কেবল তখনই কাজ করবে যখন মনে হবে কোনও জাভা প্রক্রিয়া চলছে। অন্যথায় এটি দ্বিতীয় পিআইডিটি jcmd এর কমান্ড হিসাবে ব্যাখ্যা করবে যা অবশ্যই স্বীকৃত নয় এবং একটি ত্রুটি ছুঁড়ে দেয়।
ক্যাস এলিয়েন্স

0

আমি মনে করি না এর জন্য কোনও কমান্ড লাইন বিকল্প আছে।

এজন্য আপনাকে jvisualvm / jconsole ব্যবহার করতে হবে।

আমি বরং আপনাকে এই সরঞ্জামগুলিকে পরিচয় হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি কেন আপনার প্রোগ্রামটি মেমরির চেয়ে বেশি।

যাইহোক, আপনারা জিসিকে জোর করবেন না, কারণ এটি অবশ্যই জিসি অ্যালগরিদমকে ব্যাঘাত ঘটাবে এবং আপনার প্রোগ্রামটি ধীর করে দেবে।


0

আপনি যদি নিজের অ্যাপ্লিকেশনটি দিয়ে জলোকিয়া ব্যবহার করেন তবে আপনি এই আদেশটি দিয়ে একটি আবর্জনা সংগ্রহ করতে পারেন:

curl http://localhost:8558/jolokia/exec/java.lang:type=Memory/gc

-10

শুধু:

kill -SIGQUIT <PID>

4
এটি আবর্জনা সংগ্রহ না করে হিপ ডাম্প ট্রিগার করবে
ডরর বেরেজনিটস্কি

কমপক্ষে সোলারিস হয় এটি জোর করে জিসি করে।
আমিন আব্বাসপুর

2
এমনকি সোলারিসেও নয়, সিকুইকিটি কোনও জিসি বা হিপ ডাম্পকে ট্রিগার করবে না। SIGQUIT কেবল হটস্পটের জন্য একটি থ্রেড ডাম্প ট্রিগার করবে। আইবিএম জেভিএমের জন্য এটি কনফিগারযোগ্য।
মিরসিয়া ভুটকোভিচি

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