একটি জাভা ভিএম কতগুলি থ্রেড সমর্থন করতে পারে?


212

একটি জাভা ভিএম কতগুলি থ্রেড সমর্থন করতে পারে? এটি কি বিক্রেতার দ্বারা পৃথক হয়? অপারেটিং সিস্টেম দ্বারা? অন্যান্য কারণের?

উত্তর:


170

এটি আপনি যে সিপিইউ ব্যবহার করছেন তার উপর নির্ভর করে ওএসে, অন্যান্য প্রক্রিয়াগুলি কী করছে, জাভা কী প্রকাশ করছে আপনি কী ব্যবহার করছেন এবং অন্যান্য বিষয়গুলির উপর। আমি একটি উইন্ডোজ সার্ভারটি> মেশিনটি নামিয়ে আনার আগে> 6500 থ্রেডগুলি দেখেছি। বেশিরভাগ থ্রেড অবশ্যই কিছু করছিল না। একবার মেশিনটি প্রায় 6500 থ্রেড (জাভাতে) আঘাত করলে পুরো মেশিনটি সমস্যা হতে শুরু করে এবং অস্থির হয়ে উঠতে শুরু করে।

আমার অভিজ্ঞতা থেকে দেখা যায় যে কম্পিউটার নিজেই সমস্যা ছাড়াই হোস্ট করতে পারে এমন জাভা (সাম্প্রতিক সংস্করণগুলি) আনন্দের সাথে অনেকগুলি থ্রেড গ্রহণ করতে পারে।

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

আপনার যদি এর চেয়ে আরও বেশি নির্দিষ্ট উত্তর প্রয়োজন হয় তবে আপনার সেরা বাজিটি হ'ল প্রোফাইল to


86

উম, প্রচুর।

এখানে বেশ কয়েকটি পরামিতি রয়েছে। নির্দিষ্ট ভিএম, প্লাসে ভিএম-তে সাধারণত রান-টাইম প্যারামিটার থাকে। এটি কিছুটা অপারেটিং সিস্টেম দ্বারা চালিত: থ্রেডগুলির জন্য অন্তর্নিহিত ওএসের কী সমর্থন এবং এটি তাদের উপর কোন সীমাবদ্ধতা রাখে? যদি ভিএম প্রকৃতপক্ষে ওএস-স্তরের থ্রেডগুলি ব্যবহার করে তবে ভাল পুরানো লাল থ্রেড / সবুজ থ্রেড জিনিস।

"সমর্থন" বলতে কী বোঝায় তা অন্য প্রশ্ন। আপনি যদি একটি জাভা প্রোগ্রাম লিখেন যা কিছু ঠিক এরকম

   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)

10
আপনি কতটা স্মৃতি দিয়ে জেভিএম শুরু করেছিলেন? এই ব্যাপারগুলো.
এডি

10
জাভা 6 আপডেট 13, উবুন্টু 8.10 32 বিট, 4 জিগ র‌্যাম, ডিফল্ট জেভিএম সেটিংস = 6318 থ্রেড।
স্টিভ কে

9
হি, থ্রেড স্ট্যাকের আকারের সাথে খেলুন। java -Xss100k আমাকে লিনাক্সে 19702 থ্রেড তৈরি করার অনুমতি দিয়েছে।
স্টিভ কে

21
java -Xss50k আমাকে প্রায় 32k থ্রেড পেয়েছে। যদিও আমার 4gigs মেষটি সর্বাধিক বাড়িয়েছে। জাভা মেরে ফেলার জন্য একটি নতুন প্রক্রিয়া কাঁটাতে আমার মেশিনে পর্যাপ্ত স্মৃতি ফিরে পাওয়ার জন্য আমাকে কিছু চলমান প্রক্রিয়া বন্ধ করতে হয়েছিল;) - ভাল সময়।
স্টিভ কে

21
উইন্ডোজ 7 এ জাভা 7 ব্যবহার করে আমি আমার সিস্টেমটি মারা যাওয়ার আগে 200,000 থ্রেড তৈরি করেছি। টাস্ক ম্যানেজার 8 জিবি র‌্যাম ব্যবহার করে প্রক্রিয়াটি দেখিয়েছিল। কেন এটি সেখানে থামল তা নিশ্চিত নয়, যদিও ... আমার কম্পিউটারে আমার 12 জিবি র‌্যাম রয়েছে। সুতরাং এটি কিছু অন্য সীমা হিট হতে পারে।
ডাবিস ভান্ডারমির ২

