"Java.lang.OutOfMemoryError: নতুন নেটিভ থ্রেড তৈরি করতে অক্ষম"


124

আমরা "java.lang.OutOfMemoryError : unable to create new native Thread32 কে থ্রেড পরে 8 জিবি র‌্যাম ভিএম-তে পেয়ে যাচ্ছি (পিএসইএলএফ | গ্রেপ-সি জাভা)

তবে "top" and "free -m" shows 50% free memory available,। জেডিকে bit৪ বিট এবং হটস্পট এবং জ্রোকিত উভয়ের সাথেই চেষ্টা করা হয়েছে। সার্ভারে লিনাক্স ২.6.১৮ রয়েছে

আমরা OS stack size (ulimit -s)টুইঙ্ক এবং সর্বোচ্চ প্রক্রিয়া (উলিমিট-ইউ) সীমাবদ্ধতা, লিমিটেড.কোনফ বৃদ্ধি করার চেষ্টা করেছি কিন্তু সব বৃথা।

এছাড়াও আমরা হ্যাপ আকারের কম্বিনেশনগুলির প্রায় সমস্ত সম্ভাব্য চেষ্টা করেছি, এটিকে কম, উঁচু রেখে etc.

অ্যাপ্লিকেশন চালানোর জন্য আমরা যে স্ক্রিপ্টটি ব্যবহার করি তা হ'ল

/opt/jrockit-jdk1.6/bin/java -Xms512m -Xmx512m -Xss128k -jar JavaNatSimulator.jar /opt/tools/jnatclients/natSimulator.properties

উত্তরের জন্য ধন্যবাদ.

আমরা /etc/security/limits.conf সম্পাদনা এবং ulimit চেষ্টা করেছি কিন্তু এখনও একই

