ऑपरेटिंग सिस्टम मेमोरी क्षेत्रों पर I / O संचालन करते हैं। ये मेमोरी क्षेत्र, जहाँ तक ऑपरेटिंग सिस्टम का संबंध है, बाइट्स के सन्निहित अनुक्रम हैं। यह कोई आश्चर्य की बात नहीं है कि केवल बाइट बफ़र्स ही I / O संचालन में भाग लेने के पात्र हैं। यह भी याद रखें कि ऑपरेटिंग सिस्टम सीधे प्रक्रिया के पते स्थान तक पहुंच जाएगा, इस मामले में JVM प्रक्रिया, डेटा स्थानांतरित करने के लिए। इसका मतलब है कि मेमोरी क्षेत्र जो I / O पेरेशन के लक्ष्य हैं, बाइट्स के सन्निहित अनुक्रम होने चाहिए। JVM में, बाइट्स की एक सरणी को मेमोरी में संचित रूप से संग्रहीत नहीं किया जा सकता है, या गारबेज कलेक्टर इसे किसी भी समय स्थानांतरित कर सकता है। जावा में एरेज़ ऑब्जेक्ट हैं, और जिस तरह से डेटा को उस ऑब्जेक्ट के अंदर संग्रहीत किया जाता है, वह एक जेवीएम कार्यान्वयन से दूसरे में भिन्न हो सकता है।
इस कारण से, एक प्रत्यक्ष बफर की धारणा शुरू की गई थी। प्रत्यक्ष बफ़र्स चैनलों और देशी I / O दिनचर्या के साथ बातचीत के लिए अभिप्रेत हैं। वे बाइट तत्वों को एक मेमोरी क्षेत्र में संग्रहीत करने का सबसे अच्छा प्रयास करते हैं जिसे एक चैनल डायरेक्ट, या रॉ के लिए उपयोग कर सकता है, ऑपरेटिंग सिस्टम को सीधे चलाने या मेमोरी क्षेत्र को भरने के लिए देशी कोड का उपयोग करके कह सकता है।
प्रत्यक्ष बाइट बफ़र आमतौर पर I / O संचालन के लिए सबसे अच्छा विकल्प हैं। डिज़ाइन के अनुसार, वे JVM के लिए उपलब्ध सबसे कुशल I / O तंत्र का समर्थन करते हैं। नॉनडायरेक्ट बाइट बफ़र्स चैनलों को पारित किया जा सकता है, लेकिन ऐसा करने पर प्रदर्शन जुर्माना हो सकता है। आमतौर पर एक nondirect बफ़र के लिए मूल I / O ऑपरेशन का लक्ष्य होना संभव नहीं है। यदि आप लिखने के लिए किसी चैनल के लिए एक नॉनडायरेक्ट बाइटफायर ऑब्जेक्ट पास करते हैं, तो चैनल प्रत्येक पर निम्नलिखित कार्य कर सकता है:
- एक अस्थायी प्रत्यक्ष बाइटबफ़र ऑब्जेक्ट बनाएं।
- अस्थायी बफ़र के लिए nondirect बफ़र की सामग्री की प्रतिलिपि बनाएँ।
- अस्थायी बफर का उपयोग करके निम्न-स्तर I / O ऑपरेशन करें।
- अस्थायी बफर ऑब्जेक्ट दायरे से बाहर हो जाता है और अंततः कचरा एकत्र किया जाता है।
यह संभावित रूप से हर I / O पर बफर कॉपी और ऑब्जेक्ट मंथन में परिणाम कर सकता है, जो कि ठीक उसी तरह की चीजें हैं जिनसे हम बचना चाहते हैं। हालांकि, कार्यान्वयन के आधार पर, चीजें इस खराब नहीं हो सकती हैं। रनटाइम कैश की संभावना होगी और प्रत्यक्ष बफ़र्स का पुन: उपयोग करेगा या थ्रूपुट को बढ़ावा देने के लिए अन्य चतुर चालें करेगा। यदि आप केवल एक बार उपयोग के लिए बफर बना रहे हैं, तो अंतर महत्वपूर्ण नहीं है। दूसरी ओर, यदि आप उच्च-प्रदर्शन परिदृश्य में बार-बार बफर का उपयोग कर रहे हैं, तो आप सीधे बफ़र्स को आवंटित करने और उनका पुन: उपयोग करने से बेहतर हैं।
प्रत्यक्ष बफ़र्स I / O के लिए इष्टतम हैं, लेकिन वे नॉनडायरेक्ट बाइट बफ़र की तुलना में अधिक महंगा हो सकते हैं। डायरेक्ट बफ़र्स द्वारा उपयोग की जाने वाली मेमोरी को देशी, ऑपरेटिंग सिस्टम-विशिष्ट कोड के माध्यम से कॉल करके आवंटित किया जाता है, मानक JVM हीप को दरकिनार करता है। मेजबान ऑपरेटिंग सिस्टम और JVI कार्यान्वयन के आधार पर, प्रत्यक्ष बफ़र्स की तुलना में सीधे बफ़र्स को स्थापित करना और फाड़ना काफी महंगा हो सकता है। प्रत्यक्ष बफ़र्स के मेमोरी-स्टोरेज क्षेत्र कचरा संग्रहण के अधीन नहीं हैं क्योंकि वे मानक जेवीएम ढेर के बाहर हैं।
प्रत्यक्ष बनाम नॉनडायरेक्ट बफ़र्स का उपयोग करने का प्रदर्शन ट्रेडऑफ़ JVM, ऑपरेटिंग सिस्टम और कोड डिज़ाइन द्वारा व्यापक रूप से भिन्न हो सकता है। ढेर के बाहर स्मृति आवंटित करके, आप अपने आवेदन को अतिरिक्त बलों के अधीन कर सकते हैं, जिसमें जेवीएम अनजान है। खेल में अतिरिक्त चलती भागों को लाते समय, सुनिश्चित करें कि आप वांछित प्रभाव प्राप्त कर रहे हैं। मैं पुराने सॉफ़्टवेयर को अधिकतम करने की सलाह देता हूं: पहले इसे काम करें, फिर इसे तेज करें। अनुकूलन के बारे में बहुत अधिक चिंता मत करो सामने; पहले शुद्धता पर ध्यान केंद्रित करें। जेवीएम कार्यान्वयन बफर कैशिंग या अन्य अनुकूलन करने में सक्षम हो सकता है जो आपको अपनी ओर से अनावश्यक प्रयास के बिना आपको आवश्यक प्रदर्शन देगा।