বড় অবজেক্ট হিপ ফ্র্যাগমেন্টেশন


97

আমি যে সি # /। নেট অ্যাপ্লিকেশনটিতে কাজ করছি তা ধীর মেমরি ফাঁস হয় from আমি কী ঘটছে তা নির্ধারণের জন্য এসওএসের সাথে সিডিবি ব্যবহার করেছি তবে ডেটাটি কোনও বোধগম্য বলে মনে হচ্ছে না তাই আমি আশা করছি যে আপনারা কেউ এর আগেও এটি অনুভব করেছেন।

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

0:000> !DumpHeap 000000005b5b1000  000000006351da10
         Address               MT     Size
...
000000005d4f92e0 0000064280c7c970 16147872
000000005e45f880 00000000001661d0  1901752 Free
000000005e62fd38 00000642788d8ba8     1056       <--
000000005e630158 00000000001661d0  5988848 Free
000000005ebe6348 00000642788d8ba8     1056
000000005ebe6768 00000000001661d0  6481336 Free
000000005f214d20 00000642788d8ba8     1056
000000005f215140 00000000001661d0  7346016 Free
000000005f9168a0 00000642788d8ba8     1056
000000005f916cc0 00000000001661d0  7611648 Free
00000000600591c0 00000642788d8ba8     1056
00000000600595e0 00000000001661d0   264808 Free
...

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

এছাড়াও নোট করুন যে হিপ সেগমেন্টটি ডাম্প করার সময় সিডিবি প্রকারের প্রতিবেদন করছে না: আমি নিশ্চিত না যে এটি সম্পর্কিত কিনা। যদি আমি চিহ্নিত (<-) অবজেক্টটি ডাম্প করি তবে সিডিবি / এসওএস এটি ঠিক আছে:

0:015> !DumpObj 000000005e62fd38
Name: System.Object[]
MethodTable: 00000642788d8ba8
EEClass: 00000642789d7660
Size: 1056(0x420) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Type: System.Object
Fields:
None

অবজেক্ট অ্যারের উপাদানগুলি সমস্ত স্ট্রিং এবং স্ট্রিংগুলি আমাদের অ্যাপ্লিকেশন কোড হিসাবে স্বীকৃত।

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

সুতরাং, আমি এটির খুব প্রশংসা করব যদি কেউ এই ছোট (<85 কে) অবজেক্ট অ্যারেগুলি LOH- এ কেন শেষ করছে: কোন পরিস্থিতিতে। নেট সেখানে একটি ছোট বস্তুর অ্যারে রাখবে? এছাড়াও, এই বিষয়গুলির শিকড় নির্ধারণের বিকল্প উপায় সম্পর্কে কি কেউ জানতে পারে?


আপডেট 1

আমি গতকাল দেরী করে নিয়ে এসেছি এমন অন্য তত্ত্বটি হ'ল এই অবজেক্ট অ্যারেগুলি বড় আকারের শুরু হয়েছিল তবে মেমরির ডাম্পগুলিতে স্পষ্ট ফ্রি মেমরির ব্লকগুলি রেখে সঙ্কুচিত হয়ে গেছে। যা আমাকে সন্দেহজনক করে তোলে তা হল বস্তুর অ্যারেগুলি সর্বদা 1056 বাইট দীর্ঘ (128 উপাদান), রেফারেন্সের জন্য 128 * 8 এবং ওভারহেডের 32 বাইট হিসাবে উপস্থিত হয়।

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


আপডেট 2

ব্রায়ান রাসমুসেনকে (গৃহীত উত্তর দেখুন) ধন্যবাদ, স্ট্রিং ইন্টার্ন টেবিলের কারণে সমস্যাটি এলওএইচের খণ্ডন হিসাবে চিহ্নিত হয়েছে! এটি নিশ্চিত করার জন্য আমি একটি দ্রুত পরীক্ষার আবেদন লিখেছি:

static void Main()
{
    const int ITERATIONS = 100000;

    for (int index = 0; index < ITERATIONS; ++index)
    {
        string str = "NonInterned" + index;
        Console.Out.WriteLine(str);
    }

    Console.Out.WriteLine("Continue.");
    Console.In.ReadLine();

    for (int index = 0; index < ITERATIONS; ++index)
    {
        string str = string.Intern("Interned" + index);
        Console.Out.WriteLine(str);
    }

    Console.Out.WriteLine("Continue?");
    Console.In.ReadLine();
}

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

