জেভিএমগুলিতে কেন গাদা আকার স্থির করা হয়?


20

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন জেভিএমগুলি (আমি খুব বেশি পরীক্ষা করে দেখিনি, তবে আমি এটি কখনও দেখিনি যা এমনভাবে করেনি) একটি নির্দিষ্ট স্তূপের আকারে চালানো দরকার কেন? আমি জানি যে একটি সহজ সংকীর্ণ স্তূপে এটি প্রয়োগ করা আরও সহজ, তবে সান জেভিএম এখন এক দশকেরও বেশি বয়সী, তাই আমি তাদের কাছে এটির উন্নতি করার জন্য সময় দেওয়ার আশা করতাম।

প্রারম্ভকালে আপনার প্রোগ্রামের সর্বাধিক মেমরি আকারের সংজ্ঞা দেওয়ার প্রয়োজন 1960 এর দশকের কাজটি মনে হয় এবং তারপরে ওএস ভার্চুয়াল মেমরি পরিচালনার সাথে খারাপ মিথস্ক্রিয়া হয় (জিসি পুনরায় পুনরুদ্ধার করা ডেটা, জাভা প্রক্রিয়াটি কতটা মেমরির তা নির্ধারণ করতে অক্ষম ওএস দিক থেকে সত্যই ব্যবহার করে বিপুল পরিমাণ ভিএম স্থান নষ্ট হয়ে গেছে (আমি জানি, আপনি আপনার অভিনব 48 বিট মেশিনগুলিতে যত্ন নেন না ...))। আমি আরও অনুমান করি যে JVM (EE অ্যাপ্লিকেশন সার্ভার, ওএসজি) এর অভ্যন্তরে ছোট অপারেটিং সিস্টেমগুলি তৈরির বিভিন্ন দুঃখজনক প্রচেষ্টা অন্তত আংশিকভাবে এই পরিস্থিতিতে দোষারোপ করা হবে, কারণ কোনও সিস্টেমে একাধিক জাভা প্রক্রিয়া চালানো অদৃশ্য সম্পদের দিকে পরিচালিত করে কারণ আপনাকে হ'ল তাদের প্রত্যেককে মেমরিটি শিখতে ব্যবহার করতে পারে give

আশ্চর্যের বিষয় হল, গুগল এ নিয়ে ক্ষোভের ঝড় তুলেনি যেটি আমি প্রত্যাশা করব, তবে তারা হয়ত লক্ষ লক্ষ লোকের নীচে চাপা পড়ে থাকতে পারে স্থির স্তূপের আকার সম্পর্কে সন্ধান করে এবং এটি কেবল সত্যের জন্য গ্রহণ করে।


ইভি অ্যাপ্লিকেশন সার্ভারগুলির নকশাটি এই "পরিস্থিতি" ছাড়াই এমনকি সঠিক ধারণা তৈরি করবে কারণ জেভিএম নিজেই কিছু স্থান প্রয়োজন, এবং থ্রেডগুলির মধ্যে স্যুইচিং প্রক্রিয়াগুলির মধ্যে স্যুইচিংয়ের চেয়ে সস্তা - এটি সেই জিনিসগুলির মধ্যে একটি যা জাভাকে 90 এর দশকের শেষের দিকে বড় করে তুলেছিল।
মাইকেল বর্গওয়ার্ট

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

2
এটি এক প্রকারের রেন্ট, তবে এটি জাভা ভিত্তিক প্ল্যাটফর্মটি লেখার এবং পরিচালনা করার জন্য বছরের পর বছর অভিজ্ঞতা দ্বারা অবহিত করা হয়। আপনি যদি অদলবদল না করেন (কারণ এটি চালানোর প্রক্রিয়া বরাদ্দের জন্য জায়গা ছাড়ার আগ পর্যন্ত 20 মিনিটের জন্য এটি আপনার সিস্টেমটিকে প্রতিক্রিয়াহীন করে তুলবে) এবং স্থায়িত্বের কারণে মেমরির ওভারকমিট বন্ধ করে দেওয়া হয়েছে (ওওএম কিলার ক্ষতিগ্রস্থদের বাছাইয়ের ক্ষেত্রে খুব ভাল নয়) ), আপনি ভিএম স্পেস সম্পর্কে যত্নবান এবং নীচের লোকেরা যা বোঝায় তা বিপরীতে, -Xmx2048m দিয়ে একটি জাভা ভিএম চালু করার সাথে সাথে একটি ভেরিয়েবল সহ একটি প্রোগ্রামের জন্য 2 জিবি ভার্চুয়াল মেমরি (কমপক্ষে আমার সান জেভিএম-তে) বরাদ্দ করা হবে।
থিমল

দুর্দান্ত প্রশ্ন। একই জিনিস ভাবছি। তবে এখানে Q এবং উত্তরগুলি উপস্থাপন করা কোন "সত্য"?
মার্টিন বা

আপনি যে প্রতিক্রিয়াগুলি সন্ধান করছেন তার জন্য সূর্য বাগ ট্র্যাকারটি কেবল মোশি ... যেমন এখানে , এখানে এবং এখানে । ঐ পড়ুন এবং অকৃতজ্ঞতা ক্রোধ :) মনে
বেসিক

উত্তর:


23

আপনি ভুল. জেভিএমগুলির হিপ আকার স্থির নয়, কেবল সীমাবদ্ধ:

  • -এক্সএমএক্স সর্বোচ্চ হিপ মেমরির আকার সেট করে
  • -Xms সর্বনিম্ন হিপ মেমরির আকার নির্ধারণ করে

