একটি জাভা ভিএম কতগুলি থ্রেড সমর্থন করতে পারে? এটি কি বিক্রেতার দ্বারা পৃথক হয়? অপারেটিং সিস্টেম দ্বারা? অন্যান্য কারণের?
একটি জাভা ভিএম কতগুলি থ্রেড সমর্থন করতে পারে? এটি কি বিক্রেতার দ্বারা পৃথক হয়? অপারেটিং সিস্টেম দ্বারা? অন্যান্য কারণের?
উত্তর:
এটি আপনি যে সিপিইউ ব্যবহার করছেন তার উপর নির্ভর করে ওএসে, অন্যান্য প্রক্রিয়াগুলি কী করছে, জাভা কী প্রকাশ করছে আপনি কী ব্যবহার করছেন এবং অন্যান্য বিষয়গুলির উপর। আমি একটি উইন্ডোজ সার্ভারটি> মেশিনটি নামিয়ে আনার আগে> 6500 থ্রেডগুলি দেখেছি। বেশিরভাগ থ্রেড অবশ্যই কিছু করছিল না। একবার মেশিনটি প্রায় 6500 থ্রেড (জাভাতে) আঘাত করলে পুরো মেশিনটি সমস্যা হতে শুরু করে এবং অস্থির হয়ে উঠতে শুরু করে।
আমার অভিজ্ঞতা থেকে দেখা যায় যে কম্পিউটার নিজেই সমস্যা ছাড়াই হোস্ট করতে পারে এমন জাভা (সাম্প্রতিক সংস্করণগুলি) আনন্দের সাথে অনেকগুলি থ্রেড গ্রহণ করতে পারে।
অবশ্যই, আপনার পর্যাপ্ত র্যাম থাকতে হবে এবং থ্রেডগুলি যা করছে তা করতে এবং প্রতিটি থ্রেডের জন্য একটি স্ট্যাক রাখার জন্য আপনাকে যথেষ্ট মেমরি দিয়ে জাভা শুরু করতে হবে। একটি আধুনিক সিপিইউযুক্ত যেকোনো মেশিন (এএমডি বা ইন্টেলের সাম্প্রতিকতম কয়েক প্রজন্ম) এবং 1 - 2 গিগ মেমরি (ওএসের উপর নির্ভরশীল) সহ সহজেই হাজার হাজার থ্রেড সহ একটি জেভিএম সমর্থন করতে পারে ।
আপনার যদি এর চেয়ে আরও বেশি নির্দিষ্ট উত্তর প্রয়োজন হয় তবে আপনার সেরা বাজিটি হ'ল প্রোফাইল to
উম, প্রচুর।
এখানে বেশ কয়েকটি পরামিতি রয়েছে। নির্দিষ্ট ভিএম, প্লাসে ভিএম-তে সাধারণত রান-টাইম প্যারামিটার থাকে। এটি কিছুটা অপারেটিং সিস্টেম দ্বারা চালিত: থ্রেডগুলির জন্য অন্তর্নিহিত ওএসের কী সমর্থন এবং এটি তাদের উপর কোন সীমাবদ্ধতা রাখে? যদি ভিএম প্রকৃতপক্ষে ওএস-স্তরের থ্রেডগুলি ব্যবহার করে তবে ভাল পুরানো লাল থ্রেড / সবুজ থ্রেড জিনিস।
"সমর্থন" বলতে কী বোঝায় তা অন্য প্রশ্ন। আপনি যদি একটি জাভা প্রোগ্রাম লিখেন যা কিছু ঠিক এরকম
class DieLikeADog {
public static void main(String[] argv){
for(;;){
new Thread(new SomeRunaable).start();
}
}
}
(এবং সামান্য বাক্য বিন্যাস সম্পর্কে অভিযোগ করবেন না, আমি আমার প্রথম কাপ কফিতে আছি) তারপরে আপনার অবশ্যই কয়েকশ বা হাজার হাজার থ্রেড চলার আশা করা উচিত। তবে একটি থ্রেড তৈরি করা তুলনামূলকভাবে ব্যয়বহুল, এবং শিডিয়ুলার ওভারহেড তীব্র হতে পারে; এটি অস্পষ্ট যে আপনি এই থ্রেডগুলি দরকারী কিছু করতে পারে।
ঠিক আছে, প্রতিরোধ করতে পারিনি। একটি দম্পতি অলঙ্করণ সহ এখানে আমার ছোট্ট পরীক্ষা প্রোগ্রামটি রয়েছে:
public class DieLikeADog {
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(s){
count += 1;
System.err.println("New thread #"+count);
}
for(;;){
try {
Thread.sleep(1000);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}
}
ওএস / এক্স 10.5.6 এ ইন্টেল এবং জাভা 6 5 (মন্তব্যগুলি দেখুন), আমি যা পেয়েছি তা এখানে
নতুন থ্রেড # 2547 নতুন থ্রেড # 2548 নতুন থ্রেড # 2549 থ্রেড তৈরি করতে পারে না: 5 নতুন থ্রেড # 2550 থ্রেড "মূল" java.lang.OutOfMemoryError মধ্যে ব্যতিক্রম: নতুন নেটিভ থ্রেড তৈরি করতে অক্ষম java.lang.Thread.start0 (নেটিভ পদ্ধতি) এ java.lang.Thread.start এ (Thread.java:592) DieLikeADog.main এ (DieLikeADog.java:6)
চার্লি মার্টিনের পোস্টটি পড়ার পরে, আমি জানতে আগ্রহী ছিলাম যে স্তূপগুলির আকার আপনি তৈরি করতে পারেন এমন সংখ্যায় কোনও পার্থক্য করে কিনা এবং ফলাফলটি দেখে আমি পুরোপুরি হতবাক হয়ে পড়েছিলাম।
ভিস্তা হোম প্রিমিয়াম এসপি 1 তে জেডিকে 1.6.0_11 ব্যবহার করে, আমি 2 এমবি থেকে 1024 এমবি এর মধ্যে বিভিন্ন স্তরের আকারের সাথে চার্লির পরীক্ষার অ্যাপ্লিকেশনটি কার্যকর করেছিলাম।
উদাহরণস্বরূপ, একটি 2 এমবি হিপ তৈরি করতে, আমি JVM-Xms2m -Xmx2m যুক্তি দিয়ে প্রার্থনা করব।
আমার ফলাফলগুলি এখানে:
2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads
সুতরাং, হ্যাঁ, গাদা আকার অবশ্যই গুরুত্বপূর্ণ। তবে গাদা আকার এবং সর্বাধিক থ্রেড গণনার মধ্যে সম্পর্ক অসম্পূর্ণ ERS
যা অদ্ভুত।
আমি জানি এই প্রশ্নটি বেশ পুরানো তবে কেবল আমার অনুসন্ধানগুলি ভাগ করতে চাই।
আমার ল্যাপটপটি এমন প্রোগ্রাম পরিচালনা করতে সক্ষম যা প্রসারণ ঘটে 25,000
থ্রেডগুলিকে এবং এই সমস্ত থ্রেডগুলি 2 সেকেন্ডের নিয়মিত বিরতিতে মাইএসকিএল ডাটাবেসে কিছু ডেটা লিখে।
আমি এই প্রোগ্রাম দৌড়ে 10,000 threads
জন্য30 minutes continuously
তারপর এছাড়াও আমার সিস্টেম স্থিতিশীল ছিল এবং আমি ব্রাউজিং, খোলার মত অন্যান্য স্বাভাবিক অপারেশন করতে সক্ষম ছিল, অন্যান্য প্রোগ্রামের বন্ধ, ইত্যাদি
সঙ্গে 25,000 threads
সিস্টেমslows down
কিন্তু এটা প্রতিক্রিয়াশীল রয়ে যায়।
তাত্ক্ষণিকভাবে 50,000 threads
সিস্টেমের সাথে stopped responding
এবং আমাকে নিজেই আমার সিস্টেম পুনরায় চালু করতে হয়েছিল art
আমার সিস্টেমের বিশদটি নিম্নরূপ:
Processor : Intel core 2 duo 2.13 GHz
RAM : 4GB
OS : Windows 7 Home Premium
JDK Version : 1.6
চালানোর আগে আমি jvm যুক্তি সেট করেছিলাম -Xmx2048m
।
আশা করি এটা সাহায্য করবে.
পরম তাত্ত্বিক সর্বাধিক সাধারণত একটি প্রক্রিয়া কারো নির্দেশ চলে না ব্যবহারকারী ঠিকানা থ্রেড স্ট্যাকের আকার দ্বারা বিভক্ত স্থান (যদিও বাস্তবে, যদি আপনার সব মেমরির থ্রেড stacks জন্য সংরক্ষিত, আপনি একটি কাজ প্রোগ্রাম আছে না ...)।
সুতরাং 32-বিট উইন্ডোজ এর অধীনে, উদাহরণস্বরূপ, যেখানে প্রতিটি প্রক্রিয়াটিতে 2 জিবি ব্যবহারকারীর ঠিকানা স্থান রয়েছে, প্রতিটি থ্রেডকে 128 কে স্ট্যাকের আকার দেওয়া হয়, আপনি নিখুঁত সর্বোচ্চ 16384 থ্রেড (= 2 * 1024 * 1024/128) আশা করতে পারেন d অনুশীলনে, আমি খুঁজে পাই যে আমি প্রায় 13,000 এক্সপি এর অধীনে শুরু করতে পারি।
তারপরে, আমি মনে করি আপনি মূলত (ক) আপনি আপনার কোডের অনেকগুলি থ্রেড জাগলিং পরিচালনা করতে পারেন এবং স্পষ্টতই নির্বোধ জিনিসগুলি না করেন (যেমন তাদের সকলকে একই অবজেক্টে অপেক্ষা করার পরে নোটিফাইএল () ...) কল করে, এবং (খ) অপারেটিং সিস্টেমটি পারে কিনা। নীতিগতভাবে, (খ) এর উত্তরটি "হ্যাঁ" হয় যদি (ক) এর উত্তরটিও "হ্যাঁ" হয়।
ঘটনাচক্রে, আপনি থ্রেডের নির্মাতায় স্ট্যাকের আকারটি নির্দিষ্ট করতে পারেন ; এর জন্য আপনার ভিএম পরামিতিগুলি নিয়ে গণ্ডগোলের দরকার নেই (এবং সম্ভবত হওয়া উচিত নয়)।
আমি একটি ক্লোজার টক শুনে শুনেছি যেখানে তিনি কয়েক হাজার কোর (9000?) সহ একটি ট্রেড শোতে কিছু বিশেষায়িত মেশিনে তার একটি অ্যাপ্লিকেশন চালাতে পেরেছিলেন এবং এটি সমস্ত লোড করেছে। দুর্ভাগ্যক্রমে, আমি এখনই লিঙ্কটি খুঁজে পাই না (সহায়তা?)।
তার উপর ভিত্তি করে, আমি এটি নিরাপদ বলে মনে করি যে হার্ডওয়্যার এবং আপনার কোডটি সীমাবদ্ধ কারণ, জেভিএম নয়।
চার্লির ডিএলাইকএকোড শ্রেণীর সাথে চারপাশে খেলার পরে মনে হচ্ছে জাভা থ্রেড স্ট্যাকের আকারটি আপনি কতগুলি থ্রেড তৈরি করতে পারেন তার একটি বিশাল অংশ।
- এক্সএসএস সেট জাভা থ্রেড স্ট্যাকের আকার
উদাহরণ স্বরূপ
java -Xss100k DieLikeADog
তবে, জাভাতে এক্সিকিউটার ইন্টারফেস রয়েছে। আমি এটি ব্যবহার করব, আপনি কয়েক হাজার চালানোর যোগ্য কাজগুলি জমা দিতে সক্ষম হবেন এবং নির্বাহক একটি নির্দিষ্ট সংখ্যক থ্রেড সহ সেই কাজগুলি প্রক্রিয়া করতে পারবেন।
Runnable
/ Callable
সত্যিকারের ধারাবাহিকভাবে চালনার দরকার হলে এটি কাজ করবে না , যেমন কখন যোগাযোগ পরিচালনা করতে হয়। তবে এটি এসকিউএল প্রশ্নের জন্য উপযুক্ত।
কমপক্ষে ম্যাক ওএস এক্স 10.6 32 বিট এ অপারেটিং সিস্টেমের সীমা রয়েছে (2560)। এই স্ট্যাকওভারফ্লো থ্রেডটি পরীক্ষা করুন ।
আধুনিক (systemd) লিনাক্স সিস্টেমের জন্য অতিরিক্ত তথ্য।
মানগুলির এইগুলি সম্পর্কে অনেকগুলি সংস্থান রয়েছে যা টুইঙ্কের প্রয়োজন হতে পারে (যেমন কীভাবে সর্বোচ্চ সংখ্যক জেভিএম থ্রেড বাড়ানো যায় (লিনাক্স bit৪ বিট) ); তবে সিস্টেমেড "টাস্কম্যাক্স" সীমাটি একটি নতুন সীমা চাপিয়ে দেওয়া হয়েছে যা সিগ্রুপে পিডস.ম্যাক্স সেট করে।
লগইন সেশনের জন্য ইউজারটাস্কম্যাক্স ডিফল্ট কার্নেল সীমাবদ্ধতার 33% পিডস_ম্যাক্স (সাধারণত 12,288) হয় এবং /etc/systemd/logind.conf এ ওভাররাইড করা যায়।
পরিষেবাগুলির জন্য ডিফল্ট টাস্কম্যাক্স ডিফল্ট কর্নেল সীমাবদ্ধতার 15% পিডস_ম্যাক্স (সাধারণত 4,915) থাকে। আপনি "systemctl সম্পাদনা" এ টাস্কম্যাক্স সেট করে বা /etc/systemd/system.conf এ ডিফল্ট টাস্কম্যাক্স আপডেট করে পরিষেবাটির জন্য ওভাররাইড করতে পারেন
আপনি যে কোনও সংখ্যক থ্রেড প্রক্রিয়া করতে পারেন; কোন সীমা নেই। মুভি দেখার সময় এবং নেটবিয়ানগুলি ব্যবহার করার সময় আমি নীচের কোডটি চালিত করেছি এবং এটি মেশিনটি না থামিয়ে / সঠিকভাবে কাজ করেছে। আমি মনে করি আপনি এই প্রোগ্রামটির চেয়ে আরও বেশি থ্রেড রাখতে পারেন।
class A extends Thread {
public void run() {
System.out.println("**************started***************");
for(double i = 0.0; i < 500000000000000000.0; i++) {
System.gc();
System.out.println(Thread.currentThread().getName());
}
System.out.println("************************finished********************************");
}
}
public class Manager {
public static void main(String[] args) {
for(double j = 0.0; j < 50000000000.0; j++) {
A a = new A();
a.start();
}
}
}
main
একটি নিক্ষেপ করবে OutOfMemoryError
, এটি বলে যে এটি আর কোনও থ্রেড তৈরি করতে পারে না। সম্ভবত @ অ্যানিলপাল, আপনি এটি লক্ষ্য করেন নি। আমি main(..)
ত্রুটি ছুঁড়ে দেওয়ার পরে নতুন থ্রেড তৈরি করা বন্ধ করে দিলে স্পষ্টভাবে দেখার জন্য, পদ্ধতিটিতে অন্য মুদ্রণ বিবৃতিটি অন্তর্ভুক্ত করার পরামর্শ দিয়েছি ।