java.lang.OutOfMemoryError: জাভা হ্যাপ স্পেস


97

মাল্টি-থ্রেডিং প্রোগ্রামটি কার্যকর করতে আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি

java.lang.OutOfMemoryError: Java heap space

উপরের ত্রুটিটি একটি থ্রেডে ঘটেছে।

  1. আমার জ্ঞান অবধি, হ্যাপ স্পেসটি কেবলমাত্র ভেরিয়েবল দ্বারা দখল করা হয়। যদি এটি সঠিক হয়, তবে বস্তু তৈরির সময় যেমন ভেরিয়েবলের জন্য স্থান বরাদ্দ করা হয় ততক্ষণ কিছুক্ষন ধরে দৌড়ানোর পরেও কেন এই ত্রুটি ঘটেছে।

  2. স্তূপ স্থান বাড়ানোর কোনও উপায় আছে কি?

  3. আমার প্রোগ্রামে আমার কী পরিবর্তন করা উচিত যাতে এটি কম গাদা স্থান দখল করে?


উত্তর:


105

আপনি যদি নিজের গাদা স্থান বাড়িয়ে নিতে চান তবে আপনি java -Xms<initial heap size> -Xmx<maximum heap size>কমান্ড লাইনে ব্যবহার করতে পারেন । ডিফল্টরূপে, মানগুলি JRE সংস্করণ এবং সিস্টেম কনফিগারেশনের উপর ভিত্তি করে। আপনি জাভা ওয়েবসাইটে ভিএম বিকল্পগুলি সম্পর্কে আরও জানতে পারেন ।

তবে, কেন আপনার গাদা আকার খাওয়া হচ্ছে তা জানতে আমি আপনার অ্যাপ্লিকেশনটি প্রোফাইল করার পরামর্শ দিচ্ছি। নেটবিন্স এর সাথে খুব ভাল প্রোফাইলার অন্তর্ভুক্ত করেছে। আমি বিশ্বাস করি এটি jvisualvmহুডের নীচে ব্যবহার করে । একজন প্রোফাইলার দিয়ে আপনি কোথায় কোথায় অনেকগুলি অবজেক্ট তৈরি হচ্ছে তা অনুসন্ধান করার চেষ্টা করতে পারেন, যখন বস্তুগুলি আবর্জনা সংগ্রহ করে এবং আরও অনেক কিছু করে।


4
আমি নেটবিয়ান ব্যবহার করছি তবে প্রোফাইলার কীভাবে ব্যবহার করতে হয় তা আমি জানি না। আমি প্রোফাইলার সম্পর্কে আরও জানতে চাই যাতে আমি এটিকে আমার অ্যাপ্লিকেশনটিতে মেমরির ফাঁস খুঁজে পেতে পারি।
ইয়াটেন্দ্র গোয়েল

আমি নেটবিন্স সাইটের একটি পৃষ্ঠায় একটি লিঙ্ক যুক্ত করেছি ( প্রোফাইলr.netbeans.org ) যার প্রোফাইল সম্পর্কে খুব ভাল ডকুমেন্টেশন রয়েছে, একেবারে বেসিকগুলি থেকে আরও উন্নত ব্যবহারের জন্য।
থমাস

জাভা সংস্করণগুলির সাথে ডিফল্ট মানগুলি পরিবর্তিত হয়, আপনার উত্তরে এই তথ্যটি অন্তর্ভুক্ত করা ভাল ।
দরিউজ

ঠিক একই ধরণের সমস্যাটি স্থির করে প্রথমে চেষ্টা করেছেন: java -jar বিভাগ.jar -Xmx512m -Xms512m - এটি আমাকে একই ত্রুটি দেয় তবে আমি যখন এটি পছন্দ করি: জাভা-এক্সএমএক্স 512 এম-এক্সএমএস 1212-জার বিভাগ.জার - সব ঠিক আছে। সুতরাং প্যারামগুলির ক্রমটিও গুরুত্বপূর্ণ।
হিপোকিতো

জারি ফাইলটি জার ফাইলের পরে জারি ফাইলের প্রধান () পদ্ধতিতে আর্গস হিসাবে প্রেরণ করার পরে @ipokito আর্গুমেন্টগুলি []
আসু

29

1.- হ্যাঁ, তবে এটি আপনার প্রোগ্রাম দ্বারা ব্যবহৃত পুরো স্মৃতিটিকে বোঝায়।

২.- হ্যাঁ জাভা ভিএম অপশন দেখুন

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

