জাভা অবজেক্টগুলি আর উল্লেখ না করে কেন মুছে ফেলা হয় না?


77

জাভাতে, যত তাড়াতাড়ি কোনও বস্তুর আর কোনও রেফারেন্স নেই, এটি মুছে ফেলার জন্য যোগ্য হয়ে ওঠে, তবে জেভিএম সিদ্ধান্ত নেয় কখন বস্তুটি আসলে মুছে ফেলা হয়। অবজেক্টিভ-সি পরিভাষা ব্যবহার করতে, সমস্ত জাভা উল্লেখগুলি সহজাতভাবে "শক্তিশালী"। তবে, অবজেক্টিভ-সি-তে, যদি কোনও বস্তুর আর কোনও শক্তিশালী রেফারেন্স না থাকে তবে অবজেক্টটি সঙ্গে সঙ্গে মুছে ফেলা হবে। জাভাতে কেন এমনটি হচ্ছে না?


46
জাভা অবজেক্টস আসলে মুছে ফেলা হবে তখন আপনার যত্ন নেওয়া উচিত নয় । এটি একটি বাস্তবায়ন বিশদ।
বেসাইল স্টারিঙ্কেভিচ

154
@ বেসাইলস্টারিঙ্কেভিচ আপনার সিস্টেম / প্ল্যাটফর্ম কীভাবে কাজ করে তা আপনার পুরোপুরি যত্ন এবং চ্যালেঞ্জ করা উচিত। 'কীভাবে' এবং 'কেন' আরও ভাল প্রোগ্রামার হওয়ার অন্যতম সেরা উপায় এবং (আরও সাধারণভাবে, বুদ্ধিমান ব্যক্তি) প্রশ্ন জিজ্ঞাসা করা।
আর্তুর বিসিয়াদভস্কি

6
বিজ্ঞপ্তি রেফারেন্স থাকলে অবজেক্টিভ সি কী করবে? আমি ধরে নিলাম এটা কি তাদের ফাঁস?
মেহেরদাদ

45
@ArturBiesiadowksi: না, জাভা স্পেসিফিকেশন বলুন না যখন একটি বস্তু মুছে ফেলা হয় (এবং একইভাবে, জন্য R5RS )। আপনার জাভা প্রোগ্রামটি সম্ভবত বিকাশ করতে পারে এবং যদি সেই মুছে ফেলা কখনই ঘটে না (এবং জাভা হ্যালো ওয়ার্ল্ডের মতো স্বল্পকালীন প্রক্রিয়াগুলির জন্য এটি অবশ্যই ঘটে না)। আপনি জীবন্ত বস্তুর সেট (বা মেমরির খরচ) সম্পর্কে যত্ন নিতে পারেন, যা একটি ভিন্ন গল্প।
বেসাইল স্টারিনকিভিচ

28
একদিন নবজাতক মাস্টারকে বললেন, "আমাদের বরাদ্দের সমস্যার সমাধান আমার আছে We মাস্টার জবাব দিলেন "একদিন নবজাতক মাস্টারকে বললেন" আমার একটা সমাধান আছে ...
এরিক লিপার্ট

উত্তর:


79

প্রথমত, জাভাটির দুর্বল রেফারেন্স এবং নরম রেফারেন্স নামে আরও একটি সেরা প্রচেষ্টা বিভাগ রয়েছে। দুর্বল বনাম শক্তিশালী রেফারেন্স হ'ল রেফারেন্স গণনা বনাম আবর্জনা সংগ্রহ থেকে সম্পূর্ণ পৃথক সমস্যা।

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

এটি একপ্রকার বেতন চেকের জন্য মুদি শপিংয়ে যাওয়া এবং প্রতিদিন একদিনের জন্য পর্যাপ্ত খাবার পাওয়ার জন্য প্রতিদিন যাওয়ার মধ্যে পার্থক্যের মতো। আপনার একটি বড় ট্রিপটি স্বতন্ত্র ছোট ভ্রমণের চেয়ে অনেক বেশি সময় নেয় তবে সামগ্রিকভাবে আপনি সময় এবং সম্ভবত অর্থ সাশ্রয় করেন।


58
একজন প্রোগ্রামারের স্ত্রী তাকে সুপার মার্কেটে প্রেরণ করেন। তিনি তাকে বলেন, "একটি রুটি কিনুন, এবং যদি আপনি কিছু ডিম দেখতে পান তবে এক ডজন ধরুন।" প্রোগ্রামারটি পরে তার বাহুতে এক ডজন রুটি নিয়ে ফিরে আসে।
নিল

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

64
@ নিল কি 13 টি রুটি হওয়া উচিত নয়?
জেএডি

67
"
আইল

13
@ জ্যাড আমি 13 বলতাম, তবে বেশিরভাগই এটি পাওয়ার প্রবণতা রাখে না। ;)
নীল

86

কারণ সঠিকভাবে কিছু জানা আর উল্লেখ করা সহজ নয়। এমনকি সহজ কাছাকাছি না।

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


7
অথবা আপনি একটি পাইথন পদ্ধতি গ্রহণ করতে পারেন যেখানে আপনি যতটা সম্ভব রি-কাউন্টিং ব্যবহার করেন, যখন আপনি আশা করেন যে বৃত্তাকার নির্ভরতা মেমরি ফাঁস হয় সেখানে কোনও জিসি অবলম্বন করে। আমি দেখতে পাচ্ছি না কেন তারা জিসি ছাড়াও পুনরায় গণনা করতে পারল না?
মেহরদাদ

27
@ মেহরদাদ তারা পারত তবে সম্ভবত এটি ধীর হবে। কিছুই আপনাকে এটি বাস্তবায়ন থেকে বিরত রাখে না, তবে হটস্পট বা ওপেনজে 9 এর কোনও জিসিকেই হারানোর আশা করবেন না।
জোসেফ

21
@ jpmc26 কারণ যদি আপনি অবজেক্টগুলি আর ব্যবহার না করা মাত্রই মুছে ফেলা হয় তবে সম্ভাবনা বেশি থাকে আপনি একটি উচ্চ লোডের পরিস্থিতিতে তাদের মুছুন যা লোডকে আরও বাড়িয়ে তোলে। কম লোড থাকলে জিসি চালাতে পারে। রেফারেন্স গণনা নিজেই প্রতিটি রেফারেন্সের জন্য একটি ছোট ওভারহেড। এছাড়াও একটি জিসির সাহায্যে আপনি প্রায়শই একক অবজেক্ট পরিচালনা না করে রেফারেন্স ছাড়াই মেমরির একটি বড় অংশ বাতিল করতে পারেন।
জোসেফ

