স্থির পদ্ধতি এবং স্থির ভেরিয়েবলগুলি জাভাতে কোথায় সংরক্ষণ করা হয়?


115

উদাহরণ স্বরূপ:

class A {
    static int i=0;
    static int j;

   static void method() {
       // static k=0; can't use static for local variables only final is permitted
       // static int L;
    }
}

এই ভেরিয়েবলগুলি জাভা, হিপ বা স্ট্যাক মেমোরিতে কোথায় সংরক্ষণ করা হবে? তারা কিভাবে সংরক্ষণ করা হয়?


2
ওরাকল এর অফিশিয়াল ওয়েবসাইটে আবর্জনা সংগ্রহ বুঝতে খুব দরকারী লিঙ্ক: oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/…
অর্ণব জোশী

উত্তর:


144

স্ট্যাটিক পদ্ধতি (আসলে সমস্ত পদ্ধতি) পাশাপাশি স্ট্যাটিক ভেরিয়েবলগুলি PermGenগাদা বিভাগে সংরক্ষণ করা হয় , যেহেতু তারা প্রতিবিম্বের ডেটার অংশ (শ্রেণি সম্পর্কিত ডেটা, উদাহরণ সম্পর্কিত নয়)।

স্পষ্টতার জন্য আপডেট :

মনে রাখবেন যে কেবল পরিবর্তনশীল এবং তাদের প্রযুক্তিগত মানগুলি (আদিম বা রেফারেন্স) পার্মজেন স্পেসে সঞ্চিত রয়েছে।

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

উদাহরণ:

static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.


আবর্জনা সংগ্রহের উপর একটি শব্দ:

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

অবশ্যই আপনি নালার জন্য একটি স্ট্যাটিক ভেরিয়েবল সেট করতে পারেন এবং এইভাবে স্তূপে অবস্থানের রেফারেন্সটি সরিয়ে ফেলতে পারেন তবে এর অর্থ এই নয় যে আবর্জনা সংগ্রহকারী এটি সংগ্রহ করবেন (এমনকি আরও কোনও উল্লেখ না থাকলেও)।

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

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


1
স্থির পরিবর্তনশীল সম্পর্কে আপনি কি নিশ্চিত? আফাইক পার্মজেন কেবলমাত্র সংজ্ঞাগুলি প্রকৃত মান নয় stores
আমির রামিনফার

2
@ আমির আমি পুরোপুরি নিশ্চিত যে ভেরিয়েবলটি নিজেই পার্জেন স্পেসে সঞ্চিত রয়েছে, কোনও রেফারেন্সযুক্ত বস্তু সম্ভবত গাদাতে বরাদ্দ দেওয়া হবে। এটি কিছু তথ্য যুক্ত করতে পারে: stackoverflow.com/questions/3800444/…
টমাস

1
আহ হ্যাঁ ভেরিয়েবল সংজ্ঞাটি পার্জেজেনে সংরক্ষিত। তবে মান হ'ল গাদা। আপনার উত্তরে পরামর্শ দেওয়া হয়েছে যে মানটিও পার্মজেনে সঞ্চিত রয়েছে।
আমির রামিনফার

1
@ ম্যাথু আপনি আমার উত্তর কিভাবে বুঝতে পারবেন? এ বলেছেন যে ভেরিয়েবলগুলি পার্জেন বিভাগে (আদিম / রেফারেন্স) সংরক্ষণ করা হয় যা তারা উল্লেখ করে। এটা কিভাবে আপনি একটি ভেরিয়েবল দেখতে উপর নির্ভর করে মান
থমাস

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

25

শ্রেণি ভেরিয়েবল (স্ট্যাটিক ভেরিয়েবল) Class objectসেই শ্রেণীর সাথে সম্পর্কিত অংশ হিসাবে সংরক্ষণ করা হয় । এই শ্রেণীর অবজেক্টটি কেবল জেভিএম দ্বারা তৈরি করা যায় এবং এতে সঞ্চিত থাকে permanent generation

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

এটি দেখার আরও একটি উপায়

