কয়েক মিলিয়ন ছোট অস্থায়ী বস্তু তৈরির জন্য সেরা অনুশীলন


109

কয়েক মিলিয়ন ছোট ছোট বস্তু তৈরি করার (এবং প্রকাশ করার জন্য) "সেরা অনুশীলনগুলি" কী কী?

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

  1. আবর্জনা সংগ্রহের ওভারহেড হ্রাস করুন এবং
  2. নিম্ন-প্রান্তের সিস্টেমগুলির জন্য পিক মেমরির পদচিহ্ন হ্রাস করুন।

বেশিরভাগ অবজেক্ট খুব স্বল্প-কালীন, তবে উত্পন্ন পদক্ষেপের প্রায় 1% স্থায়ী মান হিসাবে স্থির থাকে এবং ফিরে আসে, সুতরাং যে কোনও পুলিং বা ক্যাশিংয়ের কৌশল নির্দিষ্ট নির্দিষ্ট অবজেক্টগুলিকে পুনরায় ব্যবহার থেকে বাদ দেওয়ার ক্ষমতা সরবরাহ করতে হবে would ।

আমি উদাহরণস্বরূপ পুরোপুরি সজ্জিত হওয়ার আশা করি না তবে আমি আরও পড়া / গবেষণা বা অনুরূপ প্রকৃতির ওপেন সোর্স উদাহরণগুলির জন্য পরামর্শগুলির প্রশংসা করব।


11
ফ্লাইওয়েট প্যাটার্নটি কি আপনার ক্ষেত্রে উপযুক্ত হবে? en.wikedia.org/wiki/ ফ্লাইওয়েট_প্যাটার্ন
রজার রোল্যান্ড

4
আপনার কি এটি কোনও বস্তুতে আবদ্ধ করতে হবে?
nhahtdh

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

2
অত্যন্ত বাঞ্ছনীয় পড়ুন: cs.virginia.edu/kim/publicity/pldi09tutorials/...
rkj

উত্তর:


47

ভার্জোজ আবর্জনা সংগ্রহের মাধ্যমে অ্যাপ্লিকেশনটি চালান:

java -verbose:gc

এবং এটি কখন সংগ্রহ করবে তা আপনাকে বলবে। সুইপ দুটি ধরণের হবে, একটি দ্রুত এবং একটি সম্পূর্ণ ঝাড়ু।

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

তীরটি আকারের আগে এবং পরে হয়।

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

জাভা এসই 6 হটস্পট ভার্চুয়াল মেশিন আবর্জনা সংগ্রহের টিউন পড়া সম্ভবত সহায়ক।


পুরো আবর্জনা সংগ্রহ বিরল এমন পয়েন্টটি খুঁজতে চেষ্টা করার জন্য জাভা হ্যাপের আকার নিয়ে পরীক্ষা করুন। জাভা 7-তে নতুন জি 1 জিসি কিছু ক্ষেত্রে দ্রুত (এবং অন্যদের তুলনায় ধীর) is
মাইকেল শপসিন

21

সংস্করণ 6 থেকে, জেভিএমের সার্ভার মোডে একটি পালানোর বিশ্লেষণ কৌশল ব্যবহার করে। এটি ব্যবহার করে আপনি একসাথে জিসি এড়াতে পারবেন।


1
এস্কেপ বিশ্লেষণ প্রায়শই হতাশ হয়, আপনি কী করছেন বা করছেন না তা জেভিএম আবিষ্কার করেছে কি না তা পরীক্ষা করা উচিত।
নিতসান ওয়াকার্ট

2
আপনার যদি এই বিকল্পগুলি ব্যবহার করার অভিজ্ঞতা হয়: -এক্সএক্স: + মুদ্রণপ্রেরণশিক্ষা অ্যানালাইসিস এবং-এক্সএক্স: + মুদ্রণপরিবর্তনআলোকেশন। এটি ভাগ করে নেওয়া দুর্দান্ত হবে। কারণ আমি বলছি না, সত্যি বলতে।
মিখাইল