33
@ জোসেফ: যথাযথ রেফারেন্স গণনাও বিনামূল্যে নয়; রেফারেন্স গণনা আপডেটের জন্য পারমাণবিক বৃদ্ধি / হ্রাস প্রয়োজন, যা আশ্চর্যজনকভাবে ব্যয়বহুল , বিশেষত আধুনিক মাল্টিকোর আর্কিটেকচারগুলিতে। সিপিথনে এটি খুব একটা সমস্যা নয় (সিপিথন নিজেই অত্যন্ত ধীরে ধীরে, এবং জিআইএল তার মাল্টিথ্রিড পারফরম্যান্সকে একক-কোর স্তরের মধ্যে সীমাবদ্ধ করে), তবে একটি তাত্পর্যপূর্ণ ভাষায় যা সমান্তরালতা সমর্থন করে এটিও সমস্যা হতে পারে। পিআইপি রেফারেন্স গণনা সম্পূর্ণরূপে মুক্তি দেয় এবং কেবলমাত্র জিসি ব্যবহার করে এমন কোনও সুযোগ নয়।
মাত্তেও ইটালিয়া

10
@ মেহরদাদ একবার আপনি জাভা হিসাবে আপনার রেফারেন্স গণনা জিসি বাস্তবায়ন করেছেন আমি আনন্দের সাথে এটি এমন কোনও মামলা খুঁজে বের করতে পরীক্ষা করব যেখানে এটি অন্য কোনও জিসি প্রয়োগের চেয়ে খারাপ কাজ করে।
জোসেফ

45

আফাইক, জেভিএম স্পেসিফিকেশন (ইংরেজী ভাষায় লিখিত) নির্দিষ্টভাবে কখন কোনও বস্তু (বা কোনও মান) মুছতে হবে তা উল্লেখ করে না এবং এটি প্রয়োগে (একইভাবে আর 5 আরএসের জন্য ) রেখে দেয়) এটি কোনওভাবে কোনও আবর্জনা সংগ্রাহকের প্রয়োজন বা পরামর্শ দেয় তবে বিশদটি বাস্তবায়নে ফেলে। এবং একইভাবে জাভা স্পেসিফিকেশন জন্য।

মনে রাখবেন যে প্রোগ্রামিং ভাষা হয় উল্লেখ (এর সিনট্যাক্স , শব্দার্থবিদ্যা , না সফটওয়্যার বাস্তবায়নের, ইত্যাদি ...)। জাভা (বা এর জেভিএম) এর মতো ভাষার অনেকগুলি বাস্তবায়ন রয়েছে। এর স্পেসিফিকেশন প্রকাশিত , ডাউনলোডযোগ্য (যাতে আপনি এটি অধ্যয়ন করতে পারেন) এবং ইংরেজিতে লেখা। V2.5.3 জেভিএম বৈশিষ্ট্যের গাদা একটি আবর্জনা সংগ্রহকারী সম্পর্কে উল্লেখ করেছেন:

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

(জোর আমার; বিটিডব্লিউ চূড়ান্তকরণ জাভা স্পেসের 12.6 ডলারে উল্লেখ করা হয়েছে , এবং একটি মেমরি মডেল জাভা স্পেসের 17.4 ডলারে রয়েছে)

সুতরাং (জাভাতে) কখনই কোনও বিষয় মুছে ফেলা হবে সেদিকে আপনার নজর দেওয়া উচিত নয় এবং এটি কোড না হয়ে থাকলে আপনি কোড করতে পারেন (এমন কোনও বিমূর্তে যুক্তি দিয়ে যেখানে আপনি তা উপেক্ষা করছেন)। অবশ্যই আপনাকে মেমরির খরচ এবং জীবন্ত সামগ্রীর সেট সম্পর্কে যত্ন নেওয়া দরকার যা একটি আলাদা প্রশ্ন। বেশ কয়েকটি সহজ ক্ষেত্রে ("হ্যালো ওয়ার্ল্ড" প্রোগ্রামের কথা ভাবেন) আপনি নিজেকে বোঝানোর জন্য প্রমাণ করতে সক্ষম হলেন- বরাদ্দ হওয়া মেমরিটি বরং ছোট (উদাহরণস্বরূপ গিগাবাইটের চেয়ে কম), এবং তারপরে আপনার মোটেই যত্ন নেই স্বতন্ত্র জিনিস মুছে ফেলা । আরও কিছু ক্ষেত্রে, আপনি নিজেকে বোঝাতে পারেন যে জীবিত জিনিস(বা পৌঁছনোযোগ্য, যা জীবিতদের সম্পর্কে যুক্তিযুক্ত সুপারসিটার) কখনও যুক্তিসঙ্গত সীমা অতিক্রম করে না (এবং তারপরে আপনি জিসির উপর নির্ভর করেন, তবে কীভাবে এবং কখন আবর্জনা সংগ্রহ ঘটে তা আপনার যত্ন নেই)। স্থান জটিলতা সম্পর্কে পড়ুন ।

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

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

যদি জেভিএম স্পেসিফিকেশনটি প্রতিটি বস্তুকে যত তাড়াতাড়ি সম্ভব মুছে ফেলা দরকার হয় (বা কেবল অবজেক্ট মোছার ক্ষেত্রে আরও বাধা আরোপ করা হয়), দক্ষ জেনারেল জিসি কৌশলগুলি নিষিদ্ধ করা হবে, এবং জাভা এবং জেভিএম এর ডিজাইনাররা এড়ানোতে বুদ্ধিমান ছিলেন।

বিটিডাব্লু, এটি সম্ভব হতে পারে যে একটি নিখুঁত জেভিএম যা কখনই বস্তুগুলি মুছে না এবং মেমরি ছেড়ে দেয় না এমন চশমা অনুসারে চলতে পারে (চিঠিটি নয়, স্পিরিট নয়) এবং অনুশীলনে হ্যালো ওয়ার্ল্ড জিনিস চালাতে সক্ষম হবে (লক্ষ্য করুন যে বেশিরভাগ) ক্ষুদ্র ও স্বল্পস্থায়ী জাভা প্রোগ্রামগুলি সম্ভবত কয়েক গিগাবাইট মেমরির বেশি বরাদ্দ করে না)। অবশ্যই এ জাতীয় জেভিএম উল্লেখ করার মতো নয় এবং এটি কেবল একটি খেলনা জিনিস (যেমন সি এর জন্য এই বাস্তবায়নটি malloc)। আরও জন্য অ্যাপসিলন নোপ জিসি দেখুন। বাস্তব-জীবন জেভিএমগুলি সফটওয়্যারগুলির খুব জটিল টুকরো এবং বিভিন্ন আবর্জনা সংগ্রহের কৌশলগুলি মিশ্রিত করে।

