System.gc () কখন কিছু করে?


118

আমি জানি যে জঞ্জায় আবর্জনা সংগ্রহ স্বয়ংক্রিয়ভাবে করা। তবে আমি বুঝতে পেরেছি আপনি যদি আপনার System.gc()কোডটিতে কল করেন যে JVM সেই সময়ে আবর্জনা সংগ্রহের সিদ্ধান্ত নিতে পারে বা নাও পারে। এটি কীভাবে সুনির্দিষ্টভাবে কাজ করে? কোন ভিত্তিতে / পরামিতিগুলির ভিত্তিতে জেভিএম জিসি দেখলে সঠিকভাবে সিদ্ধান্ত নেয় (বা না করে) System.gc()?

এমন কোনও উদাহরণ রয়েছে যা ক্ষেত্রে এটি আপনার কোডে রাখাই ভাল ধারণা?


4
এখানে সম্পূর্ণ বিশদ সম্পর্কিত একটি ধারণার জটিল, তবে এই নিবন্ধটি আপনাকে সহায়তা করা উচিত: chaoticjava.com/posts/how-does-garbage-collection-work
GEOCHET

সঠিক আচরণটি জেভিএম অর্থাৎ বাস্তবায়ন নির্ভর dependent
থোরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


59

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

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


3
আপনি জোকনসোলে জঞ্জাল সংগ্রহ করতে বাধ্য করতে পারেন
ওয়াল্ডভোগেল

25
@ বেন আপনি কি সত্যিই "জোর" করতে পারেন? Jconsole কি কেবল System.gc () কল করছে?
জন মেঘের

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

30

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


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

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

26

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন গ্যারান্টি দেয় না যে আপনি কল করার সময় JVM একটি জিসি শুরু করবে System.gc()। এটি এর কারণ "এই মুহূর্তে একটি জিসি করার সিদ্ধান্ত নিতে পারে বা নাও পারে"।

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

অন্য কিছু উত্তরে জে কনসোল বা ভিজ্যুয়ালভিএম-এ জিসি শুরু করার উল্লেখ রয়েছে। মূলত, এই সরঞ্জামগুলিতে একটি রিমোট কল করেSystem.gc()

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

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


26

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

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


17

আপনি কল করলে আপনার খুব যত্নবান হওয়া দরকার System.gc()। এটিকে কল করা আপনার আবেদনে অপ্রয়োজনীয় পারফরম্যান্সের সমস্যাগুলি যুক্ত করতে পারে এবং এটি আসলে কোনও সংগ্রহ সম্পাদন করার গ্যারান্টিযুক্ত নয়। System.gc()জাভা আর্গুমেন্টের মাধ্যমে স্পষ্টত অক্ষম করা সম্ভব -XX:+DisableExplicitGC

আবর্জনা সংগ্রহের বিষয়ে গভীরতার জন্য বিশদ বিবরণের জন্য আমি জাভা হটস্পট আবর্জনা সংগ্রহে প্রাপ্ত নথিগুলি পড়ার জন্য অত্যন্ত পরামর্শ দিচ্ছি ।


আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশন সর্বদা আমাকে একটি আউটআফ মেমরিএক্সেপশন ছুড়ে দেয়। সুতরাং আমি সমস্ত অযাচিত তথ্যসূত্র এবং অবজেক্টগুলি সাফ করার জন্য আমার ক্লাসের অনডাস্ট্রয়ে ফাংশনে System.gc () ব্যবহার করার কথা ভাবছিলাম। এটি কি ভাল পন্থা
সাগর দেবগা

2
@ সাগর দেবঙ্গা আপনার বর্ণনা অনুসারে জিসি কে ম্যানুয়ালি কল করা সাহায্য করার সম্ভাবনা কম। কোনও ওওএম নিক্ষেপ করার আগে, জেভিএম ইতিমধ্যে মেমরি মুক্ত করার জন্য আবর্জনা সংগ্রহের চেষ্টা করবে
স্ক্রাব্বি

10

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

ম্যানুয়াল সংগ্রহ কখন জারি করবেন, কেবলমাত্র যখন আপনি এটি করতে চান তখনই আপনি যখন ছোট সংগ্রহগুলির বোঝা সমৃদ্ধ একটি বৃহত সংগ্রহটি ত্যাগ করেন - Map<String,<LinkedList>> উদাহরণস্বরূপ - এবং আপনি চেষ্টা করতে চান এবং তারপর পারফেক্ট হিট নিতে চান এবং সেখানে, তবে বেশিরভাগ অংশের জন্য, আপনার এটি নিয়ে চিন্তা করা উচিত নয়। দুর্ভাগ্যজনকভাবে - বেশিরভাগ সময় জিসি আপনার চেয়ে ভাল জানেন।


8

আপনি যদি সরাসরি মেমোরি বাফার ব্যবহার করেন, আপনি সরাসরি স্মৃতিশক্তি কম রাখছেন তা সত্ত্বেও জেভিএম আপনার জন্য জিসি চালায় না।

আপনি যদি কল করেন ByteBuffer.allocateDirect()এবং যদি আপনি একটি আউটআফমিউরিওর পেয়ে থাকেন তবে আপনি নিজেই জিসিকে ট্রিগার করার পরে এই কলটি ঠিক আছে।


