System.gc () কল করা খারাপ অভ্যাস কেন?


326

উত্তর দেওয়ার পরে কিভাবে সম্পর্কে একটি প্রশ্ন জাভা বল-মুক্ত বস্তু সঙ্গে (লোক একটি 1.5GB HashMap ক্লিয়ারিং হয়) System.gc(), আমাকে বলা হয়েছে এটা খারাপ অভ্যাস ডাকতে System.gc()নিজে কিন্তু মন্তব্য সম্পূর্ণভাবে বিশ্বাসী ছিল না। তদ্ব্যতীত, কেউ আমার উত্তরকে উজ্জীবিত করার সাহস করে নি, বা আমার উত্তরকেও নীচু করে দেখায়।

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

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

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

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

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

41
বোঝো: প্রশ্নের প্রথম শব্দটি নোট করুন। কেন এটি না বলা ভাল অনুশীলন? শুধু একটি মন্ত্র পুনরাবৃত্তি একটি জঘন্য জিনিস ব্যাখ্যা করে না।
আমার সঠিক মতামতটি

1
Java-monitor.com/forum/showthread.php?t=188 এ অন্য একটি মামলার ব্যাখ্যা দেওয়া হয়েছে যেখানে এটি সিস্টেম.gc () কল করা কীভাবে খারাপ অভ্যাস হতে পারে তা ব্যাখ্যা করেছে
শিরিষকুমার বারী

উত্তর:


243

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

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

এছাড়াও, এটি কিছু করার নিশ্চয়তা নেই। জেভিএম আপনার অনুরোধটিকে পুরোপুরি উপেক্ষা করতে পারে।

"এটি কী করবে তা আপনি জানেন না," "এটি এমনকি সাহায্য করবে কিনা তা আপনি জানেন না," এবং "আপনার এটি আর যাই হোক কল করার দরকার নেই" এর সংমিশ্রণের কারণেই লোকেরা সাধারণত এতটা দৃ in়তার সাথে বলছে যে আপনি এটি কল করা উচিত নয়। আমি মনে করি এটি "এটি ব্যবহার করা উচিত কিনা আপনার যদি জিজ্ঞাসার দরকার হয় তবে আপনার উচিত নয়"


অন্যান্য থ্রেড থেকে কয়েকটি উদ্বেগের সমাধান করার জন্য সম্পাদনা করুন :

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

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

এটি সম্ভব যে System.gc()কিছুই করতে পারে না তা দেখানোর জন্য , দেখুন:

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

এবং বিশেষত একটি- এক্সএক্স রয়েছে: ডিসপ্লে এক্সপ্লেক্সিজি ভি ভি বিকল্প।


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

2
@ জেনাক আপনি উদাহরণস্বরূপ ফাইনালাইজারগুলিতে সমালোচনামূলক কোড রেখেছেন (যা মূলত ভাঙা কোড)
মার্টিন

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

2
@ অ্যান্ড্রুজ্যাঙ্ক আমি বলব যে কোডগুলি যে আইটেমগুলিতে WeakReferenceআপনি ধরে রাখতে চান তার জন্য যে ব্যবহার করে সেগুলি শুরু থেকেই ভুল, আবর্জনা সংগ্রহ করা বা না ভুল। আপনার সাথে সি ++ তে একই সমস্যা থাকবে std::weak_ptr(যদিও আপনি জাভা সংস্করণে যতটা আগে বিষয়টিকে চূড়ান্তকরণের চূড়ান্তকরণের মতো স্থগিত করা হবে না তার চেয়ে আগে আপনি সি ++ সংস্করণে বিষয়টি লক্ষ্য করতে পারেন)।
জ্যাব

2
@rebeccah এটি একটি বাগ, তাই হ্যাঁ, আমি এটি অবশ্যই 'ভাঙ্গা' বলব। System.gc()এটিকে স্থির করে নেওয়ার বিষয়টি সত্যিকারের কোডিং অনুশীলন নয় a
স্টিভেন শ্লানস্কার

149

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

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

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

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

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

প্রথম কলটি করবে (আমরা পূর্বাভাস দিয়েছি) (live * W1 + garbage * W2) কাজ এবং অসামান্য আবর্জনা থেকে মুক্তি পাবে।

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

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

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

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


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

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


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

2
@ সেলসেক - আপনি যা বলছেন তা সত্য। যাইহোক, স্তরগুলির মধ্যে জিসি চালানো একটি ব্যান্ড-সহায়তা সমাধান ... এবং স্তরগুলি যদি পর্যাপ্ত পরিমাণে নেয় তবে যে কোনও স্তরের চলাকালীন আপনাকে জিসি চালানো দরকার তা যদি সমাধান না করে la আরও ভাল পন্থা হ'ল সামঞ্জস্যপূর্ণ (কম বিরতি) আবর্জনা সংগ্রহকারী ব্যবহার করা ... যদি প্ল্যাটফর্মটি সমর্থন করে।
স্টিফেন সি

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