এছাড়াও, জাভা জেভিএমের মতো নয় এবং আপনার জাভা প্রয়োগগুলি জেভিএম ছাড়াই চলমান রয়েছে (যেমন, আগামি সময়ের জাভা সংকলক, অ্যান্ড্রয়েড রানটাইম )। ইন কিছু ক্ষেত্রে (বেশিরভাগই একাডেমিক বেশী), আপনি কল্পনা করে একটি জাভা প্রোগ্রাম বরাদ্দ বা রানটাইম (যেমন এ মুছতে না, কারণ (তাই "সংকলন-টাইম আবর্জনা সংগ্রহ" কৌশল বলা হয়) পারে সর্বোচ্চকরন কম্পাইলার যথেষ্ট চালাক একমাত্র ব্যবহার করা হয়েছে কল স্ট্যাক এবং স্বয়ংক্রিয় ভেরিয়েবল )।

জাভা অবজেক্টগুলি আর উল্লেখ না করে কেন মুছে ফেলা হয় না?

কারণ জাভা এবং জেভিএম চশমাগুলির প্রয়োজন নেই।


আরও (এবং জেভিএম স্পেক ) জন্য জিসি হ্যান্ডবুকটি পড়ুন । লক্ষ্য করুন যে কোনও বস্তুর জন্য জীবিত (বা ভবিষ্যতের গণনার পক্ষে কার্যকর) পুরোপুরি প্রোগ্রাম (অ-মডুলার) সম্পত্তি।

উদ্দেশ্য সি একটি উপযোগী রেফারেন্স কাউন্টিং পদ্ধতির মেমরি ব্যবস্থাপনা । এবং এরও অসুবিধা রয়েছে (উদাহরণস্বরূপ অবজেক্টিভ সি প্রোগ্রামারকে দুর্বল রেফারেন্সগুলি ব্যাখ্যা করে বিজ্ঞপ্তিযুক্ত রেফারেন্সগুলি যত্নবান করতে হবে , তবে একটি জেভিএম জাভা প্রোগ্রামারারের দৃষ্টি আকর্ষণ না করে বৃত্তাকার উল্লেখগুলি কার্যত দক্ষতার সাথে পরিচালনা করে)।

নেই No Silver Bullet এ প্রোগ্রামিং এবং প্রোগ্রামিং ভাষা নকশা (সচেতন হতে স্থগিত সমস্যা ; একটি দরকারী জীবন্ত বস্তুর হচ্ছে undecidable সাধারণভাবে)।

আপনি এস আই সি পি , প্রোগ্রামিং ল্যাঙ্গুয়েজ প্রাগম্যাটিক্স , ড্রাগন বুক , ছোট টুকরো এবং অপারেটিং সিস্টেমে লিসপ : তিনটি সহজ টুকরো পড়তে পারেন । এগুলি জাভা সম্পর্কে নয়, তবে তারা আপনার মন খুলে দেবে এবং জেভিএমকে কী করা উচিত এবং এটি কীভাবে আপনার কম্পিউটারে ব্যবহারিকভাবে (অন্যান্য টুকরা সহ) কাজ করতে পারে তা বুঝতে সহায়তা করা উচিত। আপনি বিদ্যমান ওপেন সোর্স জেভিএম বাস্তবায়নের জটিল উত্স কোড অধ্যয়ন করতে অনেক মাস (বা বেশ কয়েক বছর) ব্যয় করতে পারেন (যেমন ওপেনজেডিকে , যার কয়েক মিলিয়ন উত্স কোড লাইন রয়েছে)।


20
"এটি সম্ভব হতে পারে যে একটি নিষ্পাপ জেভিএম যা কখনই বস্তুগুলি মুছে না এবং মেমরি প্রকাশ করে না এটি চশমার সাথে সামঞ্জস্যপূর্ণ হতে পারে" এটি অবশ্যই অনুমান অনুসারে কাজ করে! জাভা 11 আসলে খুব স্বল্প-কালীন প্রোগ্রামগুলির মধ্যে একটি অপরিহার্য আবর্জনা সংগ্রহকারী যুক্ত করছে।
মাইকেল 11

6
"কোনও বিষয় মুছে ফেলা হলে আপনার যত্ন নেওয়া উচিত নয়" অসম্মতি। একটির জন্য, আপনার জানা উচিত যে আরআইআইআই এখন আর একটি সম্ভাব্য প্যাটার্ন নয় এবং আপনি finalizeকোনও রিসোর্স ম্যানেজমেন্টের জন্য (ফাইলহ্যান্ডলস, ডিবি সংযোগগুলি, জিপিইউ রিসোর্স ইত্যাদির) উপর নির্ভর করতে পারবেন না ।
আলেকজান্ডার

4
@ মিশেল এটি ব্যবহৃত মেমরি সিলিং সহ ব্যাচ প্রসেসিংয়ের জন্য সঠিক ধারণা দেয়। ওএস কেবল বলতে পারে "এই প্রোগ্রামটি দ্বারা ব্যবহৃত সমস্ত স্মৃতি এখন চলে গেছে!" সর্বোপরি, যা বরং দ্রুত। প্রকৃতপক্ষে সি তে অনেকগুলি প্রোগ্রাম সেভাবে লেখা হয়েছিল, বিশেষত প্রথমদিকে ইউনিক্স বিশ্বে। পাস্কালটির কাছে অত্যন্ত ভয়ঙ্কর "স্ট্যাক / হিপ পয়েন্টারটিকে একটি প্রাক-সংরক্ষিত চেকপয়েন্টে পুনরায় সেট করা" ছিল যা আপনাকে অনেক একই জিনিস করতে দেয়, যদিও এটি বেশ অনিরাপদ - চিহ্ন, সাব-টাস্ক শুরু করুন, পুনরায় সেট করুন।
লুয়ান

6
@ অ্যালেক্সান্ডার সাধারণভাবে সি ++ এর বাইরে (এবং কয়েকটি ভাষা যা ইচ্ছাকৃতভাবে এটি থেকে উদ্ভূত হয়েছিল) ধরে নেওয়া, RAII কেবলমাত্র চূড়ান্তকরণের ভিত্তিতে কাজ করবে তা একটি বিরোধী নিদর্শন, যার বিরুদ্ধে সতর্ক করা উচিত এবং একটি সুস্পষ্ট সংস্থান নিয়ন্ত্রণ ব্লক দ্বারা প্রতিস্থাপন করা উচিত। জিসির পুরো বিষয়টি হ'ল আজীবন এবং সংস্থান হ'ল, সর্বোপরি।
লুশেনকো