আপনি কি বলছেন যে System.gc () সরাসরি বরাদ্দ সংগ্রহ করে যেখানে জেভিএম সাধারণত (OOM নিক্ষেপের আগে) না করে। কারণ আমি মনে করি এটি ভুল। এক্সপ্লিটিট জিসির পরে একটি বরাদ্দ এগিয়ে যাওয়ার একমাত্র কারণ হ'ল অতিরিক্ত সময় এবং চূড়ান্তকরণকারী মৌমাছির মুক্ত (এবং কিছু সরাসরি বরাদ্দকৃত অবজেক্টকে মুক্ত করে) একটি ইন-হিপ অবজেক্টের আরও কিছু বিস্মৃততা।
13:53 এ 1

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

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

5

বেশিরভাগ জেভিএম একটি জিসি ছাড়বে (-এক্সএক্স: ডায়াবেবল এক্সপ্লেক্সিজিসি এবং-এক্সএক্স: + এক্সপ্রেসেটজিসিআইএনভিক্স কনভারেন্ট স্যুইচ) এর উপর নির্ভর করে। তবে পরে আরও কার্যকর বাস্তবায়ন করার জন্য স্পেসিফিকেশনটি কম কম সংজ্ঞায়িত করা হয়েছে।

বৈশিষ্টটির স্পষ্টতা দরকার: বাগ # 6668279: (spec) System.gc () নির্দেশ করা উচিত যে আমরা ব্যবহারের প্রস্তাব দিই না এবং আচরণের গ্যারান্টি দিচ্ছি না

অভ্যন্তরীণভাবে জিসি পদ্ধতিটি আরএমআই এবং এনআইও ব্যবহার করে এবং তাদের জন্য সিঙ্ক্রোনাস এক্সিকিউশন প্রয়োজন যা বর্তমানে: এটি আলোচনায় রয়েছে:

বাগ # 5025281: System.gc () কে সমবর্তী (ট্রিপ-দ্য ওয়ার্ল্ড নয়) পূর্ণ সংগ্রহগুলি ট্রিগার করতে অনুমতি দিন


3

Garbage Collectionভাল Java, যদি আমরা ডেস্কটপ / ল্যাপটপ / সার্ভারে জাভায় কোডেড সফটওয়্যার চালাচ্ছি। আপনি কল করতে পারেন System.gc()বা Runtime.getRuntime().gc()ভিতরে Java

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

আমি বিশ্বাস করি, অ্যান্ড্রয়েডের ক্ষেত্রেও এটি একই প্রযোজ্য। তবে এটি আপনার সিস্টেমকে ধীর করে দিতে পারে।


জেভিএম এর জন্য সময় থাকলে জিসিএম চালাত : সর্বদা সত্য নয়, ইডেন স্মৃতি পূর্ণ হলে জভিএম জিসি চালাতে পারে।
অ্যাডেলমোহেইমেন

2

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

তবে, আমি মনে করি যে আমি এমন কোনও মামলার মুখোমুখি হয়েছি যেখানে এটি প্রাসঙ্গিক হতে পারে। যদিও আমি নিশ্চিত নই, যেহেতু আমি এখনও পরীক্ষা করে দেখেছি এর কোনও প্রভাব আছে কিনা:

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


2

আমরা কখনই জঞ্জাল সংগ্রহ করতে বাধ্য করতে পারি না। System.gc কেবল আবর্জনা সংগ্রহের জন্য ভিএমকে পরামর্শ দিচ্ছে, তবে যান্ত্রিক প্রক্রিয়াটি ঠিক কী সময় চালায়, কেউ জানে না, এটি জেএসআর স্পেসিফিকেশন দ্বারা বর্ণিত।


2

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

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

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

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

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


2

আপনার System.gc()যদি ফোন করা হয় কিনা তা জানতে চাইলে , জেভিএম আবর্জনা সংগ্রহ সম্পাদন করে আপনি নতুন জাভা 7 আপডেট 4 দিয়ে বিজ্ঞপ্তি পেতে পারেন।

আমি 100% নিশ্চিত নই যে আবর্জনা সংযোগকারী এমএক্সবিয়ান বর্গটি জাভা 7 আপডেট 4 তে প্রবর্তিত হয়েছিল, কারণ আমি এটি প্রকাশের নোটগুলিতে খুঁজে পাইনি, তবে আমি জাভেপারফরম্যান্টিং .কম সাইটে তথ্যটি পেয়েছি


0

সুস্পষ্ট জিসি চালানো ভাল হলে আমি একটি নির্দিষ্ট উদাহরণের কথা ভাবতে পারি না।

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

বিকল্পভাবে হিপ অ্যানালাইজারের সাথে গাদা হয়ে যাওয়ার পরে এবং যদি আপনি কোনও লাইব্রেরির উপাদানকে স্পষ্টত জিসির কল করতে সন্দেহ করেন তবে আপনি এটি যুক্ত করে বন্ধ করতে পারেন: জিসি =-এক্সএক্স: + জেভিএম প্যারামিটারগুলিতে অক্ষম এক্সপ্লেক্সিজিসি।


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

0

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


নোট: চূড়ান্তকরণ চালানোর জন্য বাধ্য করার জন্য একটি নিজস্ব পদ্ধতি রয়েছে। (সমস্যাটি আসলে চূড়ান্তকরণকারীদের চালানোর ক্ষেত্রে নয় তবে বুঝতে পারে যে কোনও বিষয়টিকে চূড়ান্ত করা যেতে পারে কারণ এটি
অনর্থিত

-1

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

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