@ কার্ক - "এলোমেলোভাবে সিস্টেম.gc এ কল করা () প্রায়শই উচ্চ জিসি ওভারহেডের ফলাফল করে।" । আমি জানি। যে কেউ আমার উত্তর পড়ে এবং বুঝতে পেরেছিল।
স্টিফেন সি

@ কির্ক - "আপনি কী বলতে চাইছেন তা পুরোপুরি নিশ্চিত নয় ..." - আমি এমন প্রোগ্রামগুলিকে বোঝাই যেখানে কোনও প্রোগ্রামের "সঠিক" আচরণ কোনও নির্দিষ্ট সময়ে চলমান জিসির উপর নির্ভর করে; যেমন চূড়ান্তকরণকারী কার্যকর করতে, বা WeKReferences বা সফ্টরাইফারেন্স ভাঙ্গতে। এটি করা সত্যিই খারাপ ধারণা ... তবে আমি এটিই বলছি। স্টিভেন শ্লানস্করের উত্তরও দেখুন।
স্টিফেন সি

47

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

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

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

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

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


3
মেমি ফাঁসের জন্য বিশ্লেষণ করার সময় GC এর জন্য +1। মনে রাখবেন যে হিপ ব্যবহার সম্পর্কিত তথ্য (রানটাইম.ফ্রিমেমোরি () এবং অন্যান্য।) জিসি জোর করার পরে কেবলমাত্র তাৎপর্যপূর্ণ, অন্যথায় এটি কখন নির্ভর করবে যখন সিস্টেম শেষবার কোনও জিসি চালানোর জন্য বিরক্ত করেছিল।
sleske

4
সিস্টেম.gc () এ কল করার কোনও ক্ষতি নেই কারণ এটির প্রয়োজন হতে পারে stop the worldএবং যদি ঘটে তবে এটি একটি আসল ক্ষতি
ব্যসটেস

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

জেটি প্রারম্ভের পরে System.gc () এ 2 কল করে এবং আমি খুব কমই এটির কোনও পার্থক্য দেখেছি।
কির্ক

ভাল জেটি বিকাশকারীদের একটি বাগ আছে। এটি একটি পার্থক্য করতে পারে ... পার্থক্য পরিমাণ নির্ধারণ করা কঠিন এমনকি যদি।
স্টিফেন সি

31

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

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

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

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

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

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


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

11

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

আপনি "System.gc" তে যে কোনও কিছু করতে বিশ্বাস করতে পারবেন না তা হ'ল অবিশ্বাস্যরকম হতাশাজনক এবং সহজেই "ভয়, অনিশ্চয়তা, সন্দেহ" ভাষাতে অনুভব করতে পারে।

অনেক ক্ষেত্রে মেমরির স্পাইকগুলির সাথে মোকাবিলা করা ভাল। যা আপনার কোনও গুরুত্বপূর্ণ ইভেন্ট হওয়ার আগেই উদ্দেশ্য নিয়ে ঘটেছিল, যার ফলে ব্যবহারকারীরা মনে করতে পারে যে আপনার প্রোগ্রামটি খারাপভাবে নকশা করা / প্রতিক্রিয়াহীন।

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

আমাকে এই থ্রেডের যুক্তি পর্যালোচনা করি।

  1. এটি অকার্যকর:

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

  1. এটি সর্বদা একটি খারাপ অনুশীলন এবং ভাঙা কোড নির্দেশ করে।

আমি একমত নই, আপনার কাছে আবর্জনা সংগ্রহকারী কী তা বিবেচ্য নয়। এর 'কাজটি আবর্জনা ট্র্যাক করা এবং এটি পরিষ্কার করা।

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

অবশ্যই, এটি আপনার পছন্দ মতো বা প্রত্যাশার সাথে আচরণ নাও করতে পারে তবে আপনি যখন এটি কল করতে চান তখন আপনি জানেন যে কিছুই হচ্ছে না, এবং ব্যবহারকারী আস্তে / ডাউনটাইম সহ্য করতে ইচ্ছুক। যদি সিস্টেম.gc কাজ করে, দুর্দান্ত! যদি তা না হয় তবে কমপক্ষে আপনি চেষ্টা করেছিলেন। কোনও আবর্জনা সংগ্রাহকের অন্তর্নিহিত পার্শ্ব প্রতিক্রিয়া না থাকলে কেবল কোনও নিচু দিক নেই a কোনও আবর্জনা সংগ্রহকারীকে ম্যানুয়ালি আহ্বান জানানো হলে কীভাবে আচরণ করা হয় এবং এটি নিজেই অবিশ্বাসের কারণ হয়ে দাঁড়ায় to

  1. এটি সাধারণ ব্যবহারের ঘটনা নয়:

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

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

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

