স্ট্রিং লিটারেলগুলি স্ট্যাকের মধ্যে সংরক্ষণ করা হয় না। কখনও। আসলে, কোনও বস্তু স্ট্যাকের মধ্যে সংরক্ষণ করা হয় না।
স্ট্রিং লিটারেল (বা আরো সঠিকভাবে, স্ট্রিং যে বস্তু তাদের প্রতিনিধিত্ব) হয় ঐতিহাসিকভাবে এক গাদা মধ্যে সংরক্ষিত হয় "permgen" গাদা বলা হয়। (স্থায়ী প্রজন্মের জন্য পারমজেন সংক্ষিপ্ত))
সাধারণ পরিস্থিতিতে স্ট্রিং লিটারেলস এবং পার্জেন হ্যাপের অন্যান্য জিনিসগুলির অনেকগুলি "স্থায়ীভাবে" পৌঁছনীয় এবং এগুলি আবর্জনা সংগ্রহ করা হয় না। (উদাহরণস্বরূপ, স্ট্রিং লিটারেলগুলি সর্বদা সেগুলি ব্যবহার করে এমন কোড অবজেক্টগুলি থেকে পৌঁছানো যায়)) তবে, আপনি কোনও জেভিএম কনফিগার করতে পারেন না যে গতিবেগের সাথে বোঝা ক্লাসগুলি আর প্রয়োজন নেই এবং এটি স্ট্রিং লিটারেলগুলি আবর্জনা সংগ্রহের কারণ হতে পারে cause ।
স্পষ্টকরণ # 1 - আমি বলছি না যে পারমজেন GC'ed পায় না। এটি সাধারণত হয় যখন জেভিএম সম্পূর্ণ জিসি চালানোর সিদ্ধান্ত নেয়। আমার পয়েন্ট স্ট্রিং লিটারেল যতদিন পৌঁছানো হবে যে কোডটি ব্যবহার তাদের পৌঁছানো হয়, এবং কোড যতদিন কোডের classloader যোগাযোগ করা যাবে এবং ডিফল্ট classloaders জন্য পৌঁছানো হবে, তার মানে "চিরদিনের জন্য"।
বর্ণমালা # 2 - প্রকৃতপক্ষে, জাভা 7 এবং পরবর্তীকালে স্ট্রিং পুলটি ধরে রাখতে নিয়মিত গাদা ব্যবহার করে। সুতরাং, স্ট্রিং অবজেক্টস যা স্ট্রিং লিটারেল এবং ইন্টার্ন'ড স্ট্রিংগুলিকে প্রতিনিধিত্ব করে সেগুলি নিয়মিত হিপগুলিতে থাকে। (বিশদগুলির জন্য @ অ্যাসিলিয়াসের উত্তর দেখুন))
তবে আমি এখনও স্ট্রিং আক্ষরিক এবং স্ট্রিংয়ের সাহায্যে স্ট্রিংয়ের স্টোরেজের মধ্যে পাতলা রেখা খুঁজে বের করার চেষ্টা করছি new
।
কোনও "পাতলা রেখা" নেই। এটা সত্যিই খুব সহজ:
String
স্ট্রিং প্যাটার্নগুলিতে স্ট্রিং লিটারেলগুলিকে প্রতিনিধিত্ব করা / প্রাসঙ্গিক করে
String
String::intern
কল দ্বারা তৈরি করা বস্তুগুলি স্ট্রিং পুলে ধারণ করা হয়।
- অন্যান্য সমস্ত
String
অবজেক্ট স্ট্রিং পুলে রাখা হয় না।
তারপরে স্ট্রিং পুলটি "সঞ্চিত" কোথায় রয়েছে তার আলাদা প্রশ্ন রয়েছে। জাভা 7 এর আগে এটি ছিল পার্জেন হিপ। জাভা 7 থেকে এটি প্রধান গাদা।