J2ObjC মেমরি মডেল

এই দস্তাবেজটি বর্ণনা করে যে J2ObjC অনুবাদিত কোডের অধীনে মেমরি কীভাবে পরিচালিত হয় এবং শেয়ার্ড মেমরি অ্যাক্সেস করার সময় প্রোগ্রামগুলি কীভাবে আচরণ করে।

স্মৃতি ব্যবস্থাপনা

J2ObjC-এর লক্ষ্যগুলির মধ্যে একটি হল অনুবাদিত কোড তৈরি করা যা অবজেক্টিভ-সি-এর রেফারেন্স গণনা পরিবেশে নির্বিঘ্নে একীভূত হবে। এটি স্থানীয়ভাবে লিখিত অবজেক্টিভ-সি থেকে অনুবাদ করা জাভা কোডকে ব্যবহার করা সহজ করে তোলে কারণ জাভা এবং অবজেক্টিভ-সি পরিবেশের মধ্যে পাস করা বস্তুর মালিকানার কোনো বিশ্রী স্থানান্তর নেই।

যেহেতু জাভা মেমরি ম্যানেজমেন্টের জন্য আবর্জনা সংগ্রহ ব্যবহার করে, জাভা কোডে এর বস্তুর কোনো সুস্পষ্ট মেমরি ব্যবস্থাপনা নেই। তাই J2ObjC অবশ্যই সঠিকভাবে রেফারেন্স কাউন্টিং কলগুলি সন্নিবেশ করান যাতে বস্তুগুলি সঠিক সময়ে ডিললোকেট করা হয়। আমরা নিম্নলিখিত নিয়মগুলির সেটে মীমাংসা করেছি যা আমরা পারফরম্যান্ট এবং ব্যবহারিক উভয়ই পেয়েছি:

  • সমস্ত বস্তু অন্তত বর্তমান অটোরিলিজ পুলের সময়কালের জন্য বেঁচে থাকবে।
    • এই সাধারণ নিয়ম আমাদেরকে অনেক রিটেন এবং রিলিজ এড়িয়ে যেতে দেয় যা অন্যথায় প্রয়োজনীয় হবে।
  • স্থানীয় ভেরিয়েবল বজায় রাখা হয় না.
    • স্থানীয় ভেরিয়েবলের রিড বা রাইটে কোন রেফারেন্স কাউন্টিং কল নেই।
  • ক্ষেত্রগুলি ধরে রাখা হয়।
    • একটি ফিল্ড কলের অ্যাসাইনমেন্ট নতুন মান ধরে রাখে এবং পুরানো মানের উপর অটোরিলিজ।
  • নতুন বস্তু অবিলম্বে স্বয়ংক্রিয়ভাবে প্রকাশিত হয়. (যদি না অবিলম্বে একটি ক্ষেত্রে বরাদ্দ করা হয়)

রেফারেন্স চক্র

একটি রেফারেন্স চক্র বিদ্যমান থাকে যখন একটি বস্তু প্রত্যক্ষ বা পরোক্ষভাবে এর ক্ষেত্রগুলির মাধ্যমে নিজেকে বোঝায়। রেফারেন্স চক্র জাভা এর আবর্জনা সংগ্রহের দ্বারা পরিষ্কার করা যেতে পারে, কিন্তু অবজেক্টিভ-সি এর রেফারেন্স গণনা পরিবেশে মেমরি লিক করবে। রেফারেন্স চক্র ঘটতে থেকে প্রতিরোধ করার কোন স্বয়ংক্রিয় উপায় নেই; যাইহোক, আমরা একটি সাইকেল ফাইন্ডার টুল প্রদান করি যা চক্রের সনাক্তকরণ স্বয়ংক্রিয় করে। এখানে একটি রেফারেন্স চক্র ঠিক করার কিছু সাধারণ উপায় আছে:

  • রেফারেন্সগুলির একটিকে দুর্বল করতে একটি @Weak বা @WeakOuter টীকা যোগ করুন।
  • একটি cleanup() পদ্ধতি যোগ করুন বস্তুর একটিতে যা কিছু ক্ষেত্রকে শূন্য করে দেয়। অবজেক্টটি বাতিল করার আগে cleanup() কে কল করুন।
  • সম্পূর্ণভাবে একটি রেফারেন্স চক্র তৈরি এড়াতে কোডটি পুনরায় ডিজাইন করুন।

ভাগ করা মেমরি

