অপারেটিং সিস্টেমগুলি মেমরি অঞ্চলে I / O অপারেশন করে। অপারেটিং সিস্টেমের সাথে সম্পর্কিত এই মেমরি অঞ্চলগুলি বাইটের সুসংগত ক্রম। তখন অবাক হওয়ার কিছু নেই যে কেবল বাইট বাফারই I / O ক্রিয়াকলাপে অংশ নিতে পারবেন। এছাড়াও মনে রাখবেন যে অপারেটিং সিস্টেমটি প্রক্রিয়াটির ঠিকানা স্থানটিতে সরাসরি প্রবেশ করবে, এক্ষেত্রে জেভিএম প্রক্রিয়াটি ডেটা স্থানান্তর করতে to এর অর্থ হ'ল মেমোরি অঞ্চলগুলি I / O প্যারিশনের লক্ষ্যবস্তু অবশ্যই বাইটের সংলগ্ন ক্রম হতে হবে। জেভিএম-তে, বাইটের একটি অ্যারে স্মৃতিতে স্বচ্ছন্দভাবে সংরক্ষণ করা যায় না, বা আবর্জনা সংগ্রাহক যে কোনও সময় এটিকে স্থানান্তর করতে পারে। অ্যারেগুলি জাভাতে অবজেক্টস এবং সেই বস্তুর অভ্যন্তরে যেভাবে ডেটা সংরক্ষণ করা হয় তা এক জেভিএম বাস্তবায়ন থেকে অন্যটিতে পরিবর্তিত হতে পারে।
এই কারণে, সরাসরি বাফার ধারণাটি চালু হয়েছিল। সরাসরি বাফারগুলি চ্যানেল এবং স্থানীয় I / O রুটিনের সাথে ইন্টারঅ্যাক্ট করার উদ্দেশ্যে। তারা কোনও মেমরি অঞ্চলে বাইট উপাদানগুলি সঞ্চয় করার জন্য সেরা চেষ্টা করে যা কোনও চ্যানেল সরাসরি, বা কাঁচা, অ্যাক্সেসের জন্য অপারেটিং সিস্টেমটিকে মেমরির অঞ্চলটি সরাসরি ড্রেইন করতে বা পূরণ করতে অপারেটিং সিস্টেমটি বলতে দেশীয় কোড ব্যবহার করে ব্যবহার করতে পারে।
ডাইরেক্ট বাইট বাফারগুলি সাধারণত I / O ক্রিয়াকলাপের জন্য সেরা পছন্দ। নকশা দ্বারা, তারা JVM- এ উপলব্ধ সবচেয়ে দক্ষ I / O প্রক্রিয়া সমর্থন করে। ননডাইরেক্ট বাইট বাফারগুলি চ্যানেলগুলিতে পাস করা যেতে পারে তবে এটি করলে পারফরম্যান্সের জরিমানা হতে পারে। কোনও ননডাইরেক্ট বাফারের পক্ষে স্থানীয় আই / ও ক্রিয়াকলাপের লক্ষ্য হওয়া সাধারণত সম্ভব হয় না। আপনি যদি লেখার জন্য কোনও চ্যানেলটিতে কোনও অপ্রত্যক্ষভাবে বাইটফুফার বস্তুটি পাস করেন তবে চ্যানেল প্রতিটি কলটিতে স্পষ্টতই নিম্নলিখিতটি করতে পারে:
- একটি অস্থায়ী সরাসরি বাইটবফার অবজেক্ট তৈরি করুন।
- অস্থায়ী বাফারে ননডাইরেক্ট বাফারের সামগ্রীটি অনুলিপি করুন।
- অস্থায়ী বাফারটি ব্যবহার করে নিম্ন-স্তরের আই / ও অপারেশন করুন।
- অস্থায়ী বাফার অবজেক্টটি সুযোগের বাইরে চলে যায় এবং অবশেষে আবর্জনা সংগ্রহ করা হয়।
এর ফলে প্রতিটি আই / ও-তে বাফার অনুলিপি এবং অবজেক্ট মন্থানের ফলস্বরূপ ঘটতে পারে যা হ'ল আমরা এড়াতে চাই। তবে, বাস্তবায়নের উপর নির্ভর করে জিনিসগুলি এই খারাপ নাও হতে পারে। রানটাইম সম্ভবত ক্যাফ করবে এবং সরাসরি বাফারগুলিকে পুনরায় ব্যবহার করবে বা থ্রুপুট বাড়ানোর জন্য অন্যান্য চালাক কৌশল করবে। আপনি যদি কেবল একবারের ব্যবহারের জন্য বাফার তৈরি করেন তবে পার্থক্যটি তাত্পর্যপূর্ণ নয়। অন্যদিকে, আপনি যদি উচ্চ-পারফরম্যান্সের দৃশ্যে বার বার বাফার ব্যবহার করছেন, আপনি সরাসরি বাফারগুলি বরাদ্দ করা এবং সেগুলি পুনরায় ব্যবহার করার চেয়ে ভাল।
ডাইরেক্ট বাফারগুলি I / O এর জন্য অনুকূল, তবে এগুলি ননডাইরেক্ট বাইট বাফারগুলির তুলনায় তৈরি করা আরও ব্যয়বহুল। প্রত্যক্ষ বাফার দ্বারা ব্যবহৃত মেমরিটি স্ট্যান্ডার্ড জেভিএম হিপকে বাইসাস করে স্থানীয়, অপারেটিং সিস্টেম-নির্দিষ্ট কোডের মাধ্যমে কল করে বরাদ্দ করা হয়। হোস্ট অপারেটিং সিস্টেম এবং জেভিএম বাস্তবায়নের উপর নির্ভর করে সরাসরি বাফার সেট আপ করা এবং ছিন্ন করা হিপ-আবাসিক বাফারের চেয়ে উল্লেখযোগ্যভাবে ব্যয়বহুল হতে পারে। প্রত্যক্ষ বাফারগুলির মেমরি-স্টোরেজ অঞ্চলগুলি আবর্জনা সংগ্রহের সাপেক্ষে নয় কারণ এগুলি স্ট্যান্ডার্ড জেভিএম স্তূপের বাইরে।
সরাসরি বনাম ননডেরেক্ট বাফার ব্যবহারের পারফরম্যান্স ট্রেড অফগুলি জেভিএম, অপারেটিং সিস্টেম এবং কোড ডিজাইনের মাধ্যমে ব্যাপকভাবে পরিবর্তিত হতে পারে। স্তূপের বাইরে মেমরি বরাদ্দের মাধ্যমে আপনি জেভিএম অজানা এমন অতিরিক্ত বাহিনীর কাছে আপনার আবেদনটি প্রয়োগ করতে পারেন। খেলায় অতিরিক্ত চলমান অংশ আনার সময়, আপনি পছন্দসই প্রভাবটি অর্জন করছেন তা নিশ্চিত করুন। আমি পুরানো সফ্টওয়্যার ম্যাক্সিমামের পরামর্শ দিচ্ছি: প্রথমে এটি কাজ করুন, তারপরে এটি দ্রুত তৈরি করুন। সামনের দিকে অপ্টিমাইজেশন সম্পর্কে খুব বেশি চিন্তা করবেন না; যথার্থতার উপর প্রথমে মনোনিবেশ করুন। জেভিএম বাস্তবায়ন বাফার ক্যাচিং বা অন্যান্য অপ্টিমাইজেশানগুলি সম্পাদন করতে সক্ষম হতে পারে যা আপনার পক্ষ থেকে অনেক অযৌক্তিক প্রচেষ্টা ছাড়াই আপনার প্রয়োজনীয় পারফরম্যান্স দেবে।