50

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

ভিস্তা হোম প্রিমিয়াম এসপি 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

যা অদ্ভুত।


11
যদি প্রতিটি থ্রেডকে সেই আকারের একটি গাদা দেওয়া হয় তবে তা বোঝা যাবে।
থরবজর্ন রাভন অ্যান্ডারসন

1
ক্যাভেট: আমার মেশিনটিতে 2583 গিগাবাইট র‌্যাম নেই। বা অদলবদল। এবং জেভিএম থ্রেড-লোকাল হিপ স্থান বরাদ্দ দেয় না। সুতরাং এটি হতে পারে না ...
বেনজিসমথ

49
গাদা আকার স্ট্যাকের জন্য উপলব্ধ ঠিকানা স্থান হ্রাস করে। 256 কে / স্ট্যাকের ঠিকানা স্থানটি বোঝায়।
টম হাটিন -

1
হ্যাঁ, এটি একই জিনিসটি দেখায় pequenoperro.blogspot.com/2009/02/less-is-more.html
টবি

39

আমি জানি এই প্রশ্নটি বেশ পুরানো তবে কেবল আমার অনুসন্ধানগুলি ভাগ করতে চাই।

আমার ল্যাপটপটি এমন প্রোগ্রাম পরিচালনা করতে সক্ষম যা প্রসারণ ঘটে 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

আশা করি এটা সাহায্য করবে.


2
"ধীরে ধীরে" অদলবদলের মতো শব্দ।
থোরবজর্ন রাভন অ্যান্ডারসন

ধন্যবাদ। এটি বেশ শক্ত মেশিন ছিল এবং হঠাৎ এটি বন্ধ হওয়া বন্ধ হওয়ার আগ পর্যন্ত প্রায় 8 বছর ধরে কাজ করে। আমি কেবল উইন্ডোজের পরিবর্তে উবুন্টুকে ইনস্টল করেছি এবং এটি আবার সংখ্যার ক্রাচ শুরু করে :)
শেখর

উবুন্টু সিজনিংয়ের সাথে ফ্রাইড কোর 2 জুটি: ডি
পাসুপতি রাজনামিকাম

31

পরম তাত্ত্বিক সর্বাধিক সাধারণত একটি প্রক্রিয়া কারো নির্দেশ চলে না ব্যবহারকারী ঠিকানা থ্রেড স্ট্যাকের আকার দ্বারা বিভক্ত স্থান (যদিও বাস্তবে, যদি আপনার সব মেমরির থ্রেড stacks জন্য সংরক্ষিত, আপনি একটি কাজ প্রোগ্রাম আছে না ...)।

সুতরাং 32-বিট উইন্ডোজ এর অধীনে, উদাহরণস্বরূপ, যেখানে প্রতিটি প্রক্রিয়াটিতে 2 জিবি ব্যবহারকারীর ঠিকানা স্থান রয়েছে, প্রতিটি থ্রেডকে 128 কে স্ট্যাকের আকার দেওয়া হয়, আপনি নিখুঁত সর্বোচ্চ 16384 থ্রেড (= 2 * 1024 * 1024/128) আশা করতে পারেন d অনুশীলনে, আমি খুঁজে পাই যে আমি প্রায় 13,000 এক্সপি এর অধীনে শুরু করতে পারি।

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

ঘটনাচক্রে, আপনি থ্রেডের নির্মাতায় স্ট্যাকের আকারটি নির্দিষ্ট করতে পারেন ; এর জন্য আপনার ভিএম পরামিতিগুলি নিয়ে গণ্ডগোলের দরকার নেই (এবং সম্ভবত হওয়া উচিত নয়)।


1
সুতরাং একটি 64-বিট ওএস ব্যবহার করুন। আমরা কতক্ষণ ধরে 64৪-বিট প্রসেসর ব্যবহার করছি?
টম হাটিন -

