2011-04-24 5 views
11

में गायब java_pid फ़ाइल के कारण मेरे स्वयं के प्रोफाइलर का निर्माण, मैं मूल पुस्तकालय एजेंट बनाने के लिए JVMTI API का उपयोग करता हूं। अतिरिक्त पैरामीटर -agentlib का उपयोग करके यह एजेंट JVM के साथ एक साथ शुरू किया जा सकता है। इसके अलावा Attach एपीआई है जो एक एजेंट को चल रहे JVM में इंजेक्ट करने की अनुमति देता है। मैं निम्नलिखित कोड का उपयोग कर अपने प्रोफाइलर को इस प्रोफाइल को कार्यान्वित करना चाहता था:AttachNotSupportedException अटैच एपीआई

try { 
    String pid = VirtualMachine.list().get(0).id(); 
    VirtualMachine vm = VirtualMachine.attach(pid); 
    vm.loadAgentLibrary("agent"); 
} catch (AgentLoadException e1) { 
    e1.printStackTrace(); 
} catch (AgentInitializationException e1) { 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} catch (AttachNotSupportedException e) { 
    e.printStackTrace(); 
} 

यह क्या करता है? सभी उपलब्ध चल रहे आभासी मशीनों (VirtualMachine.list()) से मैं पहला चुनता हूं, इसे संलग्न करता हूं और अपने एजेंट को इसमें लोड करने का प्रयास करता हूं। एजेंट, libagent.so नामित यूनिक्स सिस्टम पर पाया जा सकता है, लेकिन जब एजेंट लोड करने का प्रयास निम्न अपवाद फेंक दिया जाता है:

com.sun.tools.attach.AttachNotSupportedException: 
    Unable to open socket file: 
     target process not responding or HotSpot VM not loaded. 

स्रोत कोड में देख रहे हैं, यह अपवाद फेंक दिया जाता है, क्योंकि यह नहीं मिल सकता है .java_pid<pid> नाम की एक फ़ाइल। मुझे दस्तावेज में इस तरह की फाइल के बारे में बहुत सारी जानकारी नहीं मिली है। मैंने अक्सर सुना है कि इस तरह की फाइल का उपयोग नहीं किया जाता है, लेकिन मैं जावा 1.6 चला रहा हूं।

मैंने अन्य जेवीएम को भी संलग्न करने का प्रयास किया, असल में मैंने इस संलग्न प्रक्रिया को गतिशील रखा, परीक्षण कारणों से मैं किसी भी JVM से अटैच करने का प्रयास करता हूं।

// Return the socket file for the given process. 
    // Checks working directory of process for .java_pid<pid>. If not 
    // found it looks in /tmp. 
    private String findSocketFile(int pid) { 
     // First check for a .java_pid<pid> file in the working directory 
     // of the target process 
     String fn = ".java_pid" + pid; 
     String path = "/proc/" + pid + "/cwd/" + fn; 
     File f = new File(path); 
     if (!f.exists()) { 
      // Not found, so try /tmp 
      path = "/tmp/" + fn; 
      f = new File(path); 
      if (!f.exists()) { 
       return null;   // not found 
      } 
     } 
     return path; 
    } 

इसे कहते हैं, यह /proc/<pid> निर्देशिका में जड़ से देख रहा है:


इस कोड को जो अपवाद, sun.tools.attach: LinuxVirtualMachine.java से लिया की ओर जाता है है। JDK7 इसके बारे में एक changeset को देखते हुए लगता है कि वे कोड JDK7 Changeset to LinuxVirtualMachine

उत्तर

25

मुझे इस समस्या का अनुभव हुआ।

धागा "मुख्य" com.sun.tools.attach.AttachNotSupportedException में अपवाद: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया प्रतिसाद नहीं दे रहा या हॉटस्पॉट वीएम लोड नहीं

समाधान कुछ भारी Googling कर मिला था।

पहला उत्तर http://www.jvmmonitor.org/doc/index.html आया। प्रतीत होता है कि वहाँ एक बग है:

If you see the additional message "Unable to open socket file: target process not responding or Hotspot VM not loaded", either your application didn't respond creating a socket file like /tmp/.java_pid1234 (e.g. due to hangup, file system permission), or JVM Monitor was not able to find the created socket file (e.g. due to the bug 7009828).

तब के बाद कुछ और मैं एक और उपकरण है जो एक ही लक्षण "सॉकेट फ़ाइल खोलने में असमर्थ था" के लिए GitHub पर एक बातचीत (पाया खोज https://github.com/rhuss/ जोलोका/मुद्दे/34):

jgreen: Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded

jgreen: right I have it working but only when lauching as the exact same user as activemq. root does not work

यह अंतिम टुकड़ा समाधान था। यह एकमात्र तरीका है।संलग्न कॉल सफल होगा जावा कोड चलाने के माध्यम से जो समान उपयोगकर्ता को जेवीएम चलाने की प्रक्रिया के स्वामित्व वाले व्यक्ति के रूप में संलग्न करता है। मेरे मामले में यह activemq उपयोगकर्ता था।

System.out.println("HEAP: " + ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()); 

HEAP: init = 27127296(26491K) used = 3974200(3881K) committed = 26345472(25728K) max = 675086336(659264K) 
+3

उसी उपयोगकर्ता के रूप में चलाएं, जीतें, धन्यवाद। –

+0

उसी उपयोगकर्ता के साथ काम किया! आपका बहुत बहुत धन्यवाद! – Gonzalo

+0

मैं रूट के रूप में उपयोग कर रहा हूं लेकिन त्रुटि से नीचे आ रहा हूं। त्रुटि: अटैचिंग समर्थित नहीं है: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया प्रतिक्रिया नहीं दे रही है या हॉटस्पॉट वीएम लोड नहीं किया गया com.sun.tools.attach.AttachNotSupportedException: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया प्रतिसाद नहीं दे रही है या हॉटस्पॉट वीएम लोड नहीं है –

3

परिवर्तन कर रहे हैं मैं संदिग्ध है कि आप अपने चल JVM और यह जावा 6 पर है के लिए -Djava.io.tmpdir को निर्दिष्ट किया जा सकता है अद्यतन 23 या 24. अगर ऐसा है यदि आपको चल रहे इंस्टेंस के लिए केवल 25 अपडेट करने की आवश्यकता है।

मैंने देखा है कि इस समस्या का एकमात्र संदर्भ Jstack and Jstat stopped working with upgrade to JDK6u23 है। मैंने निश्चित रूप से अपडेट 23 और जेस्टैक असफल होने के साथ एक ही समस्या देखी है, जहां यह 23 से पहले ठीक काम करता है और 25 के साथ फिर से काम करता है। मैंने अभी भी VirtualMachine.attach(pid) को 23 के विरुद्ध आजमाया है और -Djava.io.tmpdir का उपयोग होने पर यह विफल हो जाता है। यह 25 के साथ काम करता है।