এটি যেমন দাঁড়িয়ে আছে, জাভার জিসি প্রায়শই এমন দৈত্যের মতো মনে হয় যা আপনি বিশ্বাস করেন না। আপনি কখনই আসবেন বা কখন যাবেন তা আপনি জানেন না, এটি কী করতে চলেছে, কীভাবে এটি চলবে তা আপনি জানেন না। আমি প্রতি বিশেষজ্ঞদের ভিত্তিতে তাদের আবর্জনা সংগ্রহ কীভাবে কাজ করে সে সম্পর্কে আরও ভাল ধারণা রাখার কল্পনা করতে পারি, তবে বিশাল সংখ্যাগরিষ্ঠরা আশা করে এটি "কেবলমাত্র কাজ করে", এবং আপনার জন্য কাজ করার জন্য একটি অস্বচ্ছ-বোধকৃত অ্যালগরিদমকে বিশ্বাস করা হতাশাজনক।

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

সংক্ষিপ্তসার হিসাবে, উত্তরগুলির সাথে একটি অন্তর্নিহিত সমস্যা রয়েছে "এই বৈশিষ্ট্যটি কিছু করতে পারে না এবং আমি কখন কীভাবে এটি করব এবং কখন তা করবে না এবং কেন হবে না বা করবে না তা কীভাবে তা জানাতে হবে না into প্রায়শই বোঝাচ্ছে যে দর্শনের পক্ষে এটি করার চেষ্টা করা কেবল তার পিছনে উদ্দেশ্য যুক্তিযুক্ত হলেও "reasonable

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


9

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

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

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

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


1
System.gc () উল্লেখ করার জন্য +1 আউটঅফমিউরিআরার প্রতিরোধ করে না। কিছু লোক এটি বিশ্বাস করে।
সলেসকে

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

8

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

অনেক বছর আগে আমি একটি প্রতিবেদন জেনারেটরের উপর কাজ করি, এটি

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

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

প্রক্রিয়াটির উপরের রূপরেখার দিকে তাকালে এটি স্পষ্ট হয়।

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

অতএব স্পষ্টত একটি অনুরোধ সারি খালি ছিল যখন একটি জিসি রান করার সময় ভাল ছিল; এটির কোনও খারাপ দিক ছিল না।

প্রতিটি প্রতিবেদন ইমেল করার পরে এটি একটি জিসি রান করা উপযুক্ত হতে পারে, কারণ আমরা জানি যে এটি একটি জিসি রানের জন্য ভাল সময়। তবে কম্পিউটারে যথেষ্ট পরিমাণে র‌্যাম থাকলে জিসি রানটি বিলম্ব করে আরও ভাল ফলাফল পাওয়া যেত।

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

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

তবে, পরিষ্কার হয়ে উঠুন, উপরোক্ত কোনও সাধারণ ঘটনা নয়।


3

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


1
এটি হতে পারে। তবে যদি অ্যাকলিপস বা নেটবিয়ানগুলি System.gc()পর্যায়ক্রমে কল করার জন্য প্রোগ্রাম করা হয় তবে আপনি সম্ভবত আচরণটি বিরক্তিকর মনে করতে পারেন।
স্টিফেন সি

2

প্রথমত, অনুমান এবং বাস্তবের মধ্যে পার্থক্য রয়েছে। অনুমানটি বলছে যে System.gc () হ'ল একটি ইঙ্গিত যা জিসি চালানো উচিত এবং ভিএম এটিকে উপেক্ষা করতে মুক্ত। বাস্তবতাটি হ'ল, ভিএম কখনও কখনও System.gc () এ কল করতে পারে না

কল করা জিসি কলটিতে একটি অপ্রয়োজনীয় ওভারহেডের সাথে আসে এবং আপনি যদি সময়মতো কিছু এলোমেলো সময়ে করেন তবে সম্ভবত আপনি আপনার প্রচেষ্টার জন্য কোনও পুরস্কার পাবেন না। অন্যদিকে, একটি প্রাকৃতিক ট্রিগারযুক্ত সংগ্রহ কলটির ব্যয় পুনরুদ্ধার করতে খুব সম্ভবত। আপনার কাছে যদি এমন তথ্য থাকে যা ইঙ্গিত দেয় যে আপনি সিস্টেম.gc () এ কল করতে পারেন তার চেয়ে একটি জিসি চালানো উচিত এবং আপনার সুবিধাগুলি দেখতে হবে। তবে এটি আমার অভিজ্ঞতা যে এটি কেবলমাত্র কয়েকটি প্রান্তের ক্ষেত্রে ঘটে কারণ এটি কখনই এবং যখন System.gc () কল করা উচিত তা বোঝার জন্য আপনার যথেষ্ট তথ্য থাকবে না very

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


