ঠিক আছে, এখানে একটিতে বেশ কয়েকটি প্রশ্ন রয়েছে!
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 দ্বারা বিভক্ত) হয়েছিল।
আশা করি এইটি কাজ করবে !