স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 9032519/ … দেখুন আপনার জেডিকে 7 এর জন্য একটি ডিবাগ বিল্ড পেতে হবে, আমি স্বীকার করি যে আমি এটি করিনি তবে জেডিকে 6 দিয়ে এটি সফল হয়েছে।
নিতসন ওয়াকার্ট

19

ঠিক আছে, এখানে একটিতে বেশ কয়েকটি প্রশ্ন রয়েছে!

1 - স্বল্প-স্থায়ী জিনিসগুলি কীভাবে পরিচালিত হয়?

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

নোট করুন যে আমরা সেই বস্তুর কথা বলছি যা মূল স্মৃতিতে পৌঁছেছে (হিপ)। এই সবসময় তা হয় না। আপনার তৈরি অনেকগুলি বস্তু এমনকি সিপিইউ রেজিস্টার ছাড়বে না। উদাহরণস্বরূপ, এই লুপটি বিবেচনা করুন

for(int i=0, i<max, i++) {
  // stuff that implies i
}

আসুন লুপ আন্রোলিং সম্পর্কে ভাবেন না (এমন একটি প্রত্যাশা যা জেভিএম আপনার কোডটিতে ভারীভাবে সম্পাদন করে)। যদি maxএর সমান হয় তবে Integer.MAX_VALUEলুপটি কার্যকর করতে কিছুটা সময় নিতে পারে। তবে iভেরিয়েবল কখনই লুপ-ব্লক থেকে বাঁচতে পারে না। অতএব জেভিএম সেই পরিবর্তনশীলটিকে সিপিইউ রেজিস্ট্রারে রাখবে, নিয়মিতভাবে বাড়িয়ে দেবে তবে কখনও এটিকে মূল স্মৃতিতে ফেরত পাঠাবে না।

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

2 - জিসির ওভারহেড হ্রাস করতে এটি কার্যকর?

যথারীতি এটি নির্ভর করে।

প্রথমে, আপনার কী চলছে তা সম্পর্কে একটি পরিষ্কার দৃষ্টিভঙ্গি রাখতে জিসি লগিং সক্ষম করা উচিত। আপনি এটি দিয়ে সক্ষম করতে পারেন-Xloggc:gc.log -XX:+PrintGCDetails

যদি আপনার অ্যাপ্লিকেশনটি একটি জিসি চক্রটিতে প্রচুর সময় ব্যয় করে, তবে, হ্যাঁ, জিসি টিউন করুন, অন্যথায়, এটি সত্যিই উপযুক্ত হবে না।

উদাহরণস্বরূপ, যদি আপনার প্রতি 100 মিমিতে একটি তরুণ জিসি থাকে যা 10 মিমি নিয়ে থাকে তবে আপনি আপনার সময়টির 10% জিসিতে ব্যয় করেন এবং আপনার প্রতি সেকেন্ডে 10 সংগ্রহ রয়েছে (যা হুউউইউজ)। এই জাতীয় ক্ষেত্রে, আমি জিসি টিউনিংয়ে কোনও সময় ব্যয় করব না, যেহেতু সেই 10 জিসি / এস এখনও থাকবে।

3 - কিছু অভিজ্ঞতা

একটি অ্যাপ্লিকেশনটিতে আমার অনুরূপ সমস্যা ছিল যা প্রদত্ত শ্রেণীর একটি বিশাল পরিমাণ তৈরি করে। জিসি লগগুলিতে, আমি লক্ষ্য করেছি যে অ্যাপ্লিকেশনটির তৈরির হার প্রায় 3 জিবি / সেকেন্ডের কাছাকাছি ছিল, যা অনেক বেশি (আসুন ... প্রতি সেকেন্ডে 3 গিগাবাইট ডেটা?!)।

সমস্যা: অত্যধিক অবজেক্ট তৈরি হওয়ার কারণে অনেকগুলি ঘন ঘন GC।

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

  • অ্যালগরিদমটি পুনরায় কাজ করুন যাতে আমি একজোড়া বুলিয়ানগুলি না ফেরাই তবে তার পরিবর্তে আমার কাছে দুটি পদ্ধতি রয়েছে যা প্রতিটি বুলিয়ানকে আলাদাভাবে ফেরত দেয়

  • কেবলমাত্র 4 টি পৃথক দৃষ্টান্ত রয়েছে তা জেনে অবজেক্টগুলিকে ক্যাশে করুন

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