একটি উচ্চতর সীমা নির্ধারণ বিভিন্ন কারণে প্রয়োজনীয় necessary প্রথমে এটি আবর্জনা সংগ্রহকারীকে বলে যে কখন কার্যকর হবে। দ্বিতীয়ত, এটি জেভিএমকে অত্যধিক মেমরি গ্রহণ করে পুরো মেশিনটি আটকে রাখা থেকে বাধা দেয়। ন্যূনতম হিপ আকারটি মেমরির বহিঃপ্রকাশ চালিয়ে যাওয়া রোধ করার জন্য প্রোগ্রামটির কমপক্ষে প্রয়োজনীয় মেমরির পরিমাণ সংরক্ষণ করতে দরকারী (


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

@ratchetfreak যা আমার দ্বিতীয় অনুমান ;-)
ইউজার 281377

@ ব্যবহারকারী ২28১1377 case যদি এটি হয় তবে সি # কীভাবে সর্বোচ্চ গাদা মেমরির আকার ছাড়াই ঠিক চলতে পারে?
নভেম্বরে 5'13 সেপ্টেম্বর 1813

সেমিওর্স: আমি কেবল অনুমান করতে পারি। সম্ভবত জাভা বৃহত সার্ভারগুলিতে লক্ষ্যবস্তু হয়েছে, যেখানে অনেক অ্যাপ্লিকেশন সংস্থানগুলি ভাগ করে এবং কঠোরভাবে প্রয়োগ করা সীমাটি কাঙ্ক্ষিত, যখন .NET বরং পিসি এবং আরও ছোট, আরও উত্সর্গীকৃত সার্ভারগুলির জন্য তৈরি।
ব্যবহারকারী 281377

@ ইউজার ২13১777777: আমি যে জাভা অ্যাপ্লিকেশনগুলি ব্যবহার করেছি যেগুলি প্রচুর পরিমাণে শেষ হয়েছে তা সাধারণত খুব খারাপভাবে পরিচালনা করে, সাধারণত কেবল ক্র্যাশ হয় বা তারপরে খুব ফ্লেকি হয়। এবং এএসপিএনটি বড় এবং ছোট উভয় সার্ভারগুলিতে ঠিক আছে। আমি যা সত্যিই পাই না তা ডিফল্টরূপে, জাভা এই সীমাটি প্রয়োগ করে। আমি তাদের সিদ্ধান্তের পিছনে যুক্তিটি শুনতে পছন্দ করব ... আমি নিশ্চিত তাদের কাছে ভাল কারণ ছিল।
22: 22 তে সেন্টারসেস

6

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

(এফডাব্লুআইডাব্লু, আপনাকে অ্যাপলের ডারউইন প্রাক ম্যাকোস সংস্করণগুলির অধীনে একটি প্রোগ্রামের মেমরির প্রয়োজনীয়তাগুলি উল্লেখ করতে হয়েছিল [যাইহোক সিস্টেম 7 অবধি, যা আমি সর্বশেষে ব্যবহার করেছি], যা ৮০ এর দশকে ভাল ছিল))


1
+1 - (1) একমাত্র উত্তর যা প্রকৃতপক্ষে প্রশ্নটিকে সম্বোধন করেছে, এবং (2) প্রশংসনীয়।
kdgregory

2

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

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

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

একটি বৃহত গাদা হতে পারে কেবলমাত্র "বর্জ্য" হ'ল অদলবদল স্থান, কারণ সমস্ত লিখনযোগ্য বিভাগের অদলবদল থেকে একটি প্রতিশ্রুতি প্রয়োজন। তবে এটি সিস্টেম ডিজাইনের অংশ: আপনি যদি একই বাক্সে প্রচুর জেভিএম চলমান রাখতে চান তবে হয় আপনার সোয়াপ বাড়াতে বা তাদের গাদা বরাদ্দ হ্রাস করুন। যদি তারা মারতে শুরু করে তবে আপনি সিস্টেমের সাথে খুব বেশি চেষ্টা করার চেষ্টা করছেন; আরও মেমরি কিনুন (এবং যদি আপনি এখনও 32-বিট প্রসেসর চালাচ্ছেন তবে একটি নতুন বাক্স কিনুন)।


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

@ বেন - হ্যাঁ, আপনি ঠিক বলেছেন। এবং আমার দ্বিতীয় বাক্যটি বিকল্প আছে যে উল্লেখ করে। তবে আমি একমত নই যে স্থির আকারের হিপ হ'ল সাধারণ ক্ষেত্রে জিসি পরিচালনা করার ভুল উপায়। সঠিকভাবে সুরযুক্ত জেভিএম "ডান" হিপ আকারটি ব্যবহার করে; আমার অভিজ্ঞতায় দীর্ঘ জিসি বিরতি ঘটে যখন জেভিএম সঠিকভাবে সুর করা হয়নি। এবং প্রায়শই "ডান" হিপ আকারটি আপনার ভাবার চেয়ে অনেক ছোট smaller
কেডগ্রিগরি

-2

হিসাবে ব্যবহারকারী 281377 বলছে, আপনি কেবল আপনার প্রক্রিয়া কতটা মেমরি গ্রাস করতে পারে তার একটি উচ্চতর সীমা নির্দিষ্ট করে। অবশ্যই, অ্যাপ্লিকেশনটি কেবল এটির প্রয়োজনীয় স্থানটি দখল করবে।

কোনও ডিফল্ট উপরের সীমা থাকা উচিত কিনা তা অন্য প্রশ্ন এবং পক্ষে এবং বিপরীত উভয়ই।

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