জাভাতে মেমরি কীভাবে মুক্ত করবেন?


146

জাভাতে মেমরি মুক্ত করার কোনও উপায় কি সি এর free()ফাংশনের অনুরূপ ? অথবা কী অবজেক্টটি নালায় সেট করছে এবং একমাত্র বিকল্পটি জিসির উপর নির্ভর করছে?


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

7
স্পষ্টকরণের জন্য, যার উদ্দেশ্য এটিই ভোট দিয়েছেন - এটি পূর্ববর্তী মন্তব্যগুলি নয়।
ড্যানিয়েল বিংহাম 18

উত্তর:


96

জাভা পরিচালিত মেমোরি ব্যবহার করে, সুতরাং মেমরিটি বরাদ্দ করার একমাত্র উপায় হ'ল newঅপারেটরটি ব্যবহার করে এবং মেমরিটিকে হ্রাস করার একমাত্র উপায় হ'ল আবর্জনা সংগ্রাহকের উপর নির্ভর করে।

এই মেমরি পরিচালনা হোয়াইটপ্যাপার (পিডিএফ) কী চলছে তা বোঝাতে সহায়তা করতে পারে।

System.gc()আবর্জনা সংগ্রহকারীকে অবিলম্বে চালানোর পরামর্শ দেওয়ার জন্যও আপনি কল করতে পারেন । তবে জাভা রানটাইম চূড়ান্ত সিদ্ধান্ত নেয়, আপনার কোড নয়।

মতে জাভা ডকুমেন্টেশন ,

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


5
এটি আবর্জনা সংগ্রাহককে চালাতে বাধ্য করে। যদিও এটিকে মেমোরি মুক্ত করতে বাধ্য করে না ...
পাবলো সান্তা ক্রুজ

13
পাবলো না, এটি জিসি চালাতে বাধ্য করে না।
জেস্পার 18

1
আমাকে খুব নির্ভরযোগ্য ব্যক্তি বলেছিলেন যে হটস্পটভিএমের সমস্ত আবর্জনা সংগ্রহকারীরা System.gc()পুরোপুরি উপেক্ষা করে।
এসকো

1
উইনএক্সপি জাভাতে এসই জিসি প্রতিটি সিস্টেম.gc () বা প্রায় প্রত্যেকটি চালায় তবে এপিআই ডক এটির গ্যারান্টি দেয় না।
teodozjan

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

65

কেউ স্পষ্টভাবে অবজেক্ট রেফারেন্স সেট করে উল্লেখ করেছেন বলে মনে হয় না null, যা আপনি বিবেচনা করতে চাইতে পারেন মেমরিটিকে "মুক্ত" করার একটি বৈধ কৌশল।

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

নোট করুন যে আমি বাস্তবে এই কৌশলটি খুব কমই ব্যবহার করি তবে খুব বড় ডেটা স্ট্রাকচারের সাথে কাজ করার সময় এটি বিবেচনার জন্য উপযুক্ত।


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

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

22
System.gc(); 

চালায় আবর্জনা সংগ্রহকারী।

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

প্রস্তাবিত নয়।

সম্পাদনা: আমি 2009 সালে মূল প্রতিক্রিয়াটি লিখেছিলাম It's এটি এখন 2015।

আবর্জনা সংগ্রহকারীরা জাভা প্রায় ২০ ডলারের মধ্যে অবিচ্ছিন্নভাবে উন্নত হয়েছে। এই মুহুর্তে, আপনি যদি ম্যানুয়ালি ময়লা আবর্জনা সংগ্রহকারীকে কল করছেন, আপনি অন্যান্য পন্থাগুলি বিবেচনা করতে পারেন:

  • আপনি যদি সীমাবদ্ধ সংখ্যক মেশিনে জিসি চাপ দিচ্ছেন তবে বর্তমান মেশিন থেকে লোড ব্যালেন্সার পয়েন্ট দূরে থাকা, এটি সংযুক্ত ক্লায়েন্টদের পরিবেশন শেষ করার জন্য অপেক্ষা করা, কিছুক্ষণ সময় ধরে হ্যাং সংযোগের জন্য সময়সীমা নির্ধারণ করা এবং তারপর কেবল শক্ত - জেভিএম পুনরায় চালু করুন। এটি একটি ভয়াবহ সমাধান, তবে আপনি যদি সিস্টেম.gc () এর দিকে তাকান তবে জোর করে পুনঃসূচনাগুলি একটি সম্ভাব্য স্টপগ্যাপ হতে পারে।
  • একটি পৃথক আবর্জনা সংগ্রহকারী ব্যবহার বিবেচনা করুন। উদাহরণস্বরূপ, (গত ছয় বছরে নতুন) জি 1 সংগ্রাহক একটি কম-বিরতি মডেল; এটি সামগ্রিকভাবে আরও বেশি সিপিইউ ব্যবহার করে, তবে কখনওই মৃত্যুদন্ড কার্যকর করার জন্য কঠোর চাপ না দেওয়া ভাল। যেহেতু সার্ভার সিপিইউগুলিতে এখন প্রায় সকলেরই একাধিক কোর রয়েছে তাই এটি উপলব্ধ সত্যই ভাল ট্রেড অফ।
  • স্মৃতি ব্যবহারের জন্য আপনার পতাকাগুলি দেখুন। বিশেষত জাভার নতুন সংস্করণগুলিতে, যদি আপনার কাছে দীর্ঘমেয়াদী চলমান অবজেক্টগুলি না থাকে তবে স্তূপে নিউজেনের আকার বাড়িয়ে তুলুন। newgen (তরুণ) হ'ল নতুন বস্তু বরাদ্দ করা হয়। ওয়েবসভারের জন্য, অনুরোধের জন্য তৈরি করা সমস্ত কিছু এখানে দেওয়া হয় এবং যদি এই স্থানটি খুব কম হয় তবে জাভা বস্তুগুলিকে দীর্ঘস্থায়ী স্মৃতিতে উন্নত করতে অতিরিক্ত সময় ব্যয় করবে, যেখানে তারা হত্যা করা আরও ব্যয়বহুল। (যদি নিউজেন সামান্য খুব ছোট হয় তবে আপনি এর জন্য অর্থ প্রদান করতে যাচ্ছেন)) উদাহরণস্বরূপ, জি 1 এ:
    • এক্সএক্স: জি 1 নিউজ সাইজ পার্সেন্ট (ডিফল্ট 5 এ; সম্ভবত কোনও ব্যাপার নয়)
    • XX: G1MaxNewSizePercent (ডিফল্ট 60 এ; সম্ভবত এটি উত্থাপন করুন))
  • আপনি আরও দীর্ঘ বিরতি দিয়ে ঠিক করছেন না এমন আবর্জনা সংগ্রহকারীকে বলার বিষয়ে বিবেচনা করুন। এটি সিস্টেমে তার বাকী বাধাগুলি রাখার জন্য আরও ঘন ঘন জিসি রান চালায়। জি 1 তে:
    • এক্সএক্স: ম্যাক্সজি সিসিপিউস মিলিস (ডিফল্ট ২০০ এ।)

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

1
"জিসি পদ্ধতিতে কল করার পরামর্শ দেয় যে জেভিএম প্রচেষ্টা প্রসারিত করবে"
ম্যাট বি

2
@ জেস্পার, ডিনের উত্তরটিতে "প্রস্তাবনাগুলি" রয়েছে। আসলে তিনি পদ্ধতির জাভাদোকগুলি থেকে সঠিক ডকুমেন্টেশন পোস্ট করেছিলেন ...
ম্যাট বি

2
@ সফটওয়্যার বানর: হ্যাঁ, আমি এটি সম্পাদনা করতে পারতাম। তবে যেহেতু ডিন জে স্পষ্টতই সক্রিয় ছিলেন (মাত্র কয়েক মিনিট আগে পোস্ট করা), তখন আমি বুঝতে পারি যে এটি করার জন্য তাকে জিজ্ঞাসা করা সৌজন্য কাজ। তিনি না থাকলে আমি এখানে ফিরে এসে সম্পাদনা করে আমার মন্তব্য মুছে ফেলতাম।
ড্যানিয়েল প্রাইডেন

1
এটি সুপারিশ করা হয় না কেন আমরা বলার অপেক্ষা রাখে না। যদি জেভিএম জিসি চালনার জন্য "পরামর্শ" তে মনোযোগ দেয় তবে এটি অবশ্যই আপনার অ্যাপ্লিকেশনটিকে ধীর করে দেবে, সম্ভবত অনেকগুলি আদেশের দ্বারা!
স্টিফেন সি

11

* "আমি ভবিষ্যতে যথাযথ মুছে ফেলার জন্য স্থানধারক হিসাবে ব্যক্তিগতভাবে ভেরিয়েবলগুলি বাতিল করার উপর নির্ভর করি 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 সন্ধান করে এবং সেগুলি পাশাপাশি মুছে ফেলবে। অ্যারেতে প্রতিটি রেফারেন্স নালার ফলে আরও ভাল কিছু হবে না, এটি কোডে সিপিইউ সময় এবং স্থান ব্যবহার করবে (যা বলেছিল যে এটি এর চেয়ে বেশি ক্ষতি করে না। জিসি এখনও তার মতোভাবে সঞ্চালন করতে সক্ষম হবে )।


5

কোনও প্রোগ্রামেম (জাভা বা না) থেকে মেমরি মুক্ত করতে চাওয়ার একটি বৈধ কারণ হ'ল অপারেটিং সিস্টেমের স্তরে অন্যান্য প্রোগ্রামগুলিতে আরও মেমরি উপলব্ধ করা। যদি আমার জাভা অ্যাপ্লিকেশনটি 250MB ব্যবহার করে তবে আমি এটিকে জোর করে 1MB তে নামিয়ে দিতে এবং 249MB অন্যান্য অ্যাপ্লিকেশনে উপলব্ধ করতে চাই।


আপনার যদি জাভা প্রোগ্রামে স্পষ্টভাবে 249MB এর একগুচ্ছ অংশ মুক্ত করতে হয় তবে মেমরি পরিচালনা প্রথম কাজ নয় যা আমি কাজ করতে চাই।
মার্ক ডিমিলো

3
তবে আপনার জাভা হ্যাপের মধ্যে স্টোরেজ মুক্ত করা (সাধারণ ক্ষেত্রে) অন্যান্য অ্যাপ্লিকেশনগুলিতে স্টোরেজ উপলব্ধ করে না।
হট লিকস 21

5

ইয়িয়ানিস জ্যান্থোপল্লোস এবং হট লিক্সের উত্তর এবং মন্তব্যে সম্প্রসারিত করার জন্য (দুঃখিত, আমি এখনও কোনও মন্তব্য করতে পারছি না!), আপনি ভিএম বিকল্পগুলি উদাহরণের মতো সেট করতে পারেন:

-XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30

আমার jdk 7-এ এটি তখন অব্যবহৃত ভিএম মেমরিটি প্রকাশ করবে যদি ভিএম নিষ্ক্রিয় থাকে তখন 30% এর বেশি গাদা জিসির পরে ফ্রি হয়ে যায়। আপনার সম্ভবত এই পরামিতিগুলি টিউন করা দরকার।

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

ভিএম যুক্তি

আপডেট: জাভা 1.8.0_73 এর জন্য আমি JVM মাঝে মাঝে ডিফল্ট সেটিংসের সাথে সামান্য পরিমাণে ছাড়তে দেখেছি। It 70% হিপটি অব্যবহৃত থাকলে কেবল এটি করার জন্য উপস্থিত হয় .. ওএস শারীরিক স্মৃতিশক্তি কম থাকলে এটি আরও আক্রমণাত্মক মুক্তি পাবে কিনা তা জানেন না।


4

আমি এ নিয়ে পরীক্ষা-নিরীক্ষা করেছি।

এটি সত্য যে System.gc();কেবল আবর্জনা সংগ্রহকারী চালানোর পরামর্শ দেয়।

তবে System.gc();সমস্ত রেফারেন্স সেট করার পরে কল করা nullকর্মক্ষমতা এবং মেমরির পেশার উন্নতি করবে।


আমি মনে করি আপনি নিশ্চিতভাবে বলতে পারবেন না যে "System.gc () কল করা সমস্ত উল্লেখ বাতিল করার পরে, কর্মক্ষমতা এবং মেমরির পেশা উন্নত করবে।" কারণ এখানে সিস্টেম.gc () এর বিশাল গণ্য জটিলতা রয়েছে। এমনকি সিস্টেম.gc () কল করার পরেও এবং সত্যই আবর্জনা সংগ্রহ করার পরেও, jvm মেমরিটিকে ওএস বা সিস্টেমে ফিরিয়ে দিতে পারে না। জেভিএম ভবিষ্যতের রেফারেন্সের জন্য স্মৃতি ধরে রাখতে পারে। এই উত্তর দেখুন ।
মোঃ আবু নাফী ইবনা জাহিদ

3

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

তবে, যেমনটি পরামর্শ দেওয়া হয়েছে, কেবল আপনাকে সি-তে মেমরি মুক্ত করতে হবে, এর অর্থ এটি করা ভাল ধারণা নয়।

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


3

পুরোপুরি জাভাকফিলব্রেক.ফ্যাফ / ফাক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();

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


1

আমার ক্ষেত্রে, যেহেতু আমার জাভা কোডটি অদূর ভবিষ্যতে অন্যান্য ভাষাগুলিতে পোর্ট করা হবে (প্রধানত সি ++), আমি কমপক্ষে ঠোঁট পরিষেবাটি সঠিকভাবে মেমরি মুক্ত করার জন্য দিতে চাই যাতে এটি পরে পোর্টিং প্রক্রিয়াটিকে সহায়তা করে।

ভবিষ্যতে যথাযথ মুছে ফেলার জন্য আমি ব্যক্তিগতভাবে স্থানধারক হিসাবে চলকগুলি নালিংয়ের উপর নির্ভর করি। উদাহরণস্বরূপ, অ্যারে নিজেই মুছে ফেলার (নাল তৈরি করা) আগে আমি অ্যারের সমস্ত উপাদানকে বাতিল করতে সময় নিই।

তবে আমার কেসটি খুব বিশেষ, এবং আমি জানি আমি এটি করার সময় পারফরম্যান্স হিট করছি।


1

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

এটি সঠিক, তবে এই সমাধানটি সাধারণীকরণযোগ্য নাও হতে পারে। নাল-উইল সম্পর্কিত একটি তালিকা অবজেক্টের রেফারেন্স সেট করার সময় ময়লা আবর্জনা সংগ্রহের জন্য মেমরি উপলব্ধ করা যায়, এটি আদিম ধরণের তালিকার অবজেক্টের জন্যই সত্য। পরিবর্তে তালিকার অবজেক্টে যদি রেফারেন্সের ধরণ থাকে তবে তালিকার অবজেক্ট = নাল নির্ধারণের ক্ষেত্রে তালিকাভুক্ত রেফারেন্সের ধরণগুলির - কোনও- dereferences হবে না। এক্ষেত্রে তালিকা অবজেক্ট = নাল নির্ধারণ করা এমন সংস্থানীয় রেফারেন্স প্রকারগুলিকে অনাথ করে দেবে যার আবর্জনা সংগ্রহের অ্যালগোরিদম অবজ্ঞাতভাবে নির্ধারণের জন্য যথেষ্ট স্মার্ট না হয় যদি না আবর্জনা অনাথ হয়েছে কিনা।


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

1

অ্যালথ্রু জাভা স্বয়ংক্রিয় আবর্জনা সংগ্রহ সরবরাহ করে আপনি কখনও কখনও জানতে পারেন যে বস্তুটি কত বড় এবং এর কতটুকু অবশিষ্ট রয়েছে। বিনামূল্যে প্রোগ্রামের সাহায্যে মেমরি import java.lang;এবং Runtime r=Runtime.getRuntime(); মেমরিকে mem1=r.freeMemory();মুক্ত r.gc();পদ্ধতিতে এবং কলটি ব্যবহার করে মেমরির মান অর্জন করতে পারেfreeMemory()


1

জেভিএর কাছ থেকে প্রস্তাবটি হ'ল শূন্য করা

Https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html থেকে

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

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

মেমরি ফাঁস সনাক্ত করার একটি উপায় হ'ল প্রোফাইলিং সরঞ্জাম নিয়োগ এবং প্রতিটি লেনদেনের পরে মেমরির স্ন্যাপশট নেওয়া। অবিচলিত অবস্থায় একটি ফুটোমুক্ত অ্যাপ্লিকেশন আবর্জনা সংগ্রহের পরে অবিচ্ছিন্ন সক্রিয় গাদা স্মৃতি প্রদর্শন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.