রানটাইম চলাকালীন জেভিএম মেমরি পরিচালকদের দ্বারা মেমরি পুল তৈরি করা হয়। মেমরি পুলটি হিপ বা নন-হিপ মেমরির অন্তর্ভুক্ত হতে পারে run রান টাইম ধ্রুবক পুলটি একটি ক্লাস ফাইলে ধ্রুবক_পুল টেবিলের প্রতি-শ্রেণীর বা প্রতি ইন্টারফেস রান টাইম প্রতিনিধিত্ব। প্রতিটি রানটাইম ধ্রুবক পুলটি জাভা ভার্চুয়াল মেশিনের পদ্ধতি অঞ্চল থেকে বরাদ্দ করা হয় এবং স্ট্যাটিক ভেরিয়েবলগুলি এই পদ্ধতি অঞ্চলে সংরক্ষণ করা হয়। এছাড়াও এই নন-হিপটি পার্ম জেনার অঞ্চল ছাড়া কিছুই নয় ctঅথ্যভাবে পদ্ধতি অঞ্চলটি পেরিম জেনার অংশ (( রেফারেন্স )

এখানে চিত্র বর্ণনা লিখুন


পদ্ধতি ক্ষেত্রটি কি স্মৃতির পার্মজেন বিভাগের উপসেট নয়? আমি মনে করি, তারা (পদ্ধতি (শ্রেণি) ক্ষেত্রের পাশাপাশি পার্মজেন) জেভিএম-এর বৃহত্তর হিপ অঞ্চলের অংশ হ'ল কেন আপনি নন-হ্যাপ মেমরির অংশ হিসাবে পদ্ধতির ক্ষেত্রটি দেখিয়েছেন?
কবিশ কানওয়াল

শেষ লাইনটি পড়ুন -Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
অনিকেত ঠাকুর

1
@ অ্যানিকেটঠাকুর আপনি নন-হ্যাপ মেমরির অংশ হিসাবে পদ্ধতির ক্ষেত্রটি দেখিয়েছেন তবে অরাকল ডক্স অনুসারে, এখানে ডকস.ওরাকল / জ্যাভেস / স্পেকস / জেভিএমস / সি 7 / এইচটিএমএল , উল্লেখ করা হয়েছে যে পদ্ধতি অঞ্চলটি যৌক্তিকভাবেই এর অংশ গাদা
করণ

21

জাভা 8 এর আগে:

স্ট্যাটিক ভেরিয়েবলগুলি পার্জেন স্পেসে সংরক্ষণ করা হত (যাকে মেথড এরিয়াও বলা হয়)।

পারমজেন স্পেসটি মেথড এরিয়া হিসাবেও পরিচিত

পার্মজেন স্পেস 3 টি জিনিস সঞ্চয় করত

  1. শ্রেণি স্তরের ডেটা (মেটা-ডেটা)
  2. ইন্টার্নযুক্ত স্ট্রিং
  3. স্ট্যাটিক ভেরিয়েবল

জাভা 8 থেকে

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

ইন্টার্নযুক্ত স্ট্রিং এবং স্ট্যাটিক ভেরিয়েবলগুলি গাদা নিজেই স্থানান্তরিত হয়।

অফিসিয়াল তথ্যের জন্য দেখুন: JEP 122: স্থায়ী জেনার স্পেস সরান


আপনি যখন স্ট্যাটিক ভেরিয়েবল> জাভ 8 এর জন্য "নিজেকে গাদা করুন" বলবেন ঠিক কোথায়: ওল্ডজেন?
ইওকস

15

এটি একটি সাধারণ উত্তর এবং দীর্ঘ-বায়ুযুক্ত উত্তর সহ একটি প্রশ্ন।

সহজ উত্তর হ'ল গাদা। ক্লাসে প্রয়োগ করা ডেটা এবং সমস্ত ডেটা (উদাহরণস্বরূপ ডেটা নয়) হিপের স্থায়ী জেনারেশন বিভাগে সংরক্ষণ করা হয়।

দীর্ঘ উত্তর ইতিমধ্যে স্ট্যাক ওভারফ্লোতে রয়েছে:

জেভিএম-এ মেমরি এবং আবর্জনা সংগ্রহের একটি বিশদ বিবরণ রয়েছে এবং সেই সাথে একটি উত্তর যা এ সম্পর্কে আরও সংক্ষিপ্তভাবে কথা বলে।


3
ঠিক! আপনি যদি তাদেরকে দরকারী বলে মনে করেন তবে তাদের আপভোট করতে ভুলবেন না।
ভাসিলি শারাপভ

11

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


5

টমাসের উত্তর ছাড়াও, স্ট্যাটিক ভেরিয়েবল নন হ্যাপ এরিয়ায় সংরক্ষণ করা হয় যা মেথড এরিয়া বলে called


4

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


3

স্ট্যাটিক ভেরিয়েবলগুলি হিপ-এ সংরক্ষণ করা হয়


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