JVM In Hindi: Java Virtual Machine / JVM हिंदी में / What is Java virtual machine and how it works?

हेलो Friends , आज के इस blog post में मैं आपको एक बहुत ही interesting and important Java topic के बारे में बताने वाला हूँ, जिसे आप Jvm के नाम से जानते है, इसका पूरा नाम है Java virtual machine| अगर अपने Jvm की functionality को अच्छे से समझ लिया तो यह आपके लिए यह बहुत लाभदाई हो जाएगी, क्योकि ज्यादातर परीक्षा में या interview में Jvm के बारे जरूर पूछा जाता है |

अगर आप Java को एक शरीर मान ले तो JVM उसका दिल है, जिस तरह शरीर को जीने के लिए दिल की जरुरत होती है उसी तरह Java को program execute करने के लिए JVM की जरुरत होती है, यह Java language में main functionality को operate करता है| या फिर आप कह सकते है कि कि यह पूरी जावा language का कर्ता धर्ता होता है |

JVM .class file को लेकर उसमे मौजूद सभी byte code instruction को machine language में convert कर देता है, जो कि बाद में micro processor द्वारा execute किये जाते है |

निचे दिए हुए चित्र में आप JVM का architecture देख सकते है |

component in JVM architecture in java
component in JVM architecture in java

सबसे पहले जब हम Java में प्रोग्राम लिखते है तो .Java फाइल बनती है, फिर Java compiler उसे .class फाइल में कन्वर्ट कर देता है, जिसमे byte code instruction होते है | पर यहाँ पर याद रखने वाली बात यह है कि Java compiler Jvm के बहार होता है,वह jvm का एक integral part होता है |

इसके बाद .class file को Jvm में पास किया जाता है | Jvm में एक module (program) होता है, जिसे हम class laoder sub system कहते है, जो कि निम्नलिखित function perfrom करता है |

सबसे पहले यह .class फाइल को memory में laod करता है |

इसके बाद यह verify करता है कि सभी byte code instruction proper है या नहीं | अगर इसे किसी भी byte code instruction में कोई भी दिक्कत समझ आती है या वह suspecious लगता है तो यह तुरंत ही execution को reject कर देता है |

और अगर byte code instrcution सही और proper तरीके से होते है तो वह उन्हें जरुरी memory allocate करता है जिससे की program execute हो सके|

execution of java program
execution of java program

यह memory 5 भाग में divide होती है, जिसे run time data areas भी कहते है | यह Area program run होने के दौरान data और result को रखता है | इन सभी areas का विवरण निम्नलिखित है |

Method Area :

method Area वह memory block होता है जो कि, class code , variable code , and Java program के method के code को store करता है (यहाँ method का आशय function से है जो कि class के अंदर लिखे जाते है )

Heap :

heap Area वह एरिया होता है जहाँ पर object create होते है| Jvm के class laod करते ही method Area और heap Area तुरंत crate हो जाते है |

Java stacks :

method code method Area में store होते है | पर जब किसी method को रन किया जाता है तब उसे data और result को store करने के लिए कुछ और memory की आवश्यकता होती है | यह memory Java stacks में allocate होती है | इस आधार पर हम यह कह सकते है कि, Java stacks वह memory Area होते है जहाँ पर Java method execute होते है |

जब भी method execute होते है, तब Java stack में उनके लिए separate frame create होता है, जहाँ पर method execute होता है | जवं प्रत्येक method को execute करने के लिए separate thread (process) का use करता है|

PC (program Counter) Register :

यह register वह memory areas होते है जो method में लिखे गए instructions के मेमोरी एड्रेस कि जानकारी रखते है | जैसे कि अगर यहाँ पर तीन method है तो इस सभी मेथड के इंस्ट्रक्शन के मेमोरी एड्रेस को track करने के लिए तीन PC होंगे, जो कि इन सभी method की जानकारी रखेंगे|

Native method stacks :

जैसे की हमने ऊपर पढ़ा की Java method Java stacks में एक्सेक्यूटे होते है | उसी तरह native method (फॉर example c/c++ functions) भी native method stacks में execute होते है | आमतौर पर native method को एक्सेक्यूटे करने के के लिए native method library (for example c/c++ header file) की जरुरत होती है | यह header फाइल एक प्रोग्राम के जरिये Jvm से connected रहती है जिसे हम native method interface कहते है |

जो execution इंजन होता है वह interpreter और JIT (just in time) compiler रखता है , जिनकी जिम्मेदारी होती है है कि वह byte code इंस्ट्रक्शन को मशीन कोड OR मशीन लैंग्वेज में कन्वर्ट कर दे, जिससे कि processor उन्हें execute कर सके|

ज्यादातर JMV implementations दोनों(interpreter and JIT compiler) का use करते है बाइट कोड को मशीन कोड में कन्वर्ट करने के लिए| इस तकनीक को हम adaptive optimizer भी कहते है |

आमतौर पर होता यह है कि कोई भी language (like c/c++, fortan , cobol , etc .) source code को मशीन कोड में कन्वर्ट करने के लिए या तो interpreter use करती है या फिर compiler , पर Jvm में interpreter और JIT compiler दोनों एक साथ काम कर सकते है और byte code को मशीन कोड में कन्वर्ट कर सकते है |

पर यहाँ सोचने वाली बात यह है कि हमें दोनों कि जरुरत क्यों पड़ती है, और इन दोनों का एक साथ use कैसे करते है ?