অর্থাৎ

java -Xmx2g আপনার অ্যাপ্লিকেশনে সর্বাধিক 2 গিগাবাইট র্যাম নিয়োগ করুন

তবে আপনার দেখতে হবে আপনার প্রথমে মেমরি ফুটো নেই।

3.- এটি প্রোগ্রামের উপর নির্ভর করে। স্পট মেমরি ফাঁস চেষ্টা করুন। এই প্রশ্নের উত্তর দেওয়া কঠিন হবে। আপনার স্মৃতি কোথায় যাচ্ছে তা জানার জন্য আপনি ইদানীং জে কনসোল ব্যবহার করে প্রোফাইল তৈরি করতে পারেন


যা যা (সত্য);)
গাল ব্রাচা

8

আপনি জেভিএম মেমরি সম্পর্কে আরো জানতে এই সাইট এ দেখতে চাই করতে পারেন: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

কী পরিবর্তন করতে হবে তা নির্ধারণ করতে, মেমরির মডেলটির বিভিন্ন অংশ কীভাবে পূরণ হচ্ছে তা দেখার জন্য ভিজ্যুয়ালগি ব্যবহার করা আমার পক্ষে দরকারী হয়েছে ।

মেমোরির কোন অংশটি পূরণ হয়েছিল তা নির্ধারণ করা কঠিন, অতএব ভিজ্যুগসি, কারণ আপনি কেবল যেটি বলছেন তার চেয়ে কেবল যে অংশে সমস্যা রয়েছে কেবল সেই অংশটি পরিবর্তন করতে চাইতে পারেন,

ভাল! আমি জেভিএমকে 1 জি র‌্যাম দেব।

আপনি কী করছেন সে সম্পর্কে আরও সুনির্দিষ্ট হওয়ার চেষ্টা করুন, দীর্ঘমেয়াদে আপনি সম্ভবত এর জন্য প্রোগ্রামটি আরও ভাল পাবেন।

মেমরি ফাঁস কোথায় হতে পারে তা নির্ধারণের জন্য আপনি পরীক্ষার আগে এবং তার পরে মেমরিটি কী ছিল তা পরীক্ষা করে আপনি তার জন্য ইউনিট পরীক্ষাগুলি ব্যবহার করতে পারেন এবং যদি খুব বড় কোনও পরিবর্তন হয় তবে আপনি এটি পরীক্ষা করতে চাইতে পারেন, তবে, আপনার প্রয়োজন আপনার পরীক্ষা এখনও চলমান আছে কিনা তা পরীক্ষা করে দেখুন।


6

গাদা আকার বাড়ানোর জন্য আপনি জাভা শুরু করার সময় -Xmx আর্গুমেন্ট ব্যবহার করতে পারেন; যেমন

-Xmx256M

6

আপনি নীচের প্রোগ্রামের মাধ্যমে আপনার হিপ মেমরির আকার পেতে পারেন।

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

তারপরে আপনি এর সাহায্যে গাদা আকারও বাড়িয়ে নিতে পারেন: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html


6
  1. আমার জ্ঞান অবধি, হ্যাপ স্পেসটি কেবলমাত্র ভেরিয়েবল দ্বারা দখল করা হয়। যদি এটি সঠিক হয়, তবে বস্তু তৈরির সময় যেমন ভেরিয়েবলের জন্য স্থান বরাদ্দ করা হয় ততক্ষণ কিছুক্ষন ধরে দৌড়ানোর পরেও কেন এই ত্রুটি ঘটেছে।

এর অর্থ আপনি অবিচ্ছিন্ন সময়ের সাথে আপনার আবেদনে আরও বেশি অবজেক্ট তৈরি করছেন। নতুন বস্তু হিপ মেমরিতে সংরক্ষণ করা হবে এবং হিপ মেমরির বৃদ্ধির কারণ এটি।

গাদাতে কেবল উদাহরণ ভেরিয়েবল থাকে না। এটি সমস্ত অ-আদিম ডেটা ধরণের (অবজেক্টস) সঞ্চয় করবে। এই অবজেক্টের জীবনের সময় কম (পদ্ধতি অবরুদ্ধ) বা দীর্ঘ হতে পারে (অবজেক্টটি আপনার অ্যাপ্লিকেশনে রেফারেন্স হওয়া অবধি)

  1. স্তূপ স্থান বাড়ানোর কোনও উপায় আছে কি?

