আমি সচেতন যে প্রতিটি বস্তুর জন্য হ্যাপ মেমরি প্রয়োজন এবং স্ট্যাকের প্রতিটি আদিম / রেফারেন্সের জন্য স্ট্যাক মেমরির প্রয়োজন।
আমি যখন স্তূপে একটি অবজেক্ট তৈরি করার চেষ্টা করি এবং এটি করার জন্য পর্যাপ্ত স্মৃতি নেই, তখন জেভিএম একটি জাভা.এল.আং.আউটআউফ মেমরিরির তৈরি করে এবং আমার কাছে ফেলে দেয়।
সুতরাং অন্তর্নিহিত, এর অর্থ এই যে JVM দ্বারা শুরুতে কিছু স্মৃতি সংরক্ষিত আছে।
এই সংরক্ষিত মেমরিটি ব্যবহার করা হলে (এটি অবশ্যই ব্যবহার করা হবে, নীচে আলোচনাটি পড়ুন) এবং জাভা.এল.আউটআফ মেমরিরির একটি উদাহরণ তৈরি করার জন্য জেভিএমের স্তূপে পর্যাপ্ত মেমরি নেই ?
এটা কি শুধু ঝুলছে? বা ওএম null
এর কোনও new
উদাহরণের কোনও স্মৃতি নেই বলে সে আমাকে ফেলে দেবে ?
try {
Object o = new Object();
// and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
// JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
// what next? hangs here, stuck forever?
// or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful than a null)
e.printStackTrace(); // e.printStackTrace() requires memory too.. =X
}
==
কেন জেভিএম পর্যাপ্ত মেমরি সংরক্ষণ করতে পারে না?
মেমরিটি কতটুকু সংরক্ষিত থাকুক না কেন, যদি এখনও জেভিএমের সেই স্মৃতিটিকে "পুনরায় দাবি করা" না থাকে তবে সেই স্মৃতিটি ব্যবহার করা এখনও সম্ভব:
try {
Object o = new Object();
} catch (java.lang.OutOfMemoryError e) {
// JVM had 100 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
// JVM had 99 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e3) {
// JVM had 98 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e4) {
// JVM had 97 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e5) {
// JVM had 96 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e6) {
// JVM had 95 units of "spare memory". 1 is used to create this OOM.
e.printStackTrace();
//........the JVM can't have infinite reserved memory, he's going to run out in the end
}
}
}
}
}
}
বা আরও সংক্ষিপ্তভাবে:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
OutOfMemoryError
এবং এর কোনও রেফারেন্স ধরে রাখে তবেই এটি ঘটতে পারে । এটি স্থানান্তরিত করে যে একটি ধরা পড়ার OutOfMemoryError
মতো ততটা কার্যকর নয়, কারণ আপনার প্রোগ্রামটি ধরার বিষয়ে আপনি তার অবস্থান সম্পর্কে প্রায় কিছুই গ্যারান্টি দিতে পারবেন । দেখুন stackoverflow.com/questions/8728866/...