দ্বিতীয় লুপে, অনন্য স্ট্রিংগুলি তৈরি এবং ইন্টার্ন করা হয়। এই ক্রিয়াকলাপটি তাদের অভ্যন্তরীণ টেবিলে শিকড় দেয়। আমি যা বুঝতে পারি নি তা হ'ল ইন্টার্ন টেবিলটি কীভাবে উপস্থাপন করা হয়। এটিতে পৃষ্ঠাগুলির একটি সেট রয়েছে - 128 স্ট্রিং উপাদানগুলির অবজেক্ট অ্যারে - যা এলওএইচে তৈরি করা হয়। এটি সিডিবি / এসওএস-তে আরও স্পষ্ট:

0:000> .loadby sos mscorwks
0:000> !EEHeap -gc
Number of GC Heaps: 1
generation 0 starts at 0x00f7a9b0
generation 1 starts at 0x00e79c3c
generation 2 starts at 0x00b21000
ephemeral segment allocation context: none
 segment    begin allocated     size
00b20000 00b21000  010029bc 0x004e19bc(5118396)
Large object heap starts at 0x01b21000
 segment    begin allocated     size
01b20000 01b21000  01b8ade0 0x00069de0(433632)
Total Size  0x54b79c(5552028)
------------------------------
GC Heap Size  0x54b79c(5552028)

এলওএইচ বিভাগের ডাম্প গ্রহণ করা ফুটোয় প্রয়োগে যে প্যাটার্নটি দেখেছি তা প্রকাশ করে:

0:000> !DumpHeap 01b21000 01b8ade0
...
01b8a120 793040bc      528
01b8a330 00175e88       16 Free
01b8a340 793040bc      528
01b8a550 00175e88       16 Free
01b8a560 793040bc      528
01b8a770 00175e88       16 Free
01b8a780 793040bc      528
01b8a990 00175e88       16 Free
01b8a9a0 793040bc      528
01b8abb0 00175e88       16 Free
01b8abc0 793040bc      528
01b8add0 00175e88       16 Free    total 1568 objects
Statistics:
      MT    Count    TotalSize Class Name
00175e88      784        12544      Free
793040bc      784       421088 System.Object[]
Total 1568 objects

নোট করুন যে অবজেক্ট অ্যারের আকার 528 (1056 এর চেয়ে বেশি) কারণ আমার ওয়ার্কস্টেশনটি 32 বিট এবং অ্যাপ্লিকেশন সার্ভারটি 64 বিট। অবজেক্ট অ্যারেগুলি এখনও 128 টি উপাদান দীর্ঘ।

সুতরাং এই গল্পের নৈতিক হ'ল খুব যত্নশীল ইন্টার্ন করা উচিত। আপনি যে স্ট্রিংটি ইন্টার্ন করছেন তা যদি কোনও সসীম সেটের সদস্য হিসাবে পরিচিত না হয় তবে আপনার আবেদনটি কমপক্ষে সিএলআর এর 2 সংস্করণে, এলওএইচ খণ্ডিত হওয়ার কারণে ফাঁস হবে।

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


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

4
আমি সম্মত, দুর্দান্ত প্রশ্ন। আমি উত্তর খুঁজছি হবে।
চার্লি ফুল ২

4
অনেক আগ্রহব্যাঞ্জক. মনে হচ্ছে ডিবাগ করতে বেশ সমস্যা হয়েছে!
ম্যাট জর্ডান

উত্তর:


47

সিএলআর কয়েকটি বস্তুর প্রাকলোকট করতে LOH ব্যবহার করে (যেমন ইন্টার্নযুক্ত স্ট্রিংয়ের জন্য ব্যবহৃত অ্যারে ) । এর মধ্যে কয়েকটি 85000 বাইটের চেয়ে কম এবং সাধারণত এলওএইচ-তে বরাদ্দ হবে না।

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

এছাড়াও কিছুটা রহস্যজনক অপ্টিমাইজেশনের কারণে, double[]1000 বা ততোধিক উপাদানকেও LOH এ বরাদ্দ করা হয়।


সমস্যাযুক্ত বস্তুগুলি হ'ল অবজেক্ট [] এর স্ট্রিংগুলিতে রেফগুলি রয়েছে যা আমি জানি অ্যাপ কোড দ্বারা তৈরি করা হয়েছে। এর দ্বারা বোঝা যাচ্ছে অ্যাপটি বস্তুর [] গুলি তৈরি করছে (আমি এর প্রমাণ দেখতে পাচ্ছি না) বা সিএলআর এর কিছু অংশ (যেমন সিরিয়ালাইজেশন) অ্যাপ্লিকেশন অবজেক্টগুলিতে কাজ করতে তাদের ব্যবহার করছে।
পল রুয়ান