3
@ লুশেনকো আমি দৃ strongly়ভাবে একমত নই যে "আজীবন ও সংস্থান হ'ল" হ'ল জিসির "সম্পূর্ণ বিষয়"। জিসির মূল পয়েন্টটি আপনি যে নেতিবাচক মূল্য দিয়েছেন তা হ'ল: সহজ, নিরাপদ মেমরি পরিচালনা। "ধরে নিই যে RAII কেবলমাত্র চূড়ান্তকরণের ভিত্তিতে কাজ করবে এটি কি একটি বিরোধী-প্যাটার্ন" জাভাতে? সম্ভবত। তবে সিপিথনে নয়, মরিচা, সুইফট বা অবজেক্টিভ সি "" বিরুদ্ধে স্পষ্টভাবে সতর্ক করা হয়েছে এবং একটি স্পষ্ট সম্পদ নিয়ন্ত্রণ ব্লক দ্বারা প্রতিস্থাপন করা হয়েছে "না, এগুলি আরও কঠোরভাবে সীমাবদ্ধ। RAII- র মাধ্যমে কোনও রিসোর্স পরিচালনা করে এমন একটি বস্তু আপনাকে চারপাশের জীবন কাটাতে একটি হ্যান্ডেল দেয়। রিসোর্স-সহ-ব্লকটি একটি একক সুযোগে সীমাবদ্ধ।
আলেকজান্ডার

23

অবজেক্টিভ-সি পরিভাষা ব্যবহার করতে, সমস্ত জাভা উল্লেখগুলি সহজাতভাবে "শক্তিশালী"।

এটি সঠিক নয় - জাভাতে দুর্বল ও নরম উভয় রেফারেন্স রয়েছে, যদিও এগুলি ভাষার কীওয়ার্ড হিসাবে না হয়ে বস্তুর স্তরে প্রয়োগ করা হয়।

অবজেক্টিভ-সি-তে, যদি কোনও বস্তুর আর কোনও শক্ত রেফারেন্স না থাকে তবে অবজেক্টটি সাথে সাথে মুছে ফেলা হবে deleted

এটি প্রয়োজনীয়ভাবেও সঠিক নয় - উদ্দেশ্য সি এর কয়েকটি সংস্করণ প্রকৃতপক্ষে প্রজন্মের আবর্জনা সংগ্রহকারী ব্যবহার করেছে। অন্যান্য সংস্করণে কোনও আবর্জনা সংগ্রহ ছিল না।

এটি সত্য যে অবজেক্টিভ সি এর নতুন সংস্করণগুলি ট্রেস ভিত্তিক জিসির পরিবর্তে স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (এআরসি) ব্যবহার করে এবং যখন (রেফারেন্স) ফলাফলটি যখন "রেফারেন্ট" হয়ে যায় তখন রেফারেন্স গণনাটি শূন্যকে আঘাত করে। তবে নোট করুন যে একটি জেভিএম বাস্তবায়নও মেনে চলতে পারে এবং ঠিক এইভাবে কাজ করতে পারে (হেক, এটি মেনে চলতে পারে এবং কোনও জিসি নেই))

তাহলে বেশিরভাগ জেভিএম বাস্তবায়ন কেন এটি করে না এবং পরিবর্তে ট্রেস ভিত্তিক জিসি অ্যালগোরিদম ব্যবহার করে?

সহজ কথায় বলতে গেলে, এআরসি যতটা ইউটোপিয়ান হিসাবে দেখা যাচ্ছে তা প্রথম নয়:

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

এআরসি এর অবশ্যই সুবিধাগুলি রয়েছে - এটি বাস্তবায়ন এবং সংগ্রহ করা সহজ এবং নির্বিচারবাদী। তবে উপরের অসুবিধাগুলি, অন্যদের মধ্যে, বেশিরভাগ জেভিএম বাস্তবায়নের ফলে একটি জেনারাল, ট্রেস ভিত্তিক জিসি ব্যবহার করা হবে।


1
মজার বিষয়টি হ'ল অ্যাপল যথাযথভাবে এআরসিটিতে সরিয়ে নিয়েছিল কারণ তারা দেখেছিল যে বাস্তবে এটি অন্যান্য জিসিগুলিকে (বিশেষত প্রজন্মের ক্ষেত্রে) প্রচুর পরিমাণে ছাড়িয়ে যায়। সত্যি কথা বলতে, এটি বেশিরভাগ ক্ষেত্রে মেমরি-সীমাবদ্ধ প্ল্যাটফর্মগুলিতে (আইফোন) সত্য। তবে আমি আপনার বক্তব্যকে পাল্টে বললাম যে "এআরসি যতটা প্রথম দেখা যায় ততটা ইউটোপিয়ান নয়" জেনারেল (এবং অন্যান্য অ-সংজ্ঞাবিরোধী) জিসিরা যতটা প্রথম দেখায় তেমন ইউটোপিয়ান নয়: নির্বিচারবাদী ধ্বংস সম্ভবত সম্ভবত একটি আরও ভাল বিকল্প বেশিরভাগ পরিস্থিতিতে।
কনরাড রুডল্ফ

3
@ কনরাড রুডল্ফ যদিও আমি বরং বিচারবিরোধী ধ্বংসেরও ভক্ত, তবে আমি মনে করি না "বিশাল সংখ্যক পরিস্থিতিতে সবচেয়ে ভাল বিকল্প" রয়েছে। গড় থ্রুপুটের তুলনায় বিলম্ব বা মেমরি যখন গুরুত্বপূর্ণ হয় তখন এটি অবশ্যই আরও ভাল বিকল্প এবং বিশেষত যখন যুক্তি যুক্তিযুক্তভাবে সহজ হয়। তবে এটি এমন নয় যে অনেকগুলি জটিল অ্যাপ্লিকেশন নেই যার জন্য প্রচুর চক্রীয় রেফারেন্স ইত্যাদির প্রয়োজন হয় এবং দ্রুত গড় ক্রিয়াকলাপের প্রয়োজন হয় তবে প্রকৃত পক্ষে বিলম্বিতা সম্পর্কে যত্ন নেবেন না এবং প্রচুর স্মৃতি উপলব্ধ রয়েছে। এগুলির জন্য, এটিআরসি যদি ভাল ধারণা হয় তবে তা সন্দেহজনক।
বাম দিকের বাইরে 9:58