বরাদ্দের হার 1 গিগাবাইট / সেকেন্ডে নেমে গেছে এবং তরুন জিসির ফ্রিকোয়েন্সি (3 দ্বারা বিভক্ত) হয়েছিল।

আশা করি এইটি কাজ করবে !


11

যদি আপনার কেবল মূল্যবান অবজেক্ট থাকে (তবে এটি অন্যান্য সামগ্রীর জন্য কোনও উল্লেখ নেই) এবং তবে সত্যিকার অর্থে আমার অর্থ অনেকগুলি এবং এর মধ্যে অনেকগুলি, আপনি ByteBuffersদেশীয় বাইট ক্রম দিয়ে সরাসরি ব্যবহার করতে পারেন [উত্তরটি গুরুত্বপূর্ণ]] এবং আপনার কয়েকটি কয়েকশ লাইন দরকার বরাদ্দ / পুনরায় ব্যবহার + গেটার / সেটার কোড code প্রযোজকরা দেখতে অনুরূপlong getQuantity(int tupleIndex){return buffer.getLong(tupleInex+QUANTITY_OFFSSET);}

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

কৌশলটি ব্যবহারের মতো মনে হবে C and void*তবে কিছু মোড়কের সাহায্যে এটি বহনযোগ্য। কম্পাইলার এটি অপসারণ করতে ব্যর্থ হলে একটি পারফরম্যান্স ডাউনসাইড চেকিংয়ের সীমানা হতে পারে। একটি বড় উত্সাহিত এলাকা হ'ল যদি আপনি ভেক্টরগুলির মতো টিপলগুলি প্রক্রিয়া করেন তবে অবজেক্ট শিরোনামের অভাব মেমরির পদক্ষেপকেও হ্রাস করে।

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


8

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

  • একাধিক থ্রেডিং: থ্রেড স্থানীয় পুল ব্যবহার করা আপনার ক্ষেত্রে কার্যকর হতে পারে
  • ব্যাকিং ডেটা স্ট্রাকচার: অ্যারেডেক ব্যবহারের বিষয়টি বিবেচনা করুন কারণ এটি অপসারণে ভাল কার্য সম্পাদন করে এবং কোনও বরাদ্দ ওভারহেড নেই
  • আপনার পুলের আকার সীমাবদ্ধ করুন :)

ইত্যাদির আগে / পরে পরিমাপ করুন


6

আমি একটি একই সমস্যা পূরণ করেছি। প্রথমত, ছোট বস্তুর আকার কমানোর চেষ্টা করুন। আমরা প্রতিটি অবজেক্টে তাদের উল্লেখ করে কিছু ডিফল্ট ক্ষেত্রের মানগুলি প্রবর্তন করি।

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

অন্য উত্সটি ছিল একাধিক বুলিয়ান যা একটি অন্তর্নিহিত দ্বারা প্রতিস্থাপিত হয়েছিল এবং প্রতিটি বুলিয়ানের জন্য আমরা ইনট এর মাত্র একটি বাইট ব্যবহার করি।


মাত্র আগ্রহের বাইরে: এটি আপনাকে পারফরম্যান্সের ভিত্তিতে কী কিনেছিল? আপনি কি পরিবর্তনের আগে এবং পরে আপনার অ্যাপ্লিকেশনটিকে প্রোফাইল করেছিলেন এবং যদি তাই হয় তবে ফলাফল কী ছিল?
এক্সেল

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

6

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

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

সংক্ষেপে - সম্ভবত এটি মূল্যবান নয় - তবে আপনি এটি সম্পর্কে চিন্তাভাবনা করছেন তা দেখে আমি আনন্দিত, এটি আপনার যত্ন নিয়ে দেখায়।


2

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