[root@jboss02 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 72192
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 72192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

11
অপারেটিং সিস্টেমগুলি যে পরিমাণ থ্রেড তৈরি করতে পারে তার সীমাবদ্ধতা রয়েছে। আপনি কেন 32k এর বেশি থ্রেড তৈরি করছেন? আপনার সিস্টেমে সম্ভবত হাজার হাজার প্রসেসর কোর নেই, এতগুলি থ্রেড তৈরি করা কার্যকর নয়। ExecutorServiceপরিবর্তে একটি থ্রেড পুল ( ) ব্যবহার করুন।
জেস্পার

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

আইসিই 4 জে লাইব্রেরিতে আমরা ওপেন সোর্স লাইব্রেরিটি ব্যবহার করছি
দীপক তেওয়ানি

11
OutOfMemoryError করে না মানে গাদা স্থান, বা "সাধারণ" র্যাম, ক্লান্ত ছিল। এই ক্ষেত্রে এটি স্পষ্ট যে ব্যর্থতার অতিরিক্ত ও থ্রেড বরাদ্দের সংস্থান না থাকার কারণে failure 50% ফ্রি মেমরি থাকা এই বিশেষ ব্যর্থতার সাথে অপ্রাসঙ্গিক।
আন্দ্রেজেজ ডয়েল

1
নতুন থ্রেড তৈরির জন্য প্রয়োজনীয় অন্যান্য সংস্থানগুলি কী কী। আমরা এই ধারণাটির মধ্যে ছিলাম যে আমরা যদি র‌্যাম বাড়িয়ে তুলি তবে আমরা আরও থ্রেড তৈরি করতে পারি। দয়া করে আমাদের গাইড করুন
দীপক তেওয়ানি

উত্তর:


80

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

এটি একটি অস্বাভাবিক সমস্যা, কারণ আপনার খুব কমই প্রয়োজন need থ্রেডগুলি শেষ হওয়া উচিত তবে যেখানে আপনার শর্ত ছাড়াই প্রচুর শর্তযুক্ত থ্রেড ছড়িয়ে পড়েছে?

আপনি যদি সম্ভব হয় তবে এক্সিকিউটারের নিয়ন্ত্রণে কলযোগ্য / রাননেবলগুলি ব্যবহার করে পুনরায় লেখার বিষয়টি বিবেচনা করতে পারেন। বিভিন্ন আচরণ সহ প্রচুর মানক এক্সিকিউটার রয়েছে যা আপনার কোড সহজেই নিয়ন্ত্রণ করতে পারে।

(থ্রেডের সংখ্যা সীমিত হওয়ার জন্য অনেকগুলি কারণ রয়েছে তবে তারা অপারেটিং সিস্টেম থেকে অপারেটিং সিস্টেমে পরিবর্তিত হয়)


উত্তরের জন্য ধন্যবাদ. আমরা একটি ওপেন সোর্স লাইব্রেরি ICE4j ব্যবহার করছি এবং এটি পরীক্ষা লোড করার চেষ্টা করছি। যখন আমরা জানি যে সার্ভারে 50% মেমরি রয়েছে তখন আমরা ওএসে থ্রেডের সীমাটি বাড়িয়ে তুলতে পারি না।
দীপক তেওয়ানি

সম্ভবত, তবে আমি মনে করি এটি আপনাকে তেমন সাহায্য করবে না। লোড টেস্টিংয়ের সময় আপনি যদি সংস্থানগুলি শেষ করে থাকেন তবে আপনার অ্যাপ্লিকেশনটিতে কী ঘটে তা নিয়ন্ত্রণ করতে সক্ষম হতে হবে। আপনার কেন একবারে 32000 থ্রেড সক্রিয় রয়েছে?
থরবজর্ন রাভন অ্যান্ডারসন

আমরা 11 কে ক্লায়েন্ট তৈরি করছি যা ইউডিপি সকেটে ডেটা লেখার জন্য, 32 কে থ্রেড ব্যবহার করে। এই 32 কে থ্রেডগুলির মধ্যে 10 কে থ্রেডগুলি সকেটটি উন্মুক্ত রাখতে ব্যবহৃত থ্রেডগুলি জীবন্ত রাখে
দীপক তেওয়ানি

আমি বিশ্বাস করি আধুনিক ওয়েব সার্ভারগুলিতে এই সমস্যাটির সমাধান হয়েছে। এছাড়াও ইউডিপি প্যাকেটগুলি আলগা করতে পারে - কোনও কারণ আপনি কেবল একটি ওয়েব সার্ভার ব্যবহার করেন না?
থরবজর্ন রাভন অ্যান্ডারসন

7
কারণ আউটআফমেমরি ব্যতিক্রমটির নাম রাখা উচিত ছিল আউটআফআরসোর্স। অপারেটিং সিস্টেম আপনার প্রয়োজনীয় সংস্থান সরবরাহ করতে পারে না। (এবং এটি প্রমাণিত হয়েছে যে আমি আইস 4 জে জানি না)
অ্যান্ডারসন

14

লোড পরীক্ষার সময় আমি একই সমস্যার মুখোমুখি হয়েছিলাম, কারণটি কারণ জেভিএম আরও একটি নতুন জাভা থ্রেড তৈরি করতে অক্ষম। নীচে জেভিএম উত্স কোড রয়েছে

if (native_thread->osthread() == NULL) {    
// No one should hold a reference to the 'native_thread'.    
    delete native_thread;   
if (JvmtiExport::should_post_resource_exhausted()) {      
    JvmtiExport::post_resource_exhausted(        
        JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | 
        JVMTI_RESOURCE_EXHAUSTED_THREADS, 
        "unable to create new native thread");    
    } THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "unable to create new native thread");  
} Thread::start(native_thread);`

রুট কারণ: জেভিএম এই ব্যতিক্রমটি ছুঁড়ে দেয় যখন জেভিএমটিআইএসএসসিসিএক্সএইচএইচএসইএসটিএস (OOM_ERROR) (সংস্থান সংস্থানগুলি (অর্থাত্ স্মৃতিশক্তি শেষ)) বা জেভিএমটিআইএসএসসিআরসি-এক্সএইচএসইউএসটিথথ্রেডস (থ্রেডস ক্লান্ত)।

আমার ক্ষেত্রে জবস অনুরোধটি পরিবেশন করতে অনেক বেশি থ্রেড তৈরি করছে, তবে সমস্ত থ্রেড ব্লক করা আছে। এ কারণে, জেভিএম থ্রেডগুলির পাশাপাশি মেমরির সাথে ক্লান্ত হয়ে পড়েছে (প্রতিটি থ্রেড মেমরি ধারণ করে, যা প্রকাশিত হয় না, কারণ প্রতিটি থ্রেড অবরুদ্ধ রয়েছে)।

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

"SimpleAsyncTaskExecutor-16562" #38070 prio=5 os_prio=0 tid=0x00007f9985440000 nid=0x2ca6 waiting for monitor entry [0x00007f9d58c2d000]
   java.lang.Thread.State: BLOCKED (on object monitor)

পদ্ধতিটি কীভাবে অবরুদ্ধ ছিল? কখনই ফিরবে না?
থোরবজর্ন রাভন অ্যান্ডারসন

8

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

আপনি কি নিশ্চিতভাবেই আপনার 32k থ্রেড প্রয়োজন? বেশিরভাগ আধুনিক ভাষাগুলিতে পুনরায় ব্যবহারযোগ্য থ্রেডগুলির পুলগুলির জন্য একরকম সমর্থন রয়েছে - আমি নিশ্চিত জাভাটিরও কিছু জায়গা রয়েছে (যেমন ExecutorService, ব্যবহারকারী জেস্পার উল্লেখ করেছেন)। ম্যানুয়ালি নতুন তৈরির পরিবর্তে আপনি সম্ভবত এই জাতীয় পুল থেকে থ্রেডগুলির জন্য অনুরোধ করতে পারেন।


1
উত্তরের জন্য ধন্যবাদ আমরা একটি ওপেন সোর্স লাইব্রেরি ICE4j ব্যবহার করছি এবং এটি পরীক্ষা লোড করার চেষ্টা করছি। যখন আমরা জানি যে সার্ভারে 50% মেমরি রয়েছে তখন আমরা ওএসে থ্রেডের সীমাটি বাড়িয়ে তুলতে পারি না।
দীপক তেওয়ানি

1
আমরা 11 কে ক্লায়েন্ট তৈরি করছি যা ইউডিপি সকেটে ডেটা লেখার জন্য, 32 কে থ্রেড ব্যবহার করে। এই 32 কে থ্রেডগুলির মধ্যে 10 কে থ্রেডগুলি সকেটটি উন্মুক্ত রাখতে ব্যবহৃত থ্রেডগুলি জীবন্ত রাখে
দীপক তেওয়ানি

7

আমি থ্রেড স্ট্যাকের আকারটিও দেখার পরামর্শ দিচ্ছি এবং আরও থ্রেড তৈরি হয়েছে কিনা তা দেখুন। JRockit 1.5 / 1.6 এর জন্য ডিফল্ট থ্রেড স্ট্যাকের আকার লিনাক্স ওএস-তে 64-বিট জন্য 1 এমবি। 32K থ্রেডগুলির এই প্রয়োজনটি সম্মানের জন্য উল্লেখযোগ্য পরিমাণে শারীরিক এবং ভার্চুয়াল মেমরির প্রয়োজন হবে।

একটি সূচনা পয়েন্ট হিসাবে স্ট্যাকের আকার 512 কেবি কমাতে চেষ্টা করুন এবং দেখুন এটি আপনার অ্যাপ্লিকেশনটির জন্য আরও থ্রেড তৈরি করতে সহায়তা করে কিনা। আমি অনুভূমিক স্কেলিং অন্বেষণ করার পরামর্শ দিচ্ছি যেমন আরও বেশি শারীরিক বা ভার্চুয়াল মেশিনে আপনার অ্যাপ্লিকেশন প্রসেসিংকে বিভক্ত করা।

64৪-বিট ভিএম ব্যবহার করার সময়, আসল সীমা ওএস শারীরিক এবং ভার্চুয়াল মেমরির উপলব্ধতা এবং ওলিমিটের মতো ওএস টিউনিং পরামিতিগুলির উপর নির্ভর করবে। আমি নীচের নিবন্ধটিও রেফারেন্স হিসাবে সুপারিশ করছি:

আউটআফমিউরিওর: নতুন নেটিভ থ্রেড তৈরি করতে অক্ষম - ডেমিসিফাইড সমস্যা


5

যদি jvm সিস্টেমডের মাধ্যমে শুরু করা হয় তবে কিছু লিনাক্স ওএসে প্রক্রিয়া সীমা প্রতি কার্য সীমা (কার্যগুলি আসলে থ্রেডগুলি বোঝায়) থাকতে পারে।

আপনি "পরিষেবা স্থিতি" চালিয়ে এটি পরীক্ষা করতে পারেন এবং কোনও সর্বোচ্চ টাস্কের সীমা আছে কিনা তা পরীক্ষা করতে পারেন। যদি থাকে তবে আপনি এটি কনফিগার করে /etc/systemd/system.conf সম্পাদনা করে মুছে ফেলতে পারবেন: DefaultTasksMax = infinity


3

ভূত প্রক্রিয়াগুলির কারণে আমার একই সমস্যা ছিল যা শীর্ষে ব্যাশ ব্যবহার করার সময় দেখা যায় না। এটি জেভিএমকে আরও থ্রেড ছড়িয়ে দিতে বাধা দিয়েছে।

আমার জন্য, jps সহ সমস্ত জাভা প্রক্রিয়াগুলি তালিকাভুক্ত করার সময় এটি সমাধান করা হয়েছিল (কেবল jpsআপনার শেলের মধ্যে সম্পাদন করুন) এবং এগুলি ব্যবহার করে এগুলি পৃথকভাবে হত্যা করেkill -9 pid প্রতিটি ভূত প্রক্রিয়ার জন্য ব্যাশ কমান্ড ।

এটি কিছু পরিস্থিতিতে সাহায্য করতে পারে।


2

java.lang.OutOfMemoryError: Unable to create new native threadযখনই জেভিএম ওএস থেকে নতুন থ্রেড চাইবে তখন আপনার মুখোমুখি হওয়ার সুযোগ রয়েছে a যখনই অন্তর্নিহিত ওএস একটি নতুন নেটিভ থ্রেড বরাদ্দ করতে পারে না, তখন এই আউটঅফমিউরিওর নিক্ষেপ করা হবে। নেটিভ থ্রেডগুলির জন্য সঠিক সীমাটি অত্যন্ত প্ল্যাটফর্ম নির্ভর thus সুতরাং নীচের লিঙ্কের উদাহরণের মতো পরীক্ষা চালিয়ে সেই সীমাগুলি সন্ধান করার পরামর্শ দেয়। তবে, সাধারণভাবে, পরিস্থিতি java.lang.OutOfMemoryError: Unable to create new native threadনিম্নলিখিত পর্যায়ে চলে:

  1. জেভিএমের অভ্যন্তরে চলমান একটি অ্যাপ্লিকেশন দ্বারা একটি নতুন জাভা থ্রেডের জন্য অনুরোধ করা হয়েছে
  2. জেভিএম নেটিভ কোড ওএস-তে একটি নতুন নেটিভ থ্রেড তৈরি করার অনুরোধটিকে প্রক্স করে ওএস একটি নতুন নেটিভ থ্রেড তৈরি করার চেষ্টা করে যার মেমরিটি থ্রেডে বরাদ্দ করা প্রয়োজন
  3. ওএস স্থানীয় মেমরি বরাদ্দকে অস্বীকার করবে কারণ 32-বিট জাভা প্রক্রিয়া আকারটি তার মেমরি ঠিকানার স্থানটি হ্রাস পেয়েছে - যেমন (2-4) গিগাবাইট প্রক্রিয়া আকারের সীমাটি আঘাত পেয়েছে - বা ওএসের ভার্চুয়াল মেমরি সম্পূর্ণরূপে হ্রাস পেয়েছে
  4. Java.lang.OutOfMemoryError: নতুন নেটিভ থ্রেড ত্রুটি তৈরি করতে অক্ষম নিক্ষিপ্ত হয়।

তথ্যসূত্র: https://plumbr.eu/outofmemoryerror/unable-to-create-new-native-thread


2

কোন প্রক্রিয়াগুলি থ্রেড তৈরি করছে তা জানার চেষ্টা করুন:

ps huH

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


1

যদি আপনার কাজটি নোডগুলিতে আউটআউফমেমোরির কারণে ব্যর্থ হয় তবে আপনি আপনার সর্বাধিক মানচিত্র এবং হ্রাসকারীদের সংখ্যার জন্য টুইট করতে পারেন এবং প্রতিটিটির জন্য জেভিএম অপ্টস করতে পারেন। mapred.child.java.opts (ডিফল্ট 200Xmx) সাধারণত আপনার ডেটা নোড নির্দিষ্ট হার্ডওয়ারের উপর ভিত্তি করে বৃদ্ধি করতে হয়।

এই লিঙ্কটি সহায়ক হতে পারে ... দয়া করে চেক করুন


1
আমরা সকলেই ইতিমধ্যে চেষ্টা করেছি যে সেই লিঙ্কটিতে দেওয়া পরিবর্তন। তবে ফলাফল একই :(
দীপক তেওয়ানি

1

আপনার জেবস কনফিগারেশনের কিছু সমস্যা রয়েছে, /opt/jrockit-jdk1.6/bin/java -Xms512m -Xmx512m এক্সএমএস এবং এক্সএমএক্স আপনার JBoss মেমরির ব্যবহারকে কনফিগার করা মানের মধ্যে সীমাবদ্ধ করে চলেছে, সুতরাং 8 জিবি থেকে আপনার সার্ভারটি কেবল 512 এম ব্যবহার করছে + তার নিজের উদ্দেশ্যে অতিরিক্ত কিছু, সেই সংখ্যাটি বাড়িয়ে দিন, ওএস এবং সেখানে চালিত অন্যান্য স্টাফগুলির জন্য কিছুটা মুক্ত রাখার কথা মনে রাখবেন এবং ডি অযাচিত কোড সত্ত্বেও আপনি এটি চালিয়ে যেতে পারেন। কোড ফিক্সিং খুব সুন্দর হবে, আপনি যদি পারেন।


1

নিম্নলিখিত দুটি কারণে এই ত্রুটিটি দেখা দিতে পারে:

  • নতুন থ্রেড মিটানোর জন্য মেমোরিতে কোনও স্থান নেই।

  • থ্রেডের সংখ্যা অপারেটিং সিস্টেমের সীমা ছাড়িয়ে গেছে।

আমি সন্দেহ করি যে জাভা প্রক্রিয়াটির জন্য থ্রেডের সংখ্যা সীমা অতিক্রম করেছে

সম্ভাবনাগুলি সম্ভবত সমস্যাটি হ'ল মেমরির কারণেই একটি বিষয় বিবেচনা করা উচিত

JVM হিপ এর মধ্যে থ্রেড তৈরি হয় না। এগুলি জেভিএম স্তূপের বাইরে তৈরি করা হয়েছে। সুতরাং যদি র‌্যামে কম জায়গা না থাকে, জেভিএম হিপ বরাদ্দের পরে, অ্যাপ্লিকেশনটি "java.lang.OutOfMemoryError: নতুন নেটিভ থ্রেড তৈরি করতে অক্ষম" তে চলে যাবে।

সম্ভাব্য সমাধান হিপ মেমরি হ্রাস করা বা সামগ্রিক রামের আকার বাড়ানো


0

আমার এই একই সমস্যা ছিল এবং এটি জাভা এপিআই-এর একটি ভুল ব্যবহার হতে পারে। আমি একজন ব্যাচ প্রসেসিং পদ্ধতিতে একজন বিল্ডারকে আরম্ভ করছিলাম যা ছিল একাধিকবার আরম্ভ করার কথা ছিল না।

মূলত আমি এমন কিছু করছিলাম:

for (batch in batches) {
    process_batch(batch)
}

def process_batch(batch) {
    var client = TransportClient.builder().build()
    client.processList(batch)
}

যখন আমার এটি করা উচিত ছিল:

for (batch in batches) {
    var client = TransportClient.builder().build()
    process_batch(batch, client)
}

def process_batch(batch, client) {
    client.processList(batch)
}

-4

সবার আগে আমি এতটা ওএস / ভিএমকে দোষ দেব না .. বরং বিকাশকারী যিনি কোড লিখেছেন যা অনেক থ্রেড তৈরি করে । মূলত আপনার কোডে (বা তৃতীয় পক্ষের) কোথাও নিয়ন্ত্রণ ছাড়াই প্রচুর থ্রেড তৈরি হয়

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


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