1
@leftaroundabout "বেশিরভাগ পরিস্থিতি" তে, থ্রুপুট বা মেমরির চাপ দুটোই বাধা নয় তাই এটি কোনওভাবেই আপত্তিজনক নয়। আপনার উদাহরণটি একটি নির্দিষ্ট দৃশ্য। মঞ্জুর, এটি অত্যন্ত অস্বাভাবিক নয় তবে আমি যতদূর দাবি করে না যে এটি অন্য পরিস্থিতিতে যেখানে এআরসি আরও ভাল উপযুক্ত তার চেয়ে সাধারণ। তদুপরি, এআরসি চক্রগুলি ঠিকঠাক মোকাবেলা করতে পারে । এটির জন্য কেবল প্রোগ্রামার দ্বারা কিছু সাধারণ, ম্যানুয়াল হস্তক্ষেপ প্রয়োজন। এটি এটিকে কম আদর্শ করে তোলে তবে খুব কমই একটি চুক্তি ভঙ্গকারী। আমি দাবি করি যে আপনার ভান করার চেয়ে ডিস্ট্রিমেন্টিক চূড়ান্তকরণ অনেক বেশি গুরুত্বপূর্ণ বৈশিষ্ট্যযুক্ত।
কনরাড রুডল্ফ

3
@ কনরাড রুডল্ফ যদি প্রোগ্রামার কর্তৃক এআরসি-র কিছু সাধারণ ম্যানুয়াল হস্তক্ষেপের প্রয়োজন হয়, তবে এটি চক্রগুলি মোকাবেলা করে না। আপনি যদি দ্বিগুণ-সংযুক্ত তালিকাগুলি ভারীভাবে ব্যবহার করা শুরু করেন, তবে এআরসি ম্যানুয়াল মেমরির বরাদ্দে রূপান্তরিত হয়। আপনার যদি বড় স্বেচ্ছাচারী গ্রাফ থাকে, এআরসি আপনাকে কোনও আবর্জনা সংগ্রহকারী লিখতে বাধ্য করে। জিসির যুক্তিটি হ'ল যে যে সংস্থানগুলির ধ্বংসের প্রয়োজন তারা মেমোরি সাবসিস্টেমের কাজ নয় এবং সেগুলির তুলনামূলকভাবে কয়েকটি সনাক্ত করতে প্রোগ্রামার দ্বারা কিছু সাধারণ ম্যানুয়াল হস্তক্ষেপের মাধ্যমে সেগুলি নির্জ্ঞাতভাবে চূড়ান্ত করা উচিত।
পেশাদাররা

2
@ কনরাড রুডল্ফ এআরসি এবং চক্রগুলি ম্যানুয়ালি পরিচালিত না করা হলে মেমরির ফাঁসকে মৌলিকভাবে বাড়ে। জটিল পর্যাপ্ত সিস্টেমে বড় ফুটোগুলি ঘটতে পারে যদি উদাহরণস্বরূপ কোনও মানচিত্রে সঞ্চিত কিছু বস্তু সেই মানচিত্রের একটি রেফারেন্স সঞ্চয় করে, এমন একটি পরিবর্তন যা কোনও প্রোগ্রামার দ্বারা তৈরি করা যেতে পারে যে কোডটির বিভাগগুলির দায়িত্বে নেই এবং সেই মানচিত্রটি ধ্বংস করছেন। বৃহত নির্বিচার গ্রাফের অর্থ এই নয় যে অভ্যন্তরীণ পয়েন্টারগুলি শক্তিশালী নয়, এটি লিঙ্কযুক্ত আইটেমগুলি অদৃশ্য হওয়ার জন্য ঠিক আছে। ম্যানুয়ালি ফাইলগুলি বন্ধ করার চেয়ে কিছু মেমরি ফাঁস নিয়ে কাজ করা কোনও সমস্যা কম কিনা, আমি বলব না, তবে এটি আসল।
পেশাদাররা

5

জাভাটি কখন অবজেক্টটি সংগ্রহ করা হবে তা সুনির্দিষ্টভাবে উল্লেখ করে না কারণ এটি কীভাবে আবর্জনা সংগ্রহ পরিচালনা করবেন তা চয়ন করার স্বাধীনতা দেয়।

অনেকগুলি বিভিন্ন আবর্জনা সংগ্রহের প্রক্রিয়া রয়েছে, তবে যেগুলি গ্যারান্টি দেয় যে আপনি অবিলম্বে কোনও জিনিস সংগ্রহ করতে পারবেন তা প্রায় সম্পূর্ণরূপে রেফারেন্স গণনার উপর ভিত্তি করে (এই প্রবণতাটি ভেঙে দেয় এমন কোনও অ্যালগরিদম সম্পর্কে আমি অবগত নই)। রেফারেন্স গণনা একটি শক্তিশালী সরঞ্জাম, তবে এটি রেফারেন্স গণনা রক্ষণাবেক্ষণের জন্য ব্যয় করে আসে। সিঙ্গলথ্রেডেড কোডে, এটি ইনক্রিমেন্ট এবং হ্রাস ছাড়া আর কিছুই নয়, সুতরাং একটি পয়েন্টার নির্ধারণ করা রেফারেন্স গণনা কোডের তুলনায় 3x এর অর্ডারে ব্যয় করতে পারে, এটি রেফারেন্স গণনা কোডের তুলনায় (যদি সংকলক মেশিনে সবকিছু বেক করতে পারে তবে) কোড)।

মাল্টিথ্রেডেড কোডে, ব্যয় বেশি হয়। এটি হয় পারমাণবিক বৃদ্ধি / হ্রাস বা লকগুলির জন্য ডাকে, উভয়ই ব্যয়বহুল হতে পারে। একটি আধুনিক প্রসেসরের উপর, একটি পারমাণবিক অপারেশন সাধারণ রেজিস্ট্রার অপারেশন (স্পষ্টতই প্রসেসরের থেকে প্রসেসরের পরিবর্তিত হয়) এর চেয়ে 20x দাম বেশি ব্যয়বহুল হতে পারে। এতে ব্যয় বাড়তে পারে।

সুতরাং এটির সাহায্যে আমরা বেশ কয়েকটি মডেলের তৈরি ট্রেড অফগুলি বিবেচনা করতে পারি।

  • উদ্দেশ্য-সি এআরসি - স্বয়ংক্রিয় রেফারেন্স গণনা উপর দৃষ্টি নিবদ্ধ করে। তাদের পদ্ধতির জন্য সমস্ত কিছুর জন্য রেফারেন্স গণনা ব্যবহার করা। কোনও চক্র সনাক্তকরণ নেই (যা আমি জানি), সুতরাং প্রোগ্রামাররা চক্রটি ঘটতে বাধা দেবে বলে আশা করা হয়, যার জন্য বিকাশের সময় ব্যয় হয়। তাদের তত্ত্বটি হ'ল পয়েন্টারগুলি প্রায়শই সমস্ত বরাদ্দ করা হয় না এবং তাদের সংকলক এমন পরিস্থিতি সনাক্ত করতে পারে যেখানে বাড়ানো / হ্রাস হওয়া রেফারেন্স গণনাগুলির ফলে কোনও বস্তু মারা যায় না এবং সেই বৃদ্ধিগুলি / হ্রাসকে পুরোপুরি আলাদা করে দেয়। সুতরাং তারা রেফারেন্স গণনা ব্যয় হ্রাস।

  • সিপিথন একটি হাইব্রিড প্রক্রিয়া ব্যবহার করে। তারা রেফারেন্স গণনাগুলি ব্যবহার করে তবে তাদের একটি আবর্জনা সংগ্রহকারীও রয়েছে যা চক্রগুলি সনাক্ত করে এবং তাদের ছেড়ে দেয়। উভয় পদ্ধতির ব্যয়ে এটি উভয় বিশ্বের সুবিধা দেয়। সিপথন উভয়ই রেফারেন্স গণনা এবং বজায় রাখতে হবেচক্র সনাক্ত করার জন্য বইটি রাখে। সিপিথন এটি দুটি উপায়ে নিয়ে চলে যায়। মুষ্টিটি হ'ল সিপিথন সত্যই পুরোপুরি মাল্টিথ্রেড হয় না। এটিতে জিআইএল নামে পরিচিত একটি লক রয়েছে যা মাল্টিথ্রেডিংকে সীমাবদ্ধ করে। এর অর্থ সিপিথন পারমাণবিকের চেয়ে স্বাভাবিক বৃদ্ধি / হ্রাস ব্যবহার করতে পারে, যা অনেক দ্রুত faster সিপিথনকেও ব্যাখ্যা করা হয়, যার অর্থ একটি ভেরিয়েবলের অ্যাসাইনমেন্টের মতো ক্রিয়াকলাপগুলি ইতিমধ্যে কেবল 1 এর পরিবর্তে মুষ্টিমেয় কিছু নির্দেশনা গ্রহণ করে, সি কোডে দ্রুত সম্পন্ন হওয়া ইনক্রিমেন্ট / হ্রাসের অতিরিক্ত ব্যয় কোনও সমস্যার কম হয় কারণ আমরা ' ইতিমধ্যে এই ব্যয়টি প্রদান করেছি।

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

সুতরাং আমরা দেখতে পাচ্ছি যে এই তিনটির প্রত্যেককেই ট্রেডঅফস করতে হয়েছিল। কোন ট্রেডঅফ সেরা তা কীভাবে ভাষা ব্যবহারের উদ্দেশ্যে তৈরি করা হয়েছে তার প্রকৃতির উপর নির্ভর করে।


4

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

আবর্জনা সংগ্রহের উদ্দেশ্য এমন বস্তুগুলিকে ধ্বংস করা নয় যার দিকে কোনও উল্লেখ নেই, বরং তিনটি জিনিস সম্পাদন করা:

  1. অবৈধ দুর্বল রেফারেন্সগুলি যেগুলি অবজেক্টগুলিকে সনাক্ত করে যার সাথে কোনও দৃ strongly়রূপে পৌঁছনীয় উল্লেখ নেই।

  2. চূড়ান্তকরণকারীগুলির সাথে সিস্টেমের অবজেক্টগুলির তালিকা অনুসন্ধান করুন তাদের মধ্যে যে কোনওটির সাথেই কোনও দৃ strongly়রূপে পৌঁছানোর যোগ্য উল্লেখ নেই কিনা তা দেখুন।

  3. সঞ্চয়স্থানের অঞ্চলগুলি চিহ্নিত করুন এবং একীভূত করুন যা কোনও বস্তু দ্বারা ব্যবহৃত হচ্ছে না।

মনে রাখবেন যে জিসির প্রাথমিক লক্ষ্যটি # 3, এবং এটি করার আগে যত বেশি অপেক্ষা করা হয়, একীকরণের ক্ষেত্রে আরও বেশি সম্ভাবনা থাকার সম্ভাবনা রয়েছে। যে কোনও ক্ষেত্রে স্টোরেজটির জন্য তাত্ক্ষণিক ব্যবহার হবে সে ক্ষেত্রে এটি # 3 করা বুদ্ধিমান, তবে অন্যথায় এটি স্থগিত করার জন্য আরও বেশি অর্থবোধ করে।


5
আসলে, সিসির একটিমাত্র লক্ষ্য রয়েছে: অসীম স্মৃতি সিমুলেট করা। আপনি লক্ষ্য হিসাবে নামকরণ করা সমস্ত কিছুই হয় বিমূর্তির অপূর্ণতা বা বাস্তবায়ন-বিশদ।
উত্সাহক

@ প্রতিলিপি: দুর্বল উল্লেখগুলি কার্যকর শব্দার্থবিজ্ঞানের প্রস্তাব দেয় যা জিসি সহায়তা ছাড়া অর্জন করা যায় না।
সুপারক্যাট

অবশ্যই, দুর্বল উল্লেখগুলি কার্যকর শব্দার্থবিজ্ঞান রয়েছে। তবে এই সিমেন্টিকগুলি কি সিমুলেশনটি আরও ভাল হলে দরকার হত?
উত্সাহক

@ উত্সাহক: হ্যাঁ। আপডেটগুলি কীভাবে গণনার সাথে ইন্টারেক্ট করবে তা সংজ্ঞায়িত করে এমন একটি সংগ্রহ বিবেচনা করুন। এই জাতীয় সংগ্রহের জন্য কোনও লাইভ গণনাকারীর দুর্বল উল্লেখ থাকতে হবে। সীমাহীন-মেমরি সিস্টেমে, যে সংগ্রহটি বারবার পুনরাবৃত্তি হয়েছিল তাতে তার আগ্রহী গণিতের তালিকা বেঁধে দেওয়া ছাড়া হবে। এই তালিকার জন্য প্রয়োজনীয় মেমরিটি কোনও সমস্যা হবে না তবে এটির মাধ্যমে পুনরাবৃত্তি করার জন্য প্রয়োজনীয় সময়টি সিস্টেমের কর্মক্ষমতা হ্রাস পাবে। জিসি যোগ করার অর্থ একটি ও (এন) এবং ও (এন ^ 2) অ্যালগরিদমের মধ্যে পার্থক্য হতে পারে।
সুপারক্যাট

2
আপনি তালিকাতে যুক্ত হওয়ার পরিবর্তে তালিকাভুক্তকারীদের ব্যবহার করার সময় তাদের নিজের অনুসন্ধান করার সুযোগ দেওয়ার পরিবর্তে কেন তালিকাভুক্তকারীদের অবহিত করতে চান? এবং মেমরির চাপের উপর নির্ভর করে সময়মতো প্রক্রিয়াজাত করা আবর্জনার উপর নির্ভর করে যে কোনও প্রোগ্রাম যেভাবেই চলতে পারে তবে তা পাপের অবস্থায় জীবনযাপন করছে।
উত্সাহক

4

আমাকে আপনার প্রশ্নের পুনরায় রেকর্ডিং এবং সাধারণীকরণের পরামর্শ দিন:

জাভা কেন তার জিসি প্রক্রিয়া সম্পর্কে দৃ strong় গ্যারান্টি দেয় না?

এটি মনে রেখে, এখানে উত্তরগুলির মাধ্যমে একটি দ্রুত স্ক্রোল নিন। এখন পর্যন্ত সাতটি রয়েছে (এটি গণনা করা হচ্ছে না), বেশ কয়েকটি মন্তব্য থ্রেড সহ।

এটাই আপনার উত্তর।

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

এমনকি সেই সিদ্ধান্তে একটি বাণিজ্যও রয়েছে, অবশ্যই: চুক্তিটি আলগা রেখে জাভা বেশিরভাগ * প্রোগ্রামারদের ডেস্ট্রাক্টরের উপর নির্ভর করার ক্ষমতা কেড়ে নেয়। এটি এমন একটি বিষয় যা বিশেষত সি ++ প্রোগ্রামাররা প্রায়শই মিস করে ([উদ্ধৃতি আবশ্যক];)), সুতরাং এটি কোনও তুচ্ছ বাণিজ্য নয়। আমি সেই নির্দিষ্ট মেটা-সিদ্ধান্ত নিয়ে আলোচনা দেখিনি, তবে সম্ভবত জাভা লোকেরা সিদ্ধান্ত নিয়েছে যে আরও কোনও জিসি বিকল্প থাকার সুবিধাটি প্রোগ্রামারদের জানাতে সক্ষম হওয়ার সুবিধাকে ছাড়িয়ে গেছে যখন কোন বস্তুটি ধ্বংস হয়ে যাবে।


* finalizeপদ্ধতি রয়েছে তবে বিভিন্ন কারণে যে এই উত্তরটির সুযোগ নেই, এটি নির্ভর এবং এটি নির্ভর করা ভাল ধারণা নয়।


3

বিকাশকারী দ্বারা লিখিত সুস্পষ্ট কোড ব্যতীত মেমরি পরিচালনা করার দুটি ভিন্ন কৌশল রয়েছে: আবর্জনা সংগ্রহ এবং রেফারেন্স গণনা।

বর্জ্য সংগ্রহের সুবিধা রয়েছে যে এটি "কাজ করে" যদি না বিকাশকারী বোকা কিছু না করে। রেফারেন্স গণনা সহ আপনার রেফারেন্স চক্র থাকতে পারে যার অর্থ এটি "কাজ করে" তবে বিকাশকারীকে কখনও কখনও চালাক হতে হয়। সুতরাং এটি আবর্জনা সংগ্রহের জন্য একটি প্লাস।

রেফারেন্স গণনা সহ, রেফারেন্স গণনা শূন্যে নেমে গেলে অবিলম্বে অবজেক্টটি চলে যায়। রেফারেন্স গণনা করার জন্য এটি একটি সুবিধা।

গতির দিক দিয়ে, আবর্জনা সংগ্রহের অনুরাগীদের বিশ্বাস করতে পারলে আবর্জনা সংগ্রহ দ্রুত হয় এবং আপনি যদি রেফারেন্স গণনার ভক্তদের বিশ্বাস করেন তবে রেফারেন্স গণনা দ্রুত হয়।

একই লক্ষ্য অর্জনের জন্য এটি দুটি মাত্র ভিন্ন পদ্ধতি, জাভা একটি পদ্ধতি বাছাই করেছে, অবজেক্টিভ-সি অন্যটি বাছাই করেছে (এবং এটি একটি বেদনা-অন-গাধা থেকে এমন কিছুতে পরিবর্তন করতে প্রচুর সংকলক সমর্থন যুক্ত করেছে যা এটি ডেভেলপারদের পক্ষে খুব কম কাজ)।

আবর্জনা সংগ্রহ থেকে রেফারেন্স গণনাতে জাভা পরিবর্তন করা একটি বড় উদ্যোগ হবে, কারণ প্রচুর কোড পরিবর্তন করা দরকার।

তত্ত্ব অনুসারে, জাভা আবর্জনা সংগ্রহ এবং রেফারেন্স গণনার মিশ্রণটি প্রয়োগ করতে পারত: যদি রেফারেন্স গণনা 0 হয় তবে অবজেক্টটি অ্যাক্সেসযোগ্য নয়, তবে অন্যভাবে রাউন্ডে অগত্যা নয়। সুতরাং আপনি পারে রেফারেন্স গন্য বস্তু রাখা এবং মুছে যখন তাদের রেফারেন্স গণনা শূন্য হয় (এবং তারপর সময়ে সময়ে গার্বেজ কালেকশন চালানো অনধিগম্য রেফারেন্স চক্র মধ্যে বস্তু ধরা)। আমি মনে করি যে সমস্ত মানুষ আবর্জনা সংগ্রহের ক্ষেত্রে রেফারেন্স গণনা যুক্ত করা একটি খারাপ ধারণা, এবং যে সমস্ত লোকেরা মনে করেন যে রেফারেন্স গণনাতে আবর্জনা সংগ্রহ যুক্ত করা একটি খারাপ ধারণা, এমন লোকেরা মনে করে বিশ্ব 50/50 বিভক্ত হয়ে গেছে। সুতরাং এটি ঘটতে যাচ্ছে না।

সুতরাং জাভা অবজেক্টগুলিকে অবিলম্বে মুছে ফেলতে পারে যদি তাদের রেফারেন্স গণনাটি শূন্য হয় এবং পরে অ্যাক্সেসযোগ্য চক্রের মধ্যে অবজেক্টগুলি মুছতে পারে। তবে এটি একটি নকশার সিদ্ধান্ত, এবং জাভা এর বিরুদ্ধে সিদ্ধান্ত নিয়েছে।


রেফারেন্স-কাউন্টিং সহ, চূড়ান্ত করা তুচ্ছ, কারণ প্রোগ্রামার চক্রের যত্ন নিয়েছিল। জিসি সহ, চক্রগুলি তুচ্ছ, তবে প্রোগ্রামারকে চূড়ান্তকরণের সাথে যত্নবান হতে হবে।
উত্সাহক

@Deduplicator জাভা, এটা সম্ভব বস্তু শক্তিশালী রেফারেন্স চূড়ান্ত করা হচ্ছে তৈরি করতে ... উদ্দেশ্য সি এবং সুইফট সালে একবার রেফারেন্স গণনা শূন্য হয়, বস্তুর এর হবে অদৃশ্য (যতক্ষণ না আপনি dealloc / শ্বরবাদী মধ্যে একটি অসীম লুপ করা)।
gnasher729

সবেমাত্র বোকা বানান পরীক্ষককে ডিনিটের সাথে ডিনিটের বদলে প্রতিস্থাপন করা হয়েছে ...
gnasher729

1
বেশিরভাগ প্রোগ্রামাররা স্বয়ংক্রিয় বানান সংশোধনকে ঘৃণার একটি কারণ রয়েছে ... ;-)
উত্সাহীকারী

হ্যাঁ ... আমি মনে করি যে জঞ্জাল সংগ্রহের ক্ষেত্রে রেফারেন্স গণনা যুক্ত করা একটি খারাপ ধারণা, এবং যে লোকেরা মনে করেন যে আবর্জনা সংগ্রহকে রেফারেন্স গণনাতে যুক্ত করা একটি খারাপ ধারণা, এবং এমন লোকেরা আবর্জনা সংগ্রহ না আসা পর্যন্ত দিন গণনা করুন কারণ সেই
টনটি

1

অন্য কোনও কার্যকারিতা যুক্তি এবং আলোচনার অসুবিধা সম্পর্কে আলোচনার সমস্ত যখন আর কোনও অবজেক্টের উল্লেখ থাকে না তখন সঠিক হয় যদিও আমি মনে করি যে অন্য একটি ধারণাও কমপক্ষে একটি জেভিএম (আজুল) আছে যা এই জাতীয় কিছু বিবেচনা করে ers এতে এটি সমান্তরাল জিসি প্রয়োগ করে যা মূলত একটি ভিএম থ্রেড থাকে যা তাদের কথা মুছে ফেলার চেষ্টা করার জন্য নিয়মিত রেফারেন্সগুলি পরীক্ষা করে যা আপনি যে বিষয়ে কথা বলছেন তা থেকে সম্পূর্ণরূপে ডিস-সাদৃশ্যপূর্ণ আচরণ করবে না। মূলত এটি স্তূপের চারপাশে অবিচ্ছিন্নভাবে নজর রাখবে এবং উল্লেখ করা হচ্ছে না এমন কোনও মেমরি পুনরায় দাবি করার চেষ্টা করবে। এটির ফলে খুব সামান্য পারফরম্যান্স ব্যয় হয় তবে এটি শূন্য বা খুব কম জিসির সময় নিয়ে যায় times (যদি না ক্রমাগত প্রসারিত হিপ আকার সিস্টেম র‌্যামকে অতিক্রম করে এবং তারপরে আজুল বিভ্রান্ত হয় এবং তারপরে সেখানে ড্রাগন থাকে)

টিএলডিআর জেভিএম-এর জন্য কিণ্ডা জাতীয় কিছু বিদ্যমান রয়েছে এটি কেবল একটি বিশেষ জেভিএম এবং এটি অন্যান্য ইঞ্জিনিয়ারিং সমঝোতার মতো ঘাটতি রয়েছে।

দাবি অস্বীকার: আজুলের সাথে আমার কোনও সম্পর্ক নেই আমরা এটি কেবল আগের কাজটিতে ব্যবহার করেছি।


1

টেকসই থ্রুটপুট সর্বাধিকীকরণ বা জিসি ল্যাটেন্সি হ্রাস করা গতিশীল উত্তেজনার মধ্যে রয়েছে, এটি সম্ভবত সবচেয়ে সাধারণ কারণ হ'ল জিসি তাত্ক্ষণিকভাবে ঘটে না। কিছু সিস্টেমের ক্ষেত্রে, 911 জরুরী অ্যাপ্লিকেশনগুলির মতো, একটি নির্দিষ্ট বিলম্বের দোরগোড়াকে পূরণ না করা সাইটটিকে ব্যর্থ ওভার প্রক্রিয়াগুলি শুরু করতে পারে। অন্যদের মধ্যে, কোনও ব্যাংকিং এবং / বা সালিশ সাইটের মতো, থ্রুটপুট সর্বাধিক করা আরও বেশি গুরুত্বপূর্ণ।


0

দ্রুততা

এই সমস্ত কেন চলছে তা শেষ পর্যন্ত গতির কারণে। প্রসেসরগুলি যদি সীমিতভাবে দ্রুত ছিল, বা (ব্যবহারিক হওয়ার জন্য) এর কাছে, যেমন প্রতি সেকেন্ডে 1,000,000,000,000,000,000,000,000,000,000,000 অপারেশনগুলি থাকে তবে আপনার প্রতিটি অপারেটরের মধ্যে অত্যন্ত দীর্ঘ এবং জটিল জিনিসগুলি ঘটতে পারে যেমন ডি-রেফারেন্সযুক্ত অবজেক্টগুলি মুছে ফেলা হয়েছে তা নিশ্চিত করা। যেহেতু প্রতি সেকেন্ডের অপারেশনগুলি বর্তমানে সত্য নয় এবং অন্যান্য উত্তরগুলির বেশিরভাগই ব্যাখ্যা করে যে এটি প্রকৃতপক্ষে জটিল এবং এটি নির্ধারণের জন্য নিবিড় সংস্থান, তাই আবর্জনা সংগ্রহের উপস্থিতি রয়েছে যাতে প্রোগ্রামগুলি আসলে তারা কী অর্জন করতে চাইছে তার দিকে মনোনিবেশ করতে পারে দ্রুত পদ্ধতি।


ঠিক আছে, আমি নিশ্চিত যে এর চেয়ে অতিরিক্ত চক্র ব্যবহার করার জন্য আমরা আরও আকর্ষণীয় উপায়গুলি খুঁজে পাব।
হস্তান্তরকারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.