इस functionality को समझने के लिए हम एक simple code लेते है जो कि निचे दिया गया है, assume कीजिये यह हमारा बीटे code instructions है |

print a;
print b;
Repeat the following 10 times by changing i value from 1 to 10;
print a;

जब interpreter first इंस्ट्रक्शन का execution start करता है, तब यह print a; को मशीन कोड में कन्वर्ट करता है और फिर उसे प्रोसेसर के पास execution के लिए भेज देता है, मान लीजिये इस सब में उसको 2 nano second का टाइम लगता है |

अब उसी तरह interpreter दूसरे instruction print b ; को machine language में convert करता है और फिर उसे प्रोसेसर के पास execution के लिए भेज देता है, मान लेते है उसे यह सब करने में 2 nano second का टाइम लगता है |

अब इंटरप्रेटर थर्ड इंस्ट्रक्शन पर आता है जो कि एक looping instruction है, जिसे 10 टाइम run होना है, जैसा कि हमने ऊपर देखा इंटरप्रेटर एक स्टेटमेंट को execute करने में 2 nano सेकंड का टाइम ले रहा था, अब यहाँ पर उसे 10 टाइम्स लूप में चलना है तो वह टोटल टाइम लेगा 10 *2 = 20 nanoseconds |

पर अगर हम यहाँ पर पर लगने वाला टाइम देखे जो कि 20 नैनो सेकंड है वह बहुत ज्यादा है और यह एक efficient process नहीं है इसलिए Jvm ऐसे कोड interpreter को assign नहीं करता है है | ऐसे कोड वह JIT cmpiler को allot करता है |

पर क्यों? चलिए आगे इसे भी समझते है कि JIT compiler इस looping instruction को कैसे execute करेगा?

जैसे ही JIT compiler इस इंस्ट्रक्शन पर आता है सबसे पहले वह इस इंस्ट्रक्शन print a; को रीड करता है और इसे मशीन कोड में कन्वर्ट करता है, मान लीजिये इसमें उसे 2 nanosecond का टाइम लगता है, और इसके बाद JIT compiler एक मेमोरी ब्लॉक allot करता है और इस मशीन कोड को उस मेमोरी ब्लॉक में push करता है, मान लीजिये इस प्रोसेस में भी compiler को 2 nano सैकंड का टाइम लगता है | फिर processor इस मेमोरी ब्लॉक से मशीन कोड को fetch करके इसे execute कर देता है |

तो हमने यहाँ देखा कि compiler को टोटल 4 नैनो सेकंड का टाइम लगा इस लूपिंग स्टेटमेंट को एक्सेक्यूटे करने में जहाँ पर interpreter को 20 नैनो सेकण्ड्स का टाइम लग रहा था |

पर अगर कम्पाइलर शुरू के दोनों इंस्ट्रक्शंस भी एक्सेक्यूटे करता तो उसे प्रत्येक इंस्ट्रक्शन में 4 -4 नैनो सेकण्ड्स का टाइम लगता मतलब टोटल 8 नैनो सेकण्ड्स का टाइम लगता, जबकि इंटरप्रेटर ने उसे 2 -2 नैनो सेकंड में पूरा कर दिया था मतलब टोटल 4 नैनो seconds में |

तो इस हिसाब से ऊपर के दो instructions के लिए interpreter उपयुक्त था और looping वाले इंस्ट्रक्टिनो के लिए compiler optimal था|

इस इस सब से यह निष्कर्ष निकलता है कि Jvm सबसे पहले देखता है कि कौन सा code interpreter के लिए छोड़ना है और कौन सा कोड कम्पाइलर को देना है | जिससे कि दोनों अपना execution कम से कम टाइम में फिनिश कर सके और performance को बेहतर कर सके और execution की speed को बढ़ा सके|

जो भी ब्लॉक JIT कम्पाइलर को execute करने के लिए assign होता है उसे हम hotspot भी कहते है |

इस तरह से हमने देखा कि किस तरह interpreter और compiler source code OR byte code को machine code में convert करने के लिए एक साथ काम करते है |

JVM(java virtual machine) platform dependent होता है, इसलिए Java platform-independent होती है?

Platform independent का मतलब यह होता है कि जब भी कोई language source code को compile करती है तो उसके बाद वह code किसी भी Platform (OS) में execute किया जा सकता है |

jvm platform dependent होता है, और इसका यही feature जावा को platform independent बनाता है | jvm platform dependent होता है क्योकि हर एक oprating system के लिए एक अलग jvm होता है | Java compiler source code को byte code में convert करता है जो कि एक indermediate byte code होता है जो कि किसी भी OS में executed किया जा सकता है |

Javac और JIT compiler में क्या difference होता है ?

Javac एक free Java compiler होता है जिसका काम Java के program को OR source code को byte code (.class file) में convert करने का होता है | जबकि JIT compiler jvm का ही एक हिस्सा होता है जो कि complex byte code (जो कि उसे jvm द्वारा assign किये जाते है) को machine code में convert करता है, जो कि बाद में processor द्वारा execute किये जाते है |

In the case of any queries, you can write to us at [email protected] we will get back to you ASAP.

Hope! you would have enjoyed this post about JVM: Java Virtual Machine In Hindi/ JVM हिंदी में.

Please feel free to give your important feedbacks in the comment section below.

Have a great time!

Anurag

I am a blogger by passion, a software engineer by profession, a singer by consideration and rest of things that I do is for my destination.