হ্যাঁ. আরও তথ্যের জন্য এই ওরাকল নিবন্ধটি দেখুন।

গাদা আকার নির্ধারণের জন্য দুটি পরামিতি রয়েছে:

-Xms:, যা প্রাথমিক এবং সর্বনিম্ন গাদা আকার নির্ধারণ করে

-Xmx:, যা সর্বোচ্চ স্তরের আকার নির্ধারণ করে

  1. আমার প্রোগ্রামে আমার কী পরিবর্তন করা উচিত যাতে এটি কম গাদা স্থান দখল করে?

এটি আপনার আবেদনের উপর নির্ভর করে।

  1. আপনার অ্যাপ্লিকেশন প্রয়োজনীয়তা হিসাবে সর্বোচ্চ হিপ মেমরি সেট করুন

  2. আপনার অ্যাপ্লিকেশনটিতে মেমরি ফাঁস হওয়ার কারণ হবে না

  3. আপনি যদি আপনার অ্যাপ্লিকেশনটিতে মেমরি ফাঁস পান তবে ম্যাট , ভিজ্যুয়াল ভিএম , জকনসোল ইত্যাদি প্রোফাইলিং সরঞ্জামগুলির সাহায্যে মূল কারণটি সন্ধান করুন Once

ওরাকল নিবন্ধ থেকে গুরুত্বপূর্ণ নোট

কারণ: জাভা হিপ স্পেসটি নির্দেশ করে বিশদ বার্তা জাভা হ্যাপে বরাদ্দ করা যায়নি। এই ত্রুটিটি অগত্যা কোনও মেমরি ফাঁস বোঝায় না।

সম্ভাব্য কারণ:

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

অন্য একটি নোটে, আরও ভাল আবর্জনা সংগ্রহের অ্যালগরিদম ( সিএমএস বা জি 1 জিসি ) ব্যবহার করুন

জি 1 জিসি বোঝার জন্য এই প্রশ্নটি একবার দেখুন


5
  1. বেশিরভাগ ক্ষেত্রে কোডটি অনুকূলিত হয় না। আপনার মনে হয় সেই জিনিসগুলিকে ছেড়ে দিন। আপনার লুপে প্রতিটি সময় বস্তু তৈরি করা এড়ানো উচিত। ক্যাশে ব্যবহার করার চেষ্টা করুন। আপনার অ্যাপ্লিকেশনটি কীভাবে চলছে তা আমি জানি না। প্রোগ্রামিংয়ে, সাধারণ জীবনের একটি নিয়মও প্রযোজ্য

    প্রতিরোধ রোগের চিকিত্সার চেয়ে বেশী ভাল। "অপ্রয়োজনীয় বস্তু তৈরি করবেন না"


3
  1. স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের উপরে অবস্থিত। গাদা স্থান বস্তু দ্বারা দখল করা হয়।

  2. আপনি -Xmxবিকল্পটি ব্যবহার করতে পারেন ।

  3. মূলত আপনি যখনই কোনও নতুন বস্তু বরাদ্দ করেন তখন অবধি হ্যাপ স্পেস ব্যবহার করা হয় newএবং অবজেক্টটির আর রেফারেন্স না দেওয়ার পরে কিছু সময় মুক্তি দেওয়া হয়। সুতরাং নিশ্চিত হয়ে নিন যে আপনার আর প্রয়োজন নেই এমন অবজেক্টের রেফারেন্স রাখবেন না।


1

না, আমি মনে করি আপনি স্ট্যাক স্পেসের কথা ভাবছেন। গাদা স্থান বস্তু দ্বারা দখল করা হয়। এটি বাড়ানোর উপায় হ'ল -Xmx256m, কমান্ড লাইনে আপনার প্রয়োজনীয় পরিমাণ 256 এর পরিবর্তে।


1

সেই ব্যতিক্রম এড়াতে, আপনি JUnit এবং স্প্রিং ব্যবহার করে থাকেন তবে প্রতিটি পরীক্ষার ক্লাসে এটি যুক্ত করার চেষ্টা করুন:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)

0

নেটবিনে, 'রান' সরঞ্জামদণ্ডে যান, -> 'প্রকল্প কনফিগারেশন সেট করুন' -> এর পপড উইন্ডোটির 'কাস্টমাইজ' -> 'রান' -> 'ভিএম অপশন' -> '-Xms2048m পূরণ করুন -Xmx2048m '। এটি গাদা আকারের সমস্যা সমাধান করতে পারে।

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