অবশ্যই, আমি কেবল একটি তাত্ত্বিক বনাম ব্যবহারিক সীমাবদ্ধতার একটি উদাহরণ দিচ্ছি। মনে মনে, 32-বিট মেশিনগুলির একটি সার্ভার রয়েছে (সার্ভার সহ) এখনও আছে ...
নীল কফি

2

আমি একটি ক্লোজার টক শুনে শুনেছি যেখানে তিনি কয়েক হাজার কোর (9000?) সহ একটি ট্রেড শোতে কিছু বিশেষায়িত মেশিনে তার একটি অ্যাপ্লিকেশন চালাতে পেরেছিলেন এবং এটি সমস্ত লোড করেছে। দুর্ভাগ্যক্রমে, আমি এখনই লিঙ্কটি খুঁজে পাই না (সহায়তা?)।

তার উপর ভিত্তি করে, আমি এটি নিরাপদ বলে মনে করি যে হার্ডওয়্যার এবং আপনার কোডটি সীমাবদ্ধ কারণ, জেভিএম নয়।


আপনি আবার তাকান করতে পারেন? আমি এটি দেখতে চাই - এটি আকর্ষণীয় বলে মনে হয় এবং সমর্থন করে যে কার্যকরী ভাষাগুলি পুরো কোর জুড়ে স্কেল করা সহজ support
থরবজর্ন রাভন অ্যান্ডারসন

আপনি কি একটি লিঙ্ক প্রদান করতে পারেন? আমি জানি যে ক্লিফ ক্লিক, জুনিয়র, আজুল সিস্টেমের লিড ইঞ্জিনিয়ার রিচ হিকির পিঁপড়া কলোনী সিমুলেশনটি আজুলের বৃহত্তম জেসিএ সিস্টেমে চালিয়েছে (আজুল ভেগা 3 সিরিজ 7300 মডেল 7380 ডি: আজুলসিস্টেমস.কম / প্রোডাক্টস / কমপুট_ অ্যাপ্লিকেশন_স্প্যাকটিএমটি ) 864 কোর এবং 768 সহ গিগাবাইট র‌্যাম এবং 700০০ পিঁপড়ারা 700০০ কোরের বেশি আয় করতে পেরেছিল। তবে 9000 কোর, এটি বেশ চিত্তাকর্ষক। এ কেমন যন্ত্র ছিল?
জার্গ ডব্লু মিট্টাগ

এটি "অ্যান্টস" সিমুলেশনটি আমি বিশ্বাস করি - এখানে একটি লিঙ্ক রয়েছে যেখানে রিচ হিকি (ক্লোজার স্রষ্টা) এ সম্পর্কে কথা বলেছেন - blip.tv/clojure/clojure-concurrency-819147 । এটি 800+ কোর সহ কিছু বড় আজুল সিস্টেম বাক্সে ছিল, মূলত ক্লোজুর মাল্টি-কোর সম্মতিতে পরিচালনার ক্ষেত্রে কতটা ভাল তা প্রদর্শন করে।
মাইক্রা

@ মিমের লাইনগুলির মেয়াদ শেষ হয়ে গেছে।
থোরবজর্ন রাভন অ্যান্ডারসন

2

চার্লির ডিএলাইকএকোড শ্রেণীর সাথে চারপাশে খেলার পরে মনে হচ্ছে জাভা থ্রেড স্ট্যাকের আকারটি আপনি কতগুলি থ্রেড তৈরি করতে পারেন তার একটি বিশাল অংশ।

- এক্সএসএস সেট জাভা থ্রেড স্ট্যাকের আকার

উদাহরণ স্বরূপ

java -Xss100k DieLikeADog

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


13
আমরা কি এটির নামকরণ করতে পারি ডায়লাইক্যাট? এটি চালানো না হওয়া অবধি এটি মৃত বা জীবিত হবে না।
গুডউইন

এক্সিকিউটরগুলিকে নির্দেশ করার জন্য আপনাকে ধন্যবাদ, লোকেরা আরও বেশিবার এটি ব্যবহার করা উচিত। তবে Runnable/ Callableসত্যিকারের ধারাবাহিকভাবে চালনার দরকার হলে এটি কাজ করবে না , যেমন কখন যোগাযোগ পরিচালনা করতে হয়। তবে এটি এসকিউএল প্রশ্নের জন্য উপযুক্ত।
ম্যাথিউউ


