क्या JVM में JIT द्वारा निर्मित मूल कोड को देखने का कोई तरीका है?
क्या JVM में JIT द्वारा निर्मित मूल कोड को देखने का कोई तरीका है?
जवाबों:
मान लें कि आप सन हॉटस्पॉट JVM का उपयोग कर रहे हैं (अर्थात Oracle द्वारा java.com पर उपलब्ध कराया गया है ), आप ध्वज को जोड़ सकते हैं
-XX: + PrintOptoAssembly
अपना कोड चलाते समय यह जेआईटी संकलक द्वारा उत्पन्न अनुकूलित कोड को प्रिंट करेगा और बाकी को बाहर कर देगा।
यदि आप संपूर्ण बायोटेक देखना चाहते हैं, तो बिना चुने हुए भागों को शामिल करें
-XX: CompileThreshold = #
जब आप अपना कोड चला रहे हों।
आप इस आदेश और सामान्य रूप में JIT की कार्यक्षमता के बारे में अधिक पढ़ सकते हैं यहाँ ।
जैसा कि अन्य उत्तरों द्वारा समझाया गया है, आप निम्नलिखित JVM विकल्पों के साथ दौड़ सकते हैं:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
आप निम्नलिखित सिंटैक्स के साथ एक विशिष्ट विधि पर भी फ़िल्टर कर सकते हैं:
-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod
टिप्पणियाँ:
यदि आप Windows चला रहे हैं, तो इस पृष्ठ पर निर्माण और स्थापित करने के निर्देश हैं hsdis-amd64.dllऔर hsdis-i386.dllजिन्हें इसे काम करने के लिए आवश्यक है। हम नीचे कॉपी करते हैं और संदर्भ के लिए उस पेज की सामग्री का विस्तार करते हैं:
प्रीबिलीट बायनेरिज़ कहाँ से लाएँ
आप fcml प्रोजेक्ट से विंडोज के लिए प्रीबिल्ट बायनेरी डाउनलोड कर सकते हैं
विंडोज का निर्माण hsdis-amd64.dllऔर निर्माण कैसे करेंhsdis-i386.dll
गाइड का यह संस्करण विंडोज 8.1 64 बिट पर 64-बिट Cygwin और hsdis-amd64.dll का उपयोग करके तैयार किया गया था
सिगविन स्थापित करें । पर Select Packagesस्क्रीन, निम्न पैकेज को जोड़ने (विस्तार करके Develश्रेणी, तो पर एक बार क्लिक Skipप्रत्येक पैकेज के नाम के आगे लेबल):
makemingw64-x86_64-gcc-core(केवल इसके लिए आवश्यक hsdis-amd64.dll)mingw64-i686-gcc-core(केवल इसके लिए आवश्यक hsdis-i386.dll)diffutils( Utilsश्रेणी में)सिगविन टर्मिनल चलाएं। यह इंस्टॉलर द्वारा बनाए गए डेस्कटॉप या स्टार्ट मेनू आइकन का उपयोग करके किया जा सकता है, और आपके साइगविन होम डायरेक्टरी ( C:\cygwin\home\<username>\या C:\cygwin64\home\<username>\डिफ़ॉल्ट रूप से) का निर्माण करेगा।
binutils-2.25.tar.bz2। यह binutils-2.25आपके Cygwin होम निर्देशिका में (या जो भी नवीनतम संस्करण है) नाम की निर्देशिका में परिणाम होना चाहिए ।src\share\toolsअपने Cygwin होम डायरेक्टरी में hsdis डायरेक्टरी (पाया हुआ ) निकालें ।cd ~/hsdis।बनाने के लिए hsdis-amd64.dll, दर्ज करें
make OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
बनाने के लिए hsdis-i386.dll, दर्ज करें
make OS=Linux MINGW=i686-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
या तो मामले में, 2.25आपके द्वारा डाउनलोड किए गए बिनुटिल संस्करण के साथ बदलें । OS=Linuxयह आवश्यक है, क्योंकि साइग्विन लिनक्स जैसा वातावरण है, लेकिन hsdis मेकफाइल इसे इस तरह से पहचानने में विफल रहता है।
./chew: No such file or directoryऔर gcc: command not found। संपादित <Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefileवर्डपैड या बदलने के लिए नोटपैड ++ की तरह एक पाठ संपादक में SUBDIRS = doc po(लाइन 342, अगर binutils 2.25 का प्रयोग करके) के लिए SUBDIRS = po। पिछली कमांड को फिर से चलाएं।DLL को अब इसे अपने JRE या डायरेक्टरी से कॉपी करके hsdis\build\Linux-amd64या इंस्टॉल किया जा सकता है । आप अपने सिस्टम पर ऐसी सभी निर्देशिकाएं खोज सकते हैं ।hsdis\build\Linux-i586bin\serverbin\clientjava.dll
बोनस टिप: यदि आप एटी एंड टी के लिए इंटेल एएसएम सिंटैक्स पसंद करते हैं, -XX:PrintAssemblyOptions=intelतो आपके द्वारा उपयोग किए जाने वाले किसी भी अन्य PrintAssembly विकल्प के साथ निर्दिष्ट करें।
* पेज लाइसेंस क्रिएटिव कॉमन्स है
/usr/lib/
उपयोग करने के लिए आपको एक hsdis प्लगइन की आवश्यकता है PrintAssembly। एक सुविधाजनक विकल्प FCML लाइब्रेरी पर आधारित hsdis प्लगइन है।
इसे UNIX जैसी प्रणालियों के लिए संकलित किया जा सकता है और विंडोज पर आप स्रोत पर एफसीएमएल डाउनलोड अनुभाग में उपलब्ध पूर्व-निर्मित पुस्तकालयों का उपयोग कर सकते हैं :
java.dll(विंडोज खोज का उपयोग करें) dll की प्रतिलिपि बनाएँ । अपने सिस्टम पर, मैंने इसे दो स्थानों पर पाया:
C:\Program Files\Java\jre1.8.0_45\bin\serverC:\Program Files\Java\jdk1.8.0_45\jre\bin\servercd <source code dir>./configure && make && sudo make installcd example/hsdis && make && sudo make installsudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/lib/amd64/hsdis-amd64.sosudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/jre/lib/amd64/hsdis-amd64.so/usr/lib/jvm/java-8-oraclejava -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
-XX:+LogCompilation -XX:PrintAssemblyOptions=intel,mpad=10,cpad=10,code
-jar fcml-test.jar
अतिरिक्त कॉन्फ़िगरेशन पैरामीटर:
कोड प्रिंट मशीन कोड mnemonic से पहले।
इंटेल इंटेल सिंटैक्स का उपयोग करें।
गैस एटी एंड टी कोडांतरक सिंटैक्स (जीएनयू कोडांतरक संगत) का उपयोग करें।
दिसम्बर प्रिंटों IMM और दशमलव मान के रूप में विस्थापन। निर्देश के mnemonic हिस्से के लिए
mpad = XX पैडिंग।
cpad = XX कोड मशीन कोड के लिए।
seg डिफ़ॉल्ट सेगमेंट रजिस्टर दिखाता है।
शून्य एचईएक्स शाब्दिक के मामले में अग्रणी शून्य दिखाओ।
विंडोज के मामले में इंटेल सिंटैक्स एक डिफ़ॉल्ट है, जबकि एटी एंड टी एक जीएनयू / लिनक्स के लिए एक डिफ़ॉल्ट है।
अधिक जानकारी के लिए FCML लाइब्रेरी रेफरेंस मैनुअल देखें
apt-get install libhsdis0-fcml( askubuntu.com/a/991166/489909 )। इसे स्वयं बनाना आवश्यक नहीं हो सकता है।
उत्पाद मोड में भी हॉटस्पॉट (सूर्य था) जेवीएम के लिए:
http://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
कुछ विधानसभा की आवश्यकता है: यह एक प्लगइन की जरूरत है।
मेरा मानना है कि अगर आप इसे विंडोज़ मशीन पर चला रहे हैं तो WinDbg मददगार होगा। मैंने सिर्फ एक जार चलाया है।
केबी द्वारा मानव रहित कॉलस्टैक के माध्यम से देखा गया था:
0008fba8 7c90e9c0 ntdll! KiFastSystemCallRet
0008fbac 7c8025cb ntdll! ZwWaitForSingleObject + 0xc
0008fc10 7c802532 kernel32! WaitForSingleObjectEx + 0xa8
0008fc24 00403a13 kernel32! WaitForSingleObject + 0x12
0008fc40 00402f68 जावा + 0x3a13
0008fee4 004087b8 जावा + 0x2f68
0008ffc0 7c816fd7 जावा + 0x87b8
0008fff0 00000000 kernel32! BaseProcessStart + 0x23
हाइलाइट की गई लाइनें JVM पर डायरेक्ट JIT-ed कोड चला रही हैं।
तब हम विधि पते की तलाश कर सकते हैं:
java + 0x2f68 00402f68 है
WinDBG पर:
देखें पर क्लिक करें -> डिसएस्पेशन।
Edit -> Address पर क्लिक करें। वहाँ 00402f68
रखो
और मिल गया
00402f68 55 पुश
ebp 00402f69 8bec mov ebp, esp
00402f6b 81ec80020000 उप एस्प, 280h
00402f71 53 पुश
ईबेक्स 00402f72 56 पुश
esi 00402f73 57 पुश एडी
... और इतने पर
अतिरिक्त जानकारी के लिए यहाँ उदाहरण है कि प्रक्रिया खोजकर्ता और WinDbg का उपयोग करके मेमोरी डंप से JIT-ed कोड को कैसे ट्रेस करें।
जेएमएच के परफ्यूम प्रोफाइलर्स ( LinuxPerfAsmProfilerया WinPerfAsmProfiler) के साथ अपने हॉटस्पॉट्स की असेंबली प्रिंट करें । जेएमएच को hsdisपुस्तकालय की आवश्यकता होती है क्योंकि यह निर्भर करता है PrintAssembly।