একটি মাল্টি-থ্রেডেড প্রোগ্রামে, কিছু ডেটা একাধিক থ্রেড দ্বারা ভাগ করা যেতে পারে। জাভা ভাগ করা ডেটাতে থ্রেড-নিরাপদ অ্যাক্সেসের অনুমতি দেওয়ার জন্য বিভিন্ন সরঞ্জাম সরবরাহ করে। এই বিভাগটি ভাগ করা ডেটা অ্যাক্সেস করার জন্য J2ObjC এর সমর্থন বর্ণনা করে।

সিঙ্ক্রোনাইজড

J2ObjC synchronized কীওয়ার্ডকে সরাসরি Objective-C @synchronized এ ম্যাপ করে।

পারমাণবিকতা

জাভা long এবং double ছাড়া সব ধরনের লোড এবং স্টোরের জন্য পারমাণবিকতার গ্যারান্টি দেয়। JLS-17.7 দেখুন। volatile ক্ষেত্রগুলি বাদ দিয়ে (নীচে বর্ণিত) J2ObjC পারমাণবিক লোড এবং স্টোরগুলি নিশ্চিত করার জন্য কোনও বিশেষ চিকিত্সা সরবরাহ করে না। এটি নিম্নলিখিত বোঝায়:

  • যেহেতু সমস্ত iOS প্ল্যাটফর্ম 32 বা 64-বিট, তাই long এবং double ছাড়া আদিম ধরনের লোড এবং স্টোর 32-বিট ডিভাইসে পারমাণবিক, এবং সবগুলি 64-বিট সিস্টেমে পারমাণবিক।
  • J2ObjC-এ বস্তুর প্রকারের লোড এবং স্টোরগুলি পারমাণবিক নয়।
    • পারমাণবিকভাবে রেফারেন্স কাউন্ট আপডেট করা খুব ব্যয়বহুল।
    • একটি বস্তুর ক্ষেত্রকে volatile ঘোষণা করে পারমাণবিক করা যেতে পারে। (নিচে দেখ)

উদ্বায়ী ক্ষেত্র

volatile ক্ষেত্রগুলির জন্য, জাভা পারমাণবিকতা এবং ক্রমানুসারে সামঞ্জস্যপূর্ণ ক্রম ( JLS-8.3.1.4 ) উভয়ই প্রদান করে, যা সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করা যেতে পারে। J2ObjC সমস্ত volatile ক্ষেত্রের জন্য জাভা হিসাবে একই গ্যারান্টি প্রদান করে। J2ObjC volatile ক্ষেত্রগুলির জন্য নিম্নলিখিত প্রক্রিয়াগুলি ব্যবহার করে:

  • আদিম প্রকারগুলি c11 পারমাণবিক প্রকারে ম্যাপ করা হয়।
    • যেমন volatile int -> _Atomic(jint)
  • অবজেক্ট ক্ষেত্রগুলি pthread mutex লক দিয়ে সুরক্ষিত। (অগ্রাধিকার বিপর্যয়ের কারণে স্পিন লক ব্যবহার করা যাবে না)
    • রেফারেন্স গণনার সাথে জাতিগত পরিস্থিতি রোধ করতে পারস্পরিক বর্জন প্রয়োজনীয়।
    • বাস্তবায়নটি উদ্দেশ্য-সি পারমাণবিক বৈশিষ্ট্যের অনুরূপ।

পারমাণবিক প্রকার

Java java.util.concurrent.atomic প্যাকেজে বেশ কয়েকটি পারমাণবিক প্রকার সরবরাহ করে। এগুলি সম্পূর্ণরূপে কাস্টম বাস্তবায়ন সহ J2ObjC-তে সমর্থিত।

চূড়ান্ত ক্ষেত্র

জাভা গ্যারান্টি দেয় যে একটি থ্রেড অবজেক্ট শেয়ার করার সময় কোনো সিঙ্ক্রোনাইজেশনের প্রয়োজন ছাড়াই একটি অবজেক্টের চূড়ান্ত ক্ষেত্রগুলির জন্য প্রারম্ভিক মান দেখতে পায়। ( JSL-17.5 ) যাইহোক, যেহেতু J2ObjC অ-উদ্বায়ী বস্তুর প্রকারের পারমাণবিক অ্যাক্সেস সমর্থন করে না (উপরে দেখুন), সিঙ্ক্রোনাইজেশন ছাড়া কোনো বস্তু শেয়ার করার কোনো নিরাপদ উপায় নেই। অতএব, চূড়ান্ত ক্ষেত্রগুলির জন্য প্রয়োজনীয় মেমরি বেড়া বাদ দিয়ে J2ObjC ব্যবহারকারীর উপর কোন অতিরিক্ত সীমাবদ্ধতা রাখা হয় না।