3
"বাস্তবতাটি হ'ল, ভিএম কখনও কখনও System.gc () এ কল করতে হবে না।" - ত্রুটিপূর্ণ. -এক্সএক্স সম্পর্কে পড়ুন: -অর্থ্য এক্সপ্লেক্সিজিসি।
স্টিফেন সি

1

হ্যাঁ, System.gc () এ কল করা গ্যারান্টি দেয় না যে এটি চলবে, এটি জেভিএমের কাছে অনুরোধ যা উপেক্ষা করা যেতে পারে। দস্তাবেজগুলি থেকে:

জিসি পদ্ধতিতে কল করার পরামর্শ দেয় যে জাভা ভার্চুয়াল মেশিন অব্যবহৃত অবজেক্টগুলিকে পুনর্ব্যবহার করার দিকে প্রচেষ্টা ব্যয় করে

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

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


<স্ট্রোক> তবে জাভাডোক থেকেও: _ যখন পদ্ধতি কল থেকে নিয়ন্ত্রণ ফিরে আসে তখন ভার্চুয়াল মেশিন সমস্ত বাতিল হওয়া বস্তুগুলিকে পুনর্ব্যক্ত করার জন্য যথাসাধ্য চেষ্টা করেছে, যা আমি আপনাকে পোস্ট করেছি তার আরও আবশ্যক রূপ হিসাবে দেখছি <</ স্ট্রোক > এটি স্ক্রু করুন, এটি বিভ্রান্তিকর হচ্ছে সম্পর্কে একটি বাগ রিপোর্ট আছে। যার মধ্যে আরও ভাল জানেন, জেভিএমকে ইঙ্গিত করার ক্ষতিকারকগুলি কী কী?
জিনাক করুন

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

দ্বিমত পোষণের জন্য তবে ওপেনজেডিকে সিস্টেম.gc () কল করা এবং এর উপর ভিত্তি করে যে কোনও কিছু (উদাহরণস্বরূপ এইচপি) সর্বদা আবর্জনা সংগ্রহের চক্রের ফলস্বরূপ। বস্তুত এছাড়াও আইবিএম এর J9 বাস্তবায়ন প্রকৃত মনে হচ্ছে যে
কার্ক

@ কিরক - ভুল: গুগল, এবং -এক্সএক্স সম্পর্কে পড়ুন: -ডিজিয়েবলএক্সপ্লিক্টজিসি।
স্টিফেন সি

0

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

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

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

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


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

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

  3. জাভা একটি ভিন্ন পদ্ধতির গ্রহণ; এটি স্বয়ংক্রিয়ভাবে আপনার জন্য অবনতি পরিচালনা করে।
  4. যে কৌশলটি এটি সম্পাদন করে তাকে আবর্জনা সংগ্রহ বলা হয়। এটি এটির মতো কাজ করে: যখন কোনও বস্তুর কোনও রেফারেন্স উপস্থিত থাকে না, তখন সেই বস্তুর আর প্রয়োজন হয় না বলে ধরে নেওয়া হয় এবং অবজেক্টের দ্বারা দখল করা স্মৃতি পুনরুদ্ধার করা যায়। সি ++ এর মতো জিনিসগুলি ধ্বংস করার কোনও সুস্পষ্ট প্রয়োজন নেই।
  5. আপনার প্রোগ্রামটি কার্যকর করার সময় আবর্জনা সংগ্রহ কেবল বিক্ষিপ্তভাবে ঘটে (যদি তা হয়)।
  6. এটি কেবলমাত্র ঘটবে না কারণ এক বা একাধিক অবজেক্ট বিদ্যমান যা আর ব্যবহার করা হয় না।
  7. তদ্ব্যতীত, বিভিন্ন জাভা রান-টাইম বাস্তবায়নগুলি আবর্জনা সংগ্রহের ক্ষেত্রে বিভিন্ন পদ্ধতি গ্রহণ করবে, তবে বেশিরভাগ ক্ষেত্রে, আপনার প্রোগ্রামগুলি লেখার সময় আপনার এটি সম্পর্কে চিন্তাভাবনা করা উচিত নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.