ওম ক্যাচ করা যেতে পারে তবে সাধারণভাবে অকেজো হতে চলেছে, যদি জেভিএম ক্যাচটি পৌঁছে যায় তখন কিছু জিনিস সংগ্রহ করতে সক্ষম হয় এবং সেই সময়ের মধ্যে কত হিপ মেমরি ছেড়ে যায় তার উপর নির্ভর করে।
উদাহরণ: আমার জেভিএম-এ, এই প্রোগ্রামটি সমাপ্তির দিকে চলে:
import java.util.LinkedList;
import java.util.List;
public class OOMErrorTest {
public static void main(String[] args) {
List<Long> ll = new LinkedList<Long>();
try {
long l = 0;
while(true){
ll.add(new Long(l++));
}
} catch(OutOfMemoryError oome){
System.out.println("Error catched!!");
}
System.out.println("Test finished");
}
}
তবে, ক্যাচটিতে কেবল একটি লাইন যুক্ত করা আপনাকে দেখাবে যে আমি কী সম্পর্কে বলছি:
import java.util.LinkedList;
import java.util.List;
public class OOMErrorTest {
public static void main(String[] args) {
List<Long> ll = new LinkedList<Long>();
try {
long l = 0;
while(true){
ll.add(new Long(l++));
}
} catch(OutOfMemoryError oome){
System.out.println("Error catched!!");
System.out.println("size:" +ll.size());
}
System.out.println("Test finished");
}
}
প্রথম প্রোগ্রামটি ঠিকঠাক হয়ে যায় কারণ যখন ক্যাচটি পৌঁছে যায়, জেভিএম সনাক্ত করে যে তালিকাটি আর ব্যবহার করা হচ্ছে না (এই সনাক্তকরণটি সংকলনের সময় করা একটি অপ্টিমাইজেশনও হতে পারে)। সুতরাং আমরা যখন মুদ্রণ বিবৃতিতে পৌঁছেছি তখন হিপ মেমরিটি প্রায় পুরোপুরি মুক্ত হয়ে গেছে, সুতরাং চালিয়ে যাওয়ার জন্য এখন আমাদের চালকের বিস্তৃত মার্জিন রয়েছে। এটি সেরা কেস।
যাইহোক, কোডটি যদি সাজানো থাকে যেমন ll
OOM ক্যাচ করার পরে তালিকাটি ব্যবহার করা হয়, JVM এটি সংগ্রহ করতে অক্ষম। এটি দ্বিতীয় স্নিপেটে ঘটে। একটি নতুন লং ক্রিয়েশনের মাধ্যমে ট্রিগার হওয়া ওওমে ধরা পড়েছে, তবে শীঘ্রই আমরা একটি নতুন অবজেক্ট ( System.out,println
লাইনে একটি স্ট্রিং ) তৈরি করছি , এবং গাদাটি প্রায় পূর্ণ হয়ে গেছে, সুতরাং একটি নতুন ওওম নিক্ষেপ করা হবে। এটি সবচেয়ে খারাপ পরিস্থিতি: আমরা একটি নতুন অবজেক্ট তৈরি করার চেষ্টা করেছি, আমরা ব্যর্থ হয়েছি, আমরা ওওকে ধরেছি, হ্যাঁ, তবে এখন নতুন হিপ মেমরির প্রয়োজন প্রথম নির্দেশনা (যেমন: একটি নতুন অবজেক্ট তৈরি করা) একটি নতুন ওমকে ফেলে দেবে। এটি ভেবে দেখুন, এত অল্প স্মৃতি রেখে আমরা এই মুহুর্তে আর কী করতে পারি ?. সম্ভবত সরে যাচ্ছেন। তাই অকেজো।
জেভিএম সংস্থান সংগ্রহ না করার কারণগুলির মধ্যে একটি সত্যই ভীতিজনক: অন্যান্য থ্রেডের সাথে একটি ভাগ করা সংস্থানও এটি ব্যবহার করে। মস্তিষ্ক সহ যে কেউ যে কোনও ধরণের অ-পরীক্ষামূলক অ্যাপে sertedোকানো থাকলে ওওমকে ধরা কতটা বিপজ্জনক হতে পারে তা দেখতে পাবে।
আমি একটি উইন্ডোজ এক্স 86 32 বিবিটি জেভিএম (জেআর 6) ব্যবহার করছি। প্রতিটি জাভা অ্যাপ্লিকেশনের জন্য ডিফল্ট মেমরি 64MB।