আপনি যদি অভিব্যক্তিপূর্ণ শক্তি ব্যবহারের বস্তুগুলি চান। আপনি যদি গতি চান (এই ক্ষেত্রে) নেটিভ যান।


1

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

যদি কোনো কারণে সম্ভবপর না, আর আপনি শিখর মেমোরি ব্যবহার হ্রাস করতে চান, মেমরি দক্ষতা সম্পর্কে একটি ভাল নিবন্ধ এখানে: http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java- tutorial.pdf


মৃত লিঙ্ক। নিবন্ধের জন্য অন্য উত্স আছে?
dnault

0

আপনার লক্ষ লক্ষ বস্তু তৈরি করুন এবং আপনার কোডটি যথাযথভাবে লিখুন: এই বিষয়গুলির জন্য অপ্রয়োজনীয় তথ্যসূত্র রাখবেন না। জিসি আপনার জন্য নোংরা কাজ করবে। তারা সত্যই জিসিডি কিনা তা উল্লিখিত হিসাবে আপনি ভার্জোজ জিসির সাথে চারপাশে খেলতে পারেন। জাভা আইটেমগুলি তৈরি এবং প্রকাশের বিষয়ে। :)


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

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

জাভা আবর্জনা তৈরি করতে সহায়তা করে এবং এটি আপনার জন্য পরিষ্কার করে দেবে, এটি সত্য। ওপি যদি অবজেক্ট তৈরিতে ডজ করতে না পারে এবং জিসিতে সময় কাটিয়ে অসন্তুষ্ট হয় তবে এটি দুঃখজনক। আমার আপত্তিটি আপনি জিসির পক্ষে আরও কাজ করার জন্য যে প্রস্তাবনাটি দিয়েছেন তার প্রতি এটি কারণ এটি কোনওভাবেই সঠিক জাভা।
নিতসান ওয়াকার্ট

0

আমি মনে করি আপনার জাভাতে স্ট্যাক বরাদ্দ এবং এড়ানো বিশ্লেষণ সম্পর্কে পড়া উচিত।

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

জাভাতে এটি কীভাবে কাজ করে তার উদাহরণ সহ পালানোর বিশ্লেষণের একটি উইকিপিডিয়া ব্যাখ্যা রয়েছে:

http://en.wikipedia.org/wiki/Escape_analysis


0

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

ধারণাটি হ'ল নতুন বস্তুগুলি স্ট্যাকের মধ্যে সঞ্চয় করে তৈরি করা এড়াতে হবে যাতে আপনি এটি পরে পুনরায় ব্যবহার করতে পারেন।

Class MyPool
{
   LinkedList<Objects> stack;

   Object getObject(); // takes from stack, if it's empty creates new one
   Object returnObject(); // adds to stack
}

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

1
পুলে বস্তুর ম্যানেজিং হতে পারে আরো আবর্জনা সংগ্রাহক রান লেট চেয়ে ব্যয়বহুল।
থরবজর্ন রাভন অ্যান্ডারসন

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

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

0

অবজেক্ট পুলগুলি স্তূপে অবজেক্ট বরাদ্দের চেয়ে দুর্দান্ত (কখনও কখনও 10x) উন্নতি সরবরাহ করে। তবে একটি লিঙ্কযুক্ত তালিকা ব্যবহার করে উপরোক্ত বাস্তবায়ন নিরীহ এবং ভুল উভয়ই! লিঙ্কযুক্ত তালিকাটি চেষ্টাটিকে বাতিল করে দিয়ে এর অভ্যন্তরীণ কাঠামো পরিচালনা করতে অবজেক্ট তৈরি করে। একটি রিংবফার অবজেক্টের অ্যারে ব্যবহার করে ভাল কাজ করে। উদাহরণে দান করুন (একটি দাবা প্রোগ্রামম মুভি পরিচালনা করে) রিংবফারকে সমস্ত গণনা করা চালগুলির তালিকার জন্য একটি ধারক বস্তুতে আবৃত করা উচিত। কেবলমাত্র মুভ হোল্ডার অবজেক্টের রেফারেন্সগুলি পরে প্রায় পাস করা হবে।

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