0

থ্রেডের সর্বাধিক সংখ্যা নিম্নলিখিত বিষয়গুলির উপর নির্ভর করে:

  • মাইক্রোপ্রসেসর, র‌্যামের মতো হার্ডওয়্যার কনফিগারেশন।
  • অপারেটিং সিস্টেম এটি 32-বিট বা -৪-বিট হোক
  • রান পদ্ধতির ভিতরে কোড। যদি রান পদ্ধতির অভ্যন্তর কোডটি বিশাল হয় তবে একক থ্রেড অবজেক্টের আরও মেমরির প্রয়োজন হবে

  • 0

    আধুনিক (systemd) লিনাক্স সিস্টেমের জন্য অতিরিক্ত তথ্য।

    মানগুলির এইগুলি সম্পর্কে অনেকগুলি সংস্থান রয়েছে যা টুইঙ্কের প্রয়োজন হতে পারে (যেমন কীভাবে সর্বোচ্চ সংখ্যক জেভিএম থ্রেড বাড়ানো যায় (লিনাক্স bit৪ বিট) ); তবে সিস্টেমেড "টাস্কম্যাক্স" সীমাটি একটি নতুন সীমা চাপিয়ে দেওয়া হয়েছে যা সিগ্রুপে পিডস.ম্যাক্স সেট করে।

    লগইন সেশনের জন্য ইউজারটাস্কম্যাক্স ডিফল্ট কার্নেল সীমাবদ্ধতার 33% পিডস_ম্যাক্স (সাধারণত 12,288) হয় এবং /etc/systemd/logind.conf এ ওভাররাইড করা যায়।

    পরিষেবাগুলির জন্য ডিফল্ট টাস্কম্যাক্স ডিফল্ট কর্নেল সীমাবদ্ধতার 15% পিডস_ম্যাক্স (সাধারণত 4,915) থাকে। আপনি "systemctl সম্পাদনা" এ টাস্কম্যাক্স সেট করে বা /etc/systemd/system.conf এ ডিফল্ট টাস্কম্যাক্স আপডেট করে পরিষেবাটির জন্য ওভাররাইড করতে পারেন


    0

    বছর 2017 ... DieLikeADog ক্লাস।

    নতুন থ্রেড # 92459 থ্রেড "মূল" java.lang.OutOfMemoryError ব্যতিক্রম: নতুন নেটিভ থ্রেড তৈরি করতে অক্ষম

    i7-7700 16 জিবি র‌্যাম


    অফকোর্সের উত্তরগুলি পৃথক হবে। আমি 6 গিগাবাইট র‌্যামের সাথে 10278 পেয়েছি।
    জ্যামি

    -4

    আপনি যে কোনও সংখ্যক থ্রেড প্রক্রিয়া করতে পারেন; কোন সীমা নেই। মুভি দেখার সময় এবং নেটবিয়ানগুলি ব্যবহার করার সময় আমি নীচের কোডটি চালিত করেছি এবং এটি মেশিনটি না থামিয়ে / সঠিকভাবে কাজ করেছে। আমি মনে করি আপনি এই প্রোগ্রামটির চেয়ে আরও বেশি থ্রেড রাখতে পারেন।

    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();
            }
        }
    }

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

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

    1
    তবে, অল্প সময়ের পরে, আমার মেশিনে mainএকটি নিক্ষেপ করবে OutOfMemoryError, এটি বলে যে এটি আর কোনও থ্রেড তৈরি করতে পারে না। সম্ভবত @ অ্যানিলপাল, আপনি এটি লক্ষ্য করেন নি। আমি main(..)ত্রুটি ছুঁড়ে দেওয়ার পরে নতুন থ্রেড তৈরি করা বন্ধ করে দিলে স্পষ্টভাবে দেখার জন্য, পদ্ধতিটিতে অন্য মুদ্রণ বিবৃতিটি অন্তর্ভুক্ত করার পরামর্শ দিয়েছি ।
    এভেজেনি সার্জিভ

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