4
এটি অভ্যন্তরীণ স্ট্রিংয়ের জন্য ব্যবহৃত অভ্যন্তরীণ কাঠামো হতে পারে। আরও তথ্যের জন্য দয়া করে এই প্রশ্নের জন্য আমার উত্তরটি যাচাই করুন: স্ট্যাকওভারফ্লো
ব্রায়ান রাসমুসেন ২

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

4
85000 বাইট বা 84 * 1024 = 87040 বাইট?
পিটার মর্টেনসেন

4
85000 বাইট। আপনি এটি 85000-12 (দৈর্ঘ্যের আকার, এমটি, সিঙ্ক ব্লক) এর বাইট অ্যারে তৈরি GC.GetGenerationকরে এবং উদাহরণটিতে কল করে যাচাই করতে পারেন । এটি Gen2 ফিরিয়ে দেবে - এআইপিআই Gen2 এবং LOH এর মধ্যে পার্থক্য করে না। অ্যারেটিকে একটি বাইট আরও ছোট করুন এবং এপিআই Gen0 প্রদান করবে।
ব্রায়ান রাসমুসেন

13

.NET ফ্রেমওয়ার্ক ৪.৫.১, জঞ্জাল সংগ্রহের সময় স্পষ্টভাবে বৃহত অবজেক্ট হিপ (এলওএইচ) সংযোগ করার ক্ষমতা রাখে।

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

জিসিএসেটিটিং-এ আরও তথ্য দেখুন ar


2

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

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

এবং সুতরাং আপনার সমস্যাটি আমার কাছে যে ধারণাটি ঘটেছিল এটির পক্ষে এটি বেশ ভাল প্রত্যাবর্তন হিসাবে প্রতীয়মান হবে - এর ফলে LOH এর বিভাজন ঘটে।

সংক্ষিপ্তসার: আপনার সমস্যা পারে এলওএইচ এবং প্রজন্ম 2 একই স্তূপ অঞ্চলে ভাগ করে বোঝানো পারে, যদিও এটি কোনও কারণেই প্রমাণ নয় যে এটি ব্যাখ্যা the

আপডেট: আউটপুট !dumpheap -statবেশ তাত্পর্য এই তত্ত্ব জল থেকে বাহির! প্রজন্মের 2 এবং এলওএইচের নিজস্ব অঞ্চল রয়েছে।


প্রতিটি স্তূপ তৈরির বিভাগগুলি দেখানোর জন্য eeheap ব্যবহার করুন। জেনারেল 0 এবং জেনার 1 একটি বিভাগে থাকে (একই বিভাগে), জেনার 2 এবং এলওএইচ উভয়ই একাধিক বিভাগ বরাদ্দ করতে পারে তবে প্রতিটি স্তূপের জন্য বিভাগগুলি পৃথক থেকে যায়।
পল রুয়ান

হ্যাঁ, দেখেছি, ধন্যবাদ। কেবলমাত্র eeheaps কমান্ডটি উল্লেখ করতে চেয়েছিলেন কারণ এটি এই আচরণটি আরও পরিষ্কারভাবে দেখায়।
পল রুয়ান

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

আরও আকর্ষণীয় প্রশ্ন হ'ল। নেট কেন doubleজিসি টুইট করার চেয়ে এলওএইচ-তে 1000 টিরও বেশি উপাদানকে অ্যারে রাখে যাতে তারা 8-বাইট সীমানায় রেখেছে তা নিশ্চিত করতে। প্রকৃতপক্ষে, এমনকি 32-বিট সিস্টেমেও আমি আশা করব ক্যাশে আচরণের কারণে, সমস্ত বরাদ্দযুক্ত আকারের 8 বাইটের প্রান্তিককরণের জন্য 8-বাইট প্রান্তিককরণ চাপিয়ে দেওয়া সম্ভবত পারফরম্যান্সের জয়। অন্যথায়, যখন double[]ক্যাশে-অ্যালাইন্টেড একটি ভারী-ব্যবহৃত of
সুপারক্যাট

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

1

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

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

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


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


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

1

দুর্দান্ত প্রশ্ন, আমি প্রশ্নগুলি পড়ে শিখেছি।

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

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

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


1

এখানে উপায়ে সঠিক চিহ্নিত করা দম্পতি আছে কল-স্ট্যাক এর Loh বরাদ্দ।

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


এখানে পিন করা কেন সাহায্য করবে তা আমি দেখতে পাচ্ছি না? এলওএইচ-তে বিটিডাব্লু বড় অবজেক্টগুলি যাইহোক GC দ্বারা সরানো হয় না। যদিও এটি একটি বাস্তবায়ন বিশদ।
ব্যবহারকারী 492238

1

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