জাভাতে এটি পল অবজেক্টগুলিতে এতটা সহায়ক নয় * যেহেতু আশেপাশের অবজেক্টগুলির জন্য প্রথম জিসি চক্র এগুলিকে স্মৃতিতে রদবদল করবে, এটিকে "ইডেন" স্থানের বাইরে নিয়ে যাবে এবং প্রক্রিয়াটিতে সম্ভাব্য স্থানীয় অবস্থান হারাবে।
- জটিল সম্পদগুলিকে পুল করার জন্য এটি যে কোনও ভাষাতেই সর্বদা কার্যকর which এগুলি পুলিংয়ের পক্ষে মূল্যবান হতে পারে কারণ তাদের তৈরি এবং ধ্বংস করার ব্যয়টির উত্সটির সাথে থাকা হ্যান্ডেলের সাথে সম্পর্কিত স্মৃতির সাথে প্রায় কোনও সম্পর্ক নেই। তবে কণাগুলি এই বিভাগে ফিট করে না।
আপনি যখন ইডেন স্পেসে দ্রুত বস্তুগুলি বরাদ্দ করেন তখন জাভা ক্রমিক বরাদ্দকারী ব্যবহার করে দ্রুত ফেটে বরাদ্দ দেয়। সেই অনুক্রমিক বরাদ্দ কৌশলটি malloc
সি এর তুলনায় দ্রুততর, এটি কেবল মেমরিকে পুলিং করে মেমরিটি ইতিমধ্যে একটি সরল অনুক্রমিক ফ্যাশনে বরাদ্দ করা হয়েছে, তবে এটি এমন নেতিবাচক দিক দিয়ে আসে যে আপনি মেমরির পৃথক অংশকে মুক্ত করতে পারবেন না। এটি সি এর জন্য একটি দরকারী কৌশলও যদি আপনি কেবল খুব সহজে সুপারিশ করার জন্য জিনিসগুলি বরাদ্দ করতে চান, বলুন, এমন একটি ডেটা স্ট্রাকচার যেখানে আপনাকে এ থেকে কোনও কিছু সরিয়ে ফেলতে হবে না, কেবল সমস্ত কিছু যুক্ত করুন এবং তারপরে এটি ব্যবহার করুন এবং পরে পুরো জিনিসটি টস করুন।
স্বতন্ত্র অবজেক্টগুলি মুক্ত করতে না পারার এই ক্ষতির কারণে, জাভা জিসি, প্রথম চক্রের পরে, ইডেন স্পেস থেকে বরাদ্দকৃত সমস্ত মেমরিটিকে একটি ধীর, আরও সাধারণ-উদ্দেশ্যে মেমরির বরাদ্দকারী ব্যবহার করে অনুলিপি করবে যা মেমরিটিকে মঞ্জুরি দেয় না আলাদা থ্রেডে পৃথক অংশগুলিতে মুক্তি পান। তারপরে এটি পৃথকভাবে ইডেন স্পেসে বরাদ্দ করা মেমরিটি আলাদাভাবে ফেলে দিতে পারে যা এখন অনুলিপি করা হয়েছে এবং মেমরিতে অন্য কোথাও বাস করেছে objects প্রথম জিসি চক্রের পরে, আপনার অবজেক্টগুলি মেমরিতে খণ্ডিত হয়ে শেষ হতে পারে।
যেহেতু প্রথম জিসি চক্রের পরে অবজেক্টগুলি টুকরো টুকরো হয়ে যেতে পারে, তাই মূলত মেমরি অ্যাক্সেস প্যাটার্নগুলি (রেফারেন্সের স্থানীয়তা) উন্নত করার জন্য এবং বরাদ্দ / ডিএলোকেশন ওভারহেড হ্রাস করার সুবিধার জন্য যখন অবজেক্ট পুলিংয়ের উপকারগুলি মূলত হারিয়ে যায় ... এত বেশি যে আপনি সাধারণত নতুন সময় কণা সমস্ত সময় বরাদ্দ করে রেফারেন্সের আরও ভাল এলাকা পাবেন এবং এডেন স্পেসে এখনও তারা সতেজ থাকাকালীন এবং তারা "পুরানো" হওয়ার আগে এবং সম্ভাব্য স্মৃতিতে ছড়িয়ে ছিটিয়ে থাকার আগে তাদের ব্যবহার করবেন। যাইহোক, যা জাভাতে সি প্রতিদ্বন্দ্বী পারফরম্যান্স পাওয়ার পক্ষে চূড়ান্ত সহায়ক হতে পারে তা হ'ল আপনার কণাগুলির জন্য অবজেক্টগুলি ব্যবহার করা এবং সমতল পুরাতন আদিম ডেটা পুল করা। এর পরিবর্তে একটি সাধারণ উদাহরণের জন্য:
class Particle
{
public float x;
public float y;
public boolean alive;
}
এর মতো কিছু করুন:
class Particles
{
// X positions of all particles. Resize on demand using
// 'java.util.Arrays.copyOf'. We do not use an ArrayList
// since we want to work directly with contiguously arranged
// primitive types for optimal memory access patterns instead
// of objects managed by GC.
public float x[];
// Y positions of all particles.
public float y[];
// Alive/dead status of all particles.
public bool alive[];
}
এখন বিদ্যমান কণাগুলির জন্য স্মৃতি পুনরায় ব্যবহার করতে, আপনি এটি করতে পারেন:
class Particles
{
// X positions of all particles.
public float x[];
// Y positions of all particles.
public float y[];
// Alive/dead status of all particles.
public bool alive[];
// Next free position of all particles.
public int next_free[];
// Index to first free particle available to reclaim
// for insertion. A value of -1 means the list is empty.
public int first_free;
}
এখন যখন nth
কণা মরে যায়, তবে পুনঃব্যবহৃত করার অনুমতি, তাই মত মুক্ত লিস্টে ধাক্কা:
alive[n] = false;
next_free[n] = first_free;
first_free = n;
নতুন কণা যুক্ত করার সময়, বিনামূল্যে তালিকা থেকে আপনি কোনও সূচক পপ করতে পারেন কিনা তা দেখুন:
if (first_free != -1)
{
int index = first_free;
// Pop the particle from the free list.
first_free = next_free[first_free];
// Overwrite the particle data:
x[index] = px;
y[index] = py;
alive[index] = true;
next_free[index] = -1;
}
else
{
// If there are no particles in the free list
// to overwrite, add new particle data to the arrays,
// resizing them if needed.
}
এটি কাজ করার জন্য সবচেয়ে সুখী কোড নয়, তবে এর সাহায্যে আপনি ক্রমীয় কণা প্রক্রিয়াকরণের সাথে খুব দ্রুত কিছু কণার সিমুলেশন পেতে সক্ষম হবেন যেহেতু সমস্ত কণা তথ্য সর্বদা স্বচ্ছন্দভাবে সংরক্ষণ করা হবে। এই ধরণের সোয়া প্রতিনিধি মেমরির ব্যবহারও হ্রাস করে যেহেতু প্যাডিংয়ের বিষয়ে আমাদের চিন্তা করতে হবে না, প্রতিবিম্ব / গতিশীল প্রেরণের জন্য অবজেক্ট মেটাডেটা এবং এটি শীতল ক্ষেত্রগুলি থেকে দূরে গরম ক্ষেত্রগুলিকে বিভক্ত করে তোলে (উদাহরণস্বরূপ, আমরা ডেটা নিয়ে অবিচ্ছিন্নভাবে উদ্বিগ্ন নই) পদার্থবিজ্ঞানের সময় কণার রঙের মতো ক্ষেত্রগুলি পাস করে যাতে কেবল এটি ব্যবহার না করার জন্য এবং উচ্ছেদ করার জন্য এটি ক্যাশে লাইনে লোড করা অপব্যয় হবে)
কোডটির সাথে কাজ করা আরও সহজ করার জন্য, এটি আপনার নিজের বেসিক রিজেজেবল পাত্রে লেখার মতো হতে পারে যা ফ্লোটের অ্যারে, পূর্ণসংখ্যার অ্যারে এবং বুলিয়ানগুলির অ্যারে সঞ্চয় করে store আবার আপনি জেনেরিকগুলি এবং ArrayList
এখানে ব্যবহার করতে পারবেন না (অন্তত শেষ বার যাচাই করার সময় থেকে) যেহেতু এর জন্য GC- পরিচালিত অবজেক্টগুলির প্রয়োজন, আদিম ডেটা নয়। আমরা সামঞ্জস্যপূর্ণ অ্যারে ব্যবহার করতে চাই int
, যেমন, জিসি-পরিচালিত অ্যারেগুলি Integer
নয় যা ইডেন স্পেস ছেড়ে যাওয়ার পরে অগত্যা সংগত হবে না।
আদিম ধরণের অ্যারেগুলির সাথে, এগুলি সর্বদা সংলগ্ন হওয়ার গ্যারান্টিযুক্ত এবং তাই আপনি উল্লেখের অত্যন্ত আকাঙ্ক্ষিত লোকাল পান (ক্রমিক কণা প্রক্রিয়াজাতকরণের জন্য এটি একটি পার্থক্যের সৃষ্টি করে) এবং অবজেক্ট পুলিংয়ের যে সমস্ত সুযোগসুবিধাগুলি সরবরাহ করার উদ্দেশ্যে করা হয় সেগুলি পাওয়া যায়। অবজেক্টগুলির একটি অ্যারে সহ এটি কিছুটা পয়েন্টারের অ্যারের সাথে সামঞ্জস্যপূর্ণ যা আপনি ইডেন স্পেসে একবারে সমস্ত বরাদ্দ করে ধরে নিলেন, তবে একটি জিসি চক্রের পরে, সমস্ত দিকে ইশারা দেওয়া যেতে পারে এমন এক ধরণের ফ্যাশনে বস্তুগুলিকে নির্দেশ করা শুরু করে start স্মৃতিতে রাখুন।