java - System.gc() কে কল করার খারাপ অনুশীলন কেন?




garbage-collection (9)

System.gc() দিয়ে জাভা-এ জোরপূর্বক বস্তুগুলি কীভাবে System.gc() একটি 1.5 গিগাবাইট হ্যাশম্যাপ সাফ করে) সম্পর্কে একটি প্রশ্নের answering পরে, আমাকে System.gc() ম্যানুয়ালি কল করার খারাপ অনুশীলন বলা হয়েছিল, কিন্তু মন্তব্যগুলি ছিল না সম্পূর্ণরূপে বিশ্বাসী। উপরন্তু, কেউ উত্থান সাহস করলো, না আমার উত্তর নত।

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

আমি বুঝতে পারছি যে মেমরি পুনরুদ্ধার করার প্রয়োজন হলে JVM সাধারণত আপনার চেয়ে ভাল জানেন। আমি বুঝতে পারি যে কয়েক কিলোবাইটের তথ্য নিয়ে চিন্তা করা মূর্খ। আমি বুঝতে পারি যে এমনকি ডেটা এমনকি মেগাবাইট এটি কয়েক বছর আগে নয়। কিন্তু এখনও 1.5 গিগাবাইট? এবং আপনি জানেন যে 1.5 গিগাবাইটের মতো ডাটা মেমরির কাছাকাছি ঝুলছে; এটা অন্ধকার একটি শট মত এটা না। System.gc() পদ্ধতিগতভাবে খারাপ, নাকি এটি কোনও পয়েন্টে ঠিক আছে?

তাই প্রশ্ন আসলে দ্বিগুণ:

  • কেন System.gc() কল করার খারাপ অনুশীলন System.gc() ? কিছু বাস্তবায়ন অধীনে এটি আসলেই কেবল JVM এর ইঙ্গিত, নাকি এটি সর্বদা একটি সম্পূর্ণ সংগ্রহ চক্র? সত্যিই কি আবর্জনা সংগ্রাহক বাস্তবায়ন আছে যা বিশ্বের কাজ বন্ধ করে তাদের কাজ করতে পারে? আমার answering মতামত দিয়েছেন এমন বিভিন্ন দাবির উপর কিছু আলোকপাত করুন।
  • কোথায় থ্রেশহোল্ড? System.gc() কে কল করার কোনও ভাল ধারণা নাকি এটি গ্রহণযোগ্য সময় আছে? যদি তাই হয়, ঐ সময় কি?

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

  2. কিছু ভাষায়, যেমন সি ++, গতিশীলভাবে বরাদ্দকৃত বস্তুগুলিকে অবশ্যই মুছে ফেলার অপারেটর ব্যবহার করে ছেড়ে দেওয়া উচিত।

  3. জাভা একটি ভিন্ন পদ্ধতির লাগে; এটি স্বয়ংক্রিয়ভাবে আপনার জন্য deallocation পরিচালনা করে।
  4. এই যে কৌশল যে আবর্জনা সংগ্রহ বলা হয়। এটি এমনভাবে কাজ করে: যখন কোনো বস্তুর কোনও রেফারেন্স উপস্থিত থাকে না, তখন সেই বস্তুটির আর প্রয়োজন হয় না বলে মনে করা হয় এবং বস্তুর দ্বারা দখলকৃত স্মৃতিটি পুনঃ দাবি করা যেতে পারে। C ++ হিসাবে বস্তুগুলি ধ্বংস করার জন্য কোনও স্পষ্ট প্রয়োজন নেই।
  5. গার্বেজ সংগ্রহ শুধুমাত্র আপনার প্রোগ্রাম কার্যকর করার সময় sporadically (যদি সব) হয়।
  6. এটি কেবলমাত্র ঘটবে না কারণ এক বা একাধিক বস্তু বিদ্যমান নেই যা আর ব্যবহার করা হয় না।
  7. উপরন্তু, বিভিন্ন জাভা রান-টাইম বাস্তবায়নগুলি আবর্জনা সংগ্রহের পরিবর্তে বিভিন্ন পদ্ধতি গ্রহণ করবে, তবে বেশির ভাগ ক্ষেত্রে আপনার প্রোগ্রামগুলি লেখার সময় আপনাকে এটি সম্পর্কে চিন্তা করতে হবে না।

অনেক লোক আপনাকে এটা করতে বলছে বলে মনে হচ্ছে না। আমি অসম্মতি। যদি লোড লোড করার মতো বড় লোডিং প্রক্রিয়া পরে, আপনি বিশ্বাস করেন যে:

  1. আপনার কাছে অনেকগুলি অবজেক্ট রয়েছে যা অ্যাক্সেসযোগ্য নয় এবং এটি gc'ed নাও থাকতে পারে। এবং
  2. আপনি এই সময়ে ব্যবহারকারী একটি ছোট মন্থর সঙ্গে স্থাপন করতে পারে মনে হয়

System.gc () কে কল করার কোন ক্ষতি নেই। আমি এটি সি / সি ++ inline কীওয়ার্ডের মত দেখি। এটি কেবলমাত্র জি-সি-এর একটি ইঙ্গিত যা আপনি, বিকাশকারী সিদ্ধান্ত নিয়েছে যে সময় / কর্মক্ষমতা সাধারণত এটির মতো গুরুত্বপূর্ণ নয় এবং এটির কিছুটি মেমরি পুনরুদ্ধারের জন্য ব্যবহার করা যেতে পারে।

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

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


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

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

যাইহোক, এটি সাহায্য করবে বা আঘাত করবে (বা কিছুই করবে না) প্ল্যাটফর্মের উপর অত্যন্ত নির্ভরশীল (উপরে বর্ণিত হিসাবে)।

তাই আমি মনে করি এটি একটি শেষ অবলম্বন প্ল্যাটফর্ম-নির্দিষ্ট অপ্টিমাইজেশান হিসাবে বৈধ (অর্থাত্ অন্যান্য কর্মক্ষমতা অপ্টিমাইজেশান যথেষ্ট নয়)। কিন্তু আপনাকে এটি কেবলমাত্র কল করতে হবে না কারণ আপনি বিশ্বাস করেন যে এটি (বিশেষ মানদণ্ড ব্যতীত) সহায়তা করতে পারে, কারণ সম্ভাবনা নেই।


এটি ইতিমধ্যে ব্যাখ্যা করা হয়েছে যে system.gc() কলিং কিছুই করতে পারে না এবং যে কোনও কোড যা চালানোর জন্য আবর্জনা সংগ্রাহককে "প্রয়োজন" ভাঙ্গা হয়।

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

একটি সাধারণ জিসি অ্যালগরিদম হিপে সমস্ত অ-আবর্জনা বস্তুকে ট্র্যাভার করে আবর্জনা সনাক্ত করে এবং যে কোনও বস্তু পরিদর্শন করা হয় তা আবর্জনা হওয়া উচিত নয়। এর থেকে আমরা একটি আবর্জনা সংগ্রহের মোট কাজকে মডেল করতে পারি যা একটি অংশ যা লাইভ তথ্য পরিমাণে অনুপাতযুক্ত এবং অন্য অংশ যা আবর্জনা পরিমাণে আনুপাতিক হয়; অর্থাৎ work = (live * W1 + garbage * W2)

এখন অনুমান করুন যে আপনি একক-থ্রেডেড অ্যাপ্লিকেশনে নিম্নলিখিতটি করেন।

System.gc(); System.gc();

প্রথম কল (আমরা ভবিষ্যদ্বাণী) করব (live * W1 + garbage * W2) কাজ, এবং অসামান্য আবর্জনা পরিত্রাণ পেতে।

দ্বিতীয় কল করতে হবে (live* W1 + 0 * W2) কাজ এবং কিছু (live* W1 + 0 * W2) দাবি। অন্য কথায় আমরা কাজ (live * W1) কাজ করেছেন এবং একেবারে কিছুই অর্জন করেছেন

আমরা সংগ্রহকারীর দক্ষতা মডেল হিসাবে আবর্জনা একক সংগ্রহ করার জন্য প্রয়োজনীয় পরিমাণ মডেল করতে পারেন; অর্থাৎ efficiency = (live * W1 + garbage * W2) / garbage । তাই জিসিকে যতটা সম্ভব দক্ষ করে তুলতে, আমরা যখন জিসি চালাতে পারি তখন আমাদের garbage মূল্যকে সর্বোচ্চ করতে হবে ; অর্থাৎ হিপ পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করুন। (এবং, সম্ভব হিসাবে হিপ হিসাবে বড় করা। কিন্তু যে একটি পৃথক বিষয়।)

যদি অ্যাপ্লিকেশনটি হস্তক্ষেপ না করে ( System.gc() কল করে), GC চলমান হওয়ার আগে System.gc() পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করবে, ফলস্বরূপ আবর্জনা কার্যকর সংগ্রহের ফলে 1 । কিন্তু যদি অ্যাপ্লিকেশনটি জিসি চালানোর জন্য চাপ দেয় তবে সম্ভাবনা হ'ল হিপটি পূর্ণ হবে না এবং ফলস্বরূপ আবর্জনাটি অকার্যকরভাবে সংগৃহীত হবে। এবং আরো প্রায়ই অ্যাপ্লিকেশন জিসি বাহিনী, জিসি আরো অদক্ষ হয়ে ওঠে।

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

1 - এইভাবে "throughput" সংগ্রাহক কিভাবে কাজ করে। সিএমএস এবং জি 1 সমান্তরাল সংগ্রাহকগুলি গার্বেজ সংগ্রাহক কখন শুরু করবেন তা নির্ধারণের জন্য বিভিন্ন মানদণ্ড ব্যবহার করে।

2 - আমিও মেমরি পরিচালকদের বাদ দিয়েছি যা রেফারেন্স গণনাটি একচেটিয়াভাবে ব্যবহার করে, কিন্তু কোনও কার্যকর জাভা বাস্তবায়ন সেই পদ্ধতির ব্যবহার করে না ... ভাল কারণে।


কখনও কখনও ( প্রায়ই নয়! ) আপনি সত্যিই অতীত, বর্তমান এবং ভবিষ্যতের মেমরি ব্যবহারের সম্পর্কে আরও জানেন, রান রান করে। এটি প্রায়শই ঘটবে না এবং স্বাভাবিক পৃষ্ঠাগুলি পরিবেশন করা অবস্থায় আমি কখনও ওয়েব অ্যাপ্লিকেশনে দাবি করবো না।

অনেক বছর আগে আমি একটি রিপোর্ট জেনারেটর কাজ, যে

  • একটি একক থ্রেড ছিল
  • একটি সারির থেকে "রিপোর্ট অনুরোধ" পড়ুন
  • ডাটাবেস থেকে রিপোর্ট জন্য প্রয়োজনীয় তথ্য লোড
  • রিপোর্ট তৈরি এবং এটি ইমেল।
  • কোন অসামান্য অনুরোধ ছিল যখন ঘুম, চিরতরে পুনরাবৃত্তি।
  • এটা রিপোর্টের মধ্যে কোন তথ্য পুনঃব্যবহার করেনি এবং কোন নগদ টাকা না।

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

প্রক্রিয়া উপরের রূপরেখা তাকান, এটা স্পষ্ট যে।

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

সুতরাং যখনই অনুরোধের সারি খালি ছিল তখন জিসি চালানোর সময় এটি পরিষ্কার ছিল! এই কোন নেতিবাচক ছিল।

প্রতিটি রিপোর্ট ইমেল করার পরে এটি একটি GC রান করার যোগ্য হতে পারে, আমরা জানি যে এটি একটি GC চালানোর জন্য একটি ভাল সময়। তবে কম্পিউটারে যথেষ্ট RAM থাকলে ভাল ফলাফলগুলি GC রান বিলম্বিত করে নেওয়া হবে।

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

আমরা কখনই কোনও ইনস্টলেশন সনাক্ত করি নি যেটি কার্যকরী সারি খালি ছিল তখন প্রত্যেকটি জোরপূর্বক GC চালনা ছিল না।

কিন্তু, পরিষ্কার করা যাক, উপরের একটি সাধারণ ক্ষেত্রে নয়।


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

System.gc() কে কল করা জি.সি. এর অর্থ হল: "যারা সবার মনোযোগ সহকারে প্যাটার্ন পরামিতি, সেই স্মার্ট সংগঠনগুলি, আপনি যে সকল প্রচেষ্টাগুলি বরাদ্দের মধ্যে ভাগাভাগি করেন এবং পরিচালনা করেন সেগুলি যাতে মসৃণভাবে চলতে পারে, ঠিক আছে, শুধু পুরোটা ছেড়ে দিন এবং স্ক্র্যাচ থেকে শুরু করুন।" এটি কর্মক্ষমতা উন্নত করতে পারে, কিন্তু বেশিরভাগ সময় এটি কর্মক্ষমতা হ্রাস পায়

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

(*) আমি এখানে দক্ষতা সম্পর্কে কথা বলছি। System.gc() কোনও সঠিক জাভা প্রোগ্রাম ভাঙ্গবে না। এটি অতিরিক্ত মেমোরিটিও OutOfMemoryError করবে না যেটি JVM অন্যথায় অর্জন করতে পারে নি: OutOfMemoryError ফেলে দেওয়ার আগে, JVM System.gc() শেষ কাজ System.gc() কাজ করে।


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

(নিম্নলিখিত মন্তব্যগুলি সিএমএস সংগ্রাহকের সাথে লিনাক্সে চলমান System.gc() প্রযোজ্য, যেখানে আমি নিশ্চিত যে System.gc() আসলে সর্বদা একটি সম্পূর্ণ আবর্জনা সংগ্রহের আহ্বান System.gc() )।

  1. আপনার আবেদন শুরু করার প্রাথমিক কাজ করার পরে, আপনি মেমরি ব্যবহারের একটি ভয়ানক অবস্থা হতে পারে। অর্ধেক আপনার কর্মজীবন প্রজন্মের আবর্জনা পূর্ণ হতে পারে, যার মানে আপনি আপনার প্রথম সিএমএস কাছাকাছি যে। অ্যাপ্লিকেশনের ক্ষেত্রে যেখানে এটি গুরুত্বপূর্ণ, সরাসরি লাইভ ডেটাতে আপনার হিপটি "রিসেট" করার জন্য System.gc () কে কল করার একটি খারাপ ধারণা নয়।

  2. # 1 হিসাবে একই লাইনের পাশাপাশি আপনি যদি আপনার হিপের ব্যবহার ঘনিষ্ঠভাবে পর্যবেক্ষণ করেন তবে আপনার বেসলাইন মেমরির ব্যবহার কী তা সঠিকভাবে পড়তে চান। আপনার অ্যাপ্লিকেশনের আপটাইমের প্রথম 2 মিনিটটি যদি সমস্ত প্রারম্ভিকতা হয় তবে আপনার তথ্যটি সম্পূর্ণরূপে জাগ্রত হবে না যতক্ষণ না আপনি সম্পূর্ণ জিসি আপ ফ্রন্ট (আহমেদ ... "প্রস্তাব করুন") চাপ দিন।

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

  4. মেমরি লিকের অস্তিত্ব যাচাই করার জন্য উত্পাদনশীল অ্যাপ্লিকেশনটিতে System.gc কল উপলব্ধ করার জন্য এটি কখনও কখনও দরকারী। আপনি যদি জানেন যে সময়ে সময়ে লাইভ ডেটা সেটটি নির্দিষ্ট সময়ের মধ্যে লাইভ ডাটা সেটের মধ্যে থাকা উচিত, তবে এটি System.gc () কে X এবং সময় Y কে কল করার জন্য এবং মেমরি ব্যবহারের সাথে তুলনা করার উপযোগী হতে পারে। ।


হয়তো আমি crappy কোড লিখতে, কিন্তু আমি বুঝতে পেরেছি যে eclipse এবং netbeans ID- এ ট্র্যাশ-আইকন আইকনটি ক্লিক করা একটি 'ভাল অনুশীলন'।


System.gc() কে এড়াতে সর্বদা সর্বদা কারণ বলে যে এটি মূলত ভাঙা কোডের একটি চমত্কার ভাল সূচক । সঠিকতা জন্য এটি উপর নির্ভর করে যে কোন কোড অবশ্যই ভাঙ্গা হয়; কর্মক্ষমতা জন্য এটি নির্ভর করে যে যে কোনও সম্ভবত ভাঙা হয়।

আপনি জানেন না কোন ধরনের আবর্জনা সংগ্রাহক আপনি চলমান। নিশ্চিতভাবে কিছু আছে যা আপনি "বিশ্ব বন্ধ করুন" না বলে দাবি করেন তবে কিছু JVM স্মার্ট বা বিভিন্ন কারণে নয় (সম্ভবত তারা কোনও ফোনে?) তা করবেন না। আপনি কি করতে যাচ্ছে তা জানি না।

এছাড়াও, এটা কিছু করার নিশ্চয়তা দেওয়া হয় না। JVM সম্পূর্ণরূপে আপনার অনুরোধ উপেক্ষা করতে পারে।

"আপনি কি করবেন তা জানেন না", "আপনি এটি জানেন না যে এটিও জানেন না" এবং "আপনাকে যেভাবে এটি কল করতে হবে না" এর সমন্বয়ই কেন সাধারণ মানুষ বলছে এভাবে এত জোরালো আপনি এটা কল করা উচিত নয়। আমি মনে করি এটি একটি মামলা "যদি আপনি জিজ্ঞাসা করতে চান যে আপনি এই ব্যবহার করা উচিত কিনা, আপনি"

অন্যান্য থ্রেড থেকে কয়েক উদ্বেগ মোকাবেলার সম্পাদনা করুন :

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

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

এটি দেখাতে যে System.gc() কিছুই করে না, দেখুন:

http://bugs.sun.com/view_bug.do?bug_id=6668279

এবং বিশেষ করে একটি -XX:DisableExplicitGC ভিএম বিকল্প।







garbage-collection