জাভাতে মেমরি মুক্ত করার কোনও উপায় কি সি এর free()
ফাংশনের অনুরূপ ? অথবা কী অবজেক্টটি নালায় সেট করছে এবং একমাত্র বিকল্পটি জিসির উপর নির্ভর করছে?
জাভাতে মেমরি মুক্ত করার কোনও উপায় কি সি এর free()
ফাংশনের অনুরূপ ? অথবা কী অবজেক্টটি নালায় সেট করছে এবং একমাত্র বিকল্পটি জিসির উপর নির্ভর করছে?
উত্তর:
জাভা পরিচালিত মেমোরি ব্যবহার করে, সুতরাং মেমরিটি বরাদ্দ করার একমাত্র উপায় হ'ল new
অপারেটরটি ব্যবহার করে এবং মেমরিটিকে হ্রাস করার একমাত্র উপায় হ'ল আবর্জনা সংগ্রাহকের উপর নির্ভর করে।
এই মেমরি পরিচালনা হোয়াইটপ্যাপার (পিডিএফ) কী চলছে তা বোঝাতে সহায়তা করতে পারে।
System.gc()
আবর্জনা সংগ্রহকারীকে অবিলম্বে চালানোর পরামর্শ দেওয়ার জন্যও আপনি কল করতে পারেন । তবে জাভা রানটাইম চূড়ান্ত সিদ্ধান্ত নেয়, আপনার কোড নয়।
মতে জাভা ডকুমেন্টেশন ,
জিসি পদ্ধতিতে কল করা পরামর্শ দেয় যে জাভা ভার্চুয়াল মেশিনটি বর্তমানে পুনঃব্যবহারের জন্য উপলব্ধ মেমোরিটি উপলব্ধ করার জন্য অব্যবহৃত অবজেক্টগুলি পুনর্ব্যবহার করার দিকে প্রচেষ্টা ব্যয় করে। যখন পদ্ধতি কল থেকে নিয়ন্ত্রণ ফিরে আসে, জাভা ভার্চুয়াল মেশিন সমস্ত বাতিল হওয়া বস্তু থেকে স্থান পুনরায় দাবি করার জন্য সেরা চেষ্টা করেছে।
System.gc()
পুরোপুরি উপেক্ষা করে।
কেউ স্পষ্টভাবে অবজেক্ট রেফারেন্স সেট করে উল্লেখ করেছেন বলে মনে হয় না null
, যা আপনি বিবেচনা করতে চাইতে পারেন মেমরিটিকে "মুক্ত" করার একটি বৈধ কৌশল।
উদাহরণস্বরূপ, বলুন যে আপনি কোনও List<String>
পদ্ধতির শুরুতে একটি ঘোষণা করেছিলেন যা আকারে বৃদ্ধি পেয়েছিল এটি খুব বড় হবে, তবে কেবল পদ্ধতিটির অর্ধ-পথ অবধি প্রয়োজনীয় ছিল। null
পদ্ধতিটি সম্পূর্ণ হওয়ার আগে আবর্জনা সংগ্রহকারীকে এই বিষয়টিকে পুনরায় দাবি করার অনুমতি দেওয়ার জন্য আপনি এই মুহুর্তে তালিকাটি রেফারেন্স সেট করতে পারেন (এবং যাইহোক রেফারেন্সটি সুযোগের বাইরে চলে যায়)।
নোট করুন যে আমি বাস্তবে এই কৌশলটি খুব কমই ব্যবহার করি তবে খুব বড় ডেটা স্ট্রাকচারের সাথে কাজ করার সময় এটি বিবেচনার জন্য উপযুক্ত।
System.gc();
চালায় আবর্জনা সংগ্রহকারী।
জিসি পদ্ধতিতে কল করা পরামর্শ দেয় যে জাভা ভার্চুয়াল মেশিনটি বর্তমানে পুনঃব্যবহারের জন্য উপলব্ধ মেমোরিটি উপলব্ধ করার জন্য অব্যবহৃত অবজেক্টগুলি পুনর্ব্যবহার করার দিকে প্রচেষ্টা ব্যয় করে। যখন পদ্ধতি কল থেকে নিয়ন্ত্রণ ফিরে আসে, জাভা ভার্চুয়াল মেশিন সমস্ত বাতিল হওয়া বস্তু থেকে স্থান পুনরায় দাবি করার জন্য সেরা চেষ্টা করেছে।
প্রস্তাবিত নয়।
সম্পাদনা: আমি 2009 সালে মূল প্রতিক্রিয়াটি লিখেছিলাম It's এটি এখন 2015।
আবর্জনা সংগ্রহকারীরা জাভা প্রায় ২০ ডলারের মধ্যে অবিচ্ছিন্নভাবে উন্নত হয়েছে। এই মুহুর্তে, আপনি যদি ম্যানুয়ালি ময়লা আবর্জনা সংগ্রহকারীকে কল করছেন, আপনি অন্যান্য পন্থাগুলি বিবেচনা করতে পারেন:
* "আমি ভবিষ্যতে যথাযথ মুছে ফেলার জন্য স্থানধারক হিসাবে ব্যক্তিগতভাবে ভেরিয়েবলগুলি বাতিল করার উপর নির্ভর করি For উদাহরণস্বরূপ, অ্যারে নিজেই মুছে ফেলার (নাল তৈরি) করার আগে আমি অ্যারের সমস্ত উপাদানকে বাতিল করতে সময় নিই" "
এটি অপ্রয়োজনীয়। জাভা জিসি যেভাবে কাজ করে তা হ'ল এটি এমন বস্তুগুলিকে সন্ধান করে যাগুলির সাথে তাদের কোনও রেফারেন্স নেই, সুতরাং যদি আমার কাছে একটি রেফারেন্স (= ভেরিয়েবল) এর সাথে একটি অবজেক্ট এক্স থাকে তবে এটির সাথে জিসি এটি মুছে ফেলবে না, কারণ একটি রেফারেন্স রয়েছে যে বস্তু:
a -> x
আপনি যদি এই ঘটনার চেয়ে কিছুটা বাতিল করেন তবে:
a -> null
x
সুতরাং এখন এক্স এর কাছে এটি নির্দেশ করে কোনও রেফারেন্স নেই এবং মোছা হবে। আপনি x এর চেয়ে আলাদা কোনও অবজেক্টের রেফারেন্স সেট করে দিলে একই জিনিস ঘটে থাকে।
সুতরাং আপনার কাছে যদি অ্যারে অ্যারের থাকে যা x, y এবং z এর সাথে সম্পর্কিত এবং একটি ভেরিয়েবল একটি যা অ্যারের উল্লেখ করে এটির মতো দেখাচ্ছে:
a -> arr -> x
-> y
-> z
আপনি যদি এই ঘটনার চেয়ে কিছুটা বাতিল করেন তবে:
a -> null
arr -> x
-> y
-> z
সুতরাং জিসি এটির কোনও রেফারেন্স সেট না করে এটি খুঁজে পেয়েছে এবং এটি মুছে ফেলে যা আপনাকে এই কাঠামো দেয়:
a -> null
x
y
z
এখন জিসি x, y এবং z সন্ধান করে এবং সেগুলি পাশাপাশি মুছে ফেলবে। অ্যারেতে প্রতিটি রেফারেন্স নালার ফলে আরও ভাল কিছু হবে না, এটি কোডে সিপিইউ সময় এবং স্থান ব্যবহার করবে (যা বলেছিল যে এটি এর চেয়ে বেশি ক্ষতি করে না। জিসি এখনও তার মতোভাবে সঞ্চালন করতে সক্ষম হবে )।
কোনও প্রোগ্রামেম (জাভা বা না) থেকে মেমরি মুক্ত করতে চাওয়ার একটি বৈধ কারণ হ'ল অপারেটিং সিস্টেমের স্তরে অন্যান্য প্রোগ্রামগুলিতে আরও মেমরি উপলব্ধ করা। যদি আমার জাভা অ্যাপ্লিকেশনটি 250MB ব্যবহার করে তবে আমি এটিকে জোর করে 1MB তে নামিয়ে দিতে এবং 249MB অন্যান্য অ্যাপ্লিকেশনে উপলব্ধ করতে চাই।
ইয়িয়ানিস জ্যান্থোপল্লোস এবং হট লিক্সের উত্তর এবং মন্তব্যে সম্প্রসারিত করার জন্য (দুঃখিত, আমি এখনও কোনও মন্তব্য করতে পারছি না!), আপনি ভিএম বিকল্পগুলি উদাহরণের মতো সেট করতে পারেন:
-XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30
আমার jdk 7-এ এটি তখন অব্যবহৃত ভিএম মেমরিটি প্রকাশ করবে যদি ভিএম নিষ্ক্রিয় থাকে তখন 30% এর বেশি গাদা জিসির পরে ফ্রি হয়ে যায়। আপনার সম্ভবত এই পরামিতিগুলি টিউন করা দরকার।
যদিও আমি এটি নীচের লিঙ্কটিতে জোর দিয়ে দেখেছি না, নোট করুন যে কিছু আবর্জনা সংগ্রহকারী এই পরামিতিগুলি মানতে পারে না এবং ডিফল্টভাবে জাভা আপনার জন্য এইগুলির মধ্যে একটি বেছে নিতে পারে, আপনার যদি একাধিক কোর থাকতে পারে (সুতরাং উপরের UseG1GC টি যুক্তি) )।
আপডেট: জাভা 1.8.0_73 এর জন্য আমি JVM মাঝে মাঝে ডিফল্ট সেটিংসের সাথে সামান্য পরিমাণে ছাড়তে দেখেছি। It 70% হিপটি অব্যবহৃত থাকলে কেবল এটি করার জন্য উপস্থিত হয় .. ওএস শারীরিক স্মৃতিশক্তি কম থাকলে এটি আরও আক্রমণাত্মক মুক্তি পাবে কিনা তা জানেন না।
আমি এ নিয়ে পরীক্ষা-নিরীক্ষা করেছি।
এটি সত্য যে System.gc();
কেবল আবর্জনা সংগ্রহকারী চালানোর পরামর্শ দেয়।
তবে System.gc();
সমস্ত রেফারেন্স সেট করার পরে কল করা null
কর্মক্ষমতা এবং মেমরির পেশার উন্নতি করবে।
যদি আপনি সত্যিই বরাদ্দ করতে এবং মেমরির একটি ব্লক মুক্ত করতে চান তবে আপনি সরাসরি বাইটবফার দিয়ে এটি করতে পারেন। এমনকি স্মৃতি মুক্ত করার জন্য একটি অ-বহনযোগ্য উপায় রয়েছে।
তবে, যেমনটি পরামর্শ দেওয়া হয়েছে, কেবল আপনাকে সি-তে মেমরি মুক্ত করতে হবে, এর অর্থ এটি করা ভাল ধারণা নয়।
আপনি যদি মনে করেন যে আপনার কাছে ফ্রি () এর জন্য সত্যিই ভাল ব্যবহারের কেস রয়েছে তবে দয়া করে এটিকে প্রশ্নে অন্তর্ভুক্ত করুন যাতে আপনি কী করতে শুরু করছেন তা আমরা দেখতে পারি, সম্ভবত আরও ভাল উপায় আছে।
পুরোপুরি জাভাকফিলব্রেক.ফ্যাফ / ফাক0012 এইচটিএমএল থেকে
একটি নিম্ন অগ্রাধিকারের থ্রেড ব্যবহারকারীর জন্য স্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহের যত্ন নেয়। অলস সময় চলাকালীন, থ্রেডটি ডেকে আনা যেতে পারে এবং এটি জাভাতে কোনও বস্তুকে বরাদ্দ করা মেমরি মুক্ত করতে শুরু করতে পারে। তবে চিন্তা করবেন না - এটি আপনার উপর আপনার বস্তুগুলি মুছে ফেলবে না!
যখন কোনও জিনিসের কোনও উল্লেখ নেই, এটি আবর্জনা সংগ্রহকারীদের জন্য ফর্সা গেম হয়ে ওঠে। কিছু রুটিন কল করার পরিবর্তে (যেমন সি ++ তে মুক্ত) আপনি কেবলমাত্র অবজেক্টের সমস্ত রেফারেন্স নালায় অর্পণ করেন বা রেফারেন্সে একটি নতুন ক্লাস বরাদ্দ করেন।
উদাহরণ:
public static void main(String args[]) { // Instantiate a large memory using class MyLargeMemoryUsingClass myClass = new MyLargeMemoryUsingClass(8192); // Do some work for ( .............. ) { // Do some processing on myClass } // Clear reference to myClass myClass = null; // Continue processing, safe in the knowledge // that the garbage collector will reclaim myClass }
যদি আপনার কোডটি প্রচুর পরিমাণে মেমরির অনুরোধ করতে চলেছে তবে আপনি আবর্জনা সংগ্রহকারীকে নিম্ন-অগ্রাধিকারের থ্রেড হিসাবে এটি করার অনুমতি দেওয়ার পরিবর্তে স্থান পুনরায় দাবি শুরু করার জন্য অনুরোধ করতে পারেন। এটি করতে, আপনার কোডটিতে নিম্নলিখিতগুলি যুক্ত করুন
System.gc();
আবর্জনা সংগ্রহকারী খালি জায়গাটি পুনরায় দাবি করার চেষ্টা করবে এবং যতটা সম্ভব মেমরির পুনরুদ্ধার করা আপনার অ্যাপ্লিকেশনটি চালিয়ে যেতে পারে (মেমরি খণ্ডের সমস্যাগুলি নির্দিষ্ট প্ল্যাটফর্মে প্রয়োগ হতে পারে)।
আমার ক্ষেত্রে, যেহেতু আমার জাভা কোডটি অদূর ভবিষ্যতে অন্যান্য ভাষাগুলিতে পোর্ট করা হবে (প্রধানত সি ++), আমি কমপক্ষে ঠোঁট পরিষেবাটি সঠিকভাবে মেমরি মুক্ত করার জন্য দিতে চাই যাতে এটি পরে পোর্টিং প্রক্রিয়াটিকে সহায়তা করে।
ভবিষ্যতে যথাযথ মুছে ফেলার জন্য আমি ব্যক্তিগতভাবে স্থানধারক হিসাবে চলকগুলি নালিংয়ের উপর নির্ভর করি। উদাহরণস্বরূপ, অ্যারে নিজেই মুছে ফেলার (নাল তৈরি করা) আগে আমি অ্যারের সমস্ত উপাদানকে বাতিল করতে সময় নিই।
তবে আমার কেসটি খুব বিশেষ, এবং আমি জানি আমি এটি করার সময় পারফরম্যান্স হিট করছি।
* "উদাহরণস্বরূপ, বলুন যে আপনি কোনও পদ্ধতির শুরুতে একটি তালিকা ঘোষণা করেছিলেন যা আকারে বৃদ্ধি পেয়েছিল এটি খুব বড় হবে, তবে কেবল পদ্ধতিটির মধ্য দিয়ে অর্ধপথ অবধি প্রয়োজনীয় ছিল You আপনি এই মুহুর্তে তালিকার রেফারেন্সটি শূন্য করতে পারেন You পদ্ধতিটি সম্পূর্ণ হওয়ার আগে আবর্জনা সংগ্রহকারীকে এই বিষয়টিকে সম্ভাব্য পুনরায় দাবি করার অনুমতি দেওয়ার জন্য (এবং যাইহোক রেফারেন্স সুযোগের বাইরে চলে যায়) "। *
এটি সঠিক, তবে এই সমাধানটি সাধারণীকরণযোগ্য নাও হতে পারে। নাল-উইল সম্পর্কিত একটি তালিকা অবজেক্টের রেফারেন্স সেট করার সময় ময়লা আবর্জনা সংগ্রহের জন্য মেমরি উপলব্ধ করা যায়, এটি আদিম ধরণের তালিকার অবজেক্টের জন্যই সত্য। পরিবর্তে তালিকার অবজেক্টে যদি রেফারেন্সের ধরণ থাকে তবে তালিকার অবজেক্ট = নাল নির্ধারণের ক্ষেত্রে তালিকাভুক্ত রেফারেন্সের ধরণগুলির - কোনও- dereferences হবে না। এক্ষেত্রে তালিকা অবজেক্ট = নাল নির্ধারণ করা এমন সংস্থানীয় রেফারেন্স প্রকারগুলিকে অনাথ করে দেবে যার আবর্জনা সংগ্রহের অ্যালগোরিদম অবজ্ঞাতভাবে নির্ধারণের জন্য যথেষ্ট স্মার্ট না হয় যদি না আবর্জনা অনাথ হয়েছে কিনা।
অ্যালথ্রু জাভা স্বয়ংক্রিয় আবর্জনা সংগ্রহ সরবরাহ করে আপনি কখনও কখনও জানতে পারেন যে বস্তুটি কত বড় এবং এর কতটুকু অবশিষ্ট রয়েছে। বিনামূল্যে প্রোগ্রামের সাহায্যে মেমরি import java.lang;
এবং Runtime r=Runtime.getRuntime();
মেমরিকে mem1=r.freeMemory();
মুক্ত r.gc();
পদ্ধতিতে এবং কলটি ব্যবহার করে মেমরির মান অর্জন করতে পারেfreeMemory()
জেভিএর কাছ থেকে প্রস্তাবটি হ'ল শূন্য করা
Https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html থেকে
পরিষ্কারভাবে স্পষ্টভাবে নূন্য মানটি ভেরিয়েবলগুলিতে নির্ধারণ করা যা আর প্রয়োজন হয় না তা আবর্জনা সংগ্রহকারীকে মেমরির সেই অংশগুলি সনাক্ত করতে সহায়তা করে যা নিরাপদে পুনরায় দাবি করা যেতে পারে। যদিও জাভা মেমরি পরিচালনা সরবরাহ করে তবে এটি মেমরি ফাঁস বা অতিরিক্ত পরিমাণে মেমরি ব্যবহার করে প্রতিরোধ করে না।
অ্যাপ্লিকেশন রেফারেন্স প্রকাশ না করে মেমরির ফাঁসিকে প্ররোচিত করতে পারে application এটি করার ফলে জাভা আবর্জনা সংগ্রহকারীকে সেই জিনিসগুলি পুনরায় দাবি করা থেকে বাধা দেয় এবং ফলস্বরূপ মেমরি ব্যবহারের পরিমাণ বাড়ছে being ভেরিয়েবলের স্পষ্টভাবে উল্লেখগুলি বাতিল করার পরে তাদের ব্যবহারের পরে আবর্জনা সংগ্রহকারী মেমরিটিকে পুনরায় দাবি করতে দেয়।
মেমরি ফাঁস সনাক্ত করার একটি উপায় হ'ল প্রোফাইলিং সরঞ্জাম নিয়োগ এবং প্রতিটি লেনদেনের পরে মেমরির স্ন্যাপশট নেওয়া। অবিচলিত অবস্থায় একটি ফুটোমুক্ত অ্যাপ্লিকেশন আবর্জনা সংগ্রহের পরে অবিচ্ছিন্ন সক্রিয় গাদা স্মৃতি প্রদর্শন করবে।