লিনাক্সের আওতায় জাভা থেকে ভার্চুয়াল মেমরির ব্যবহার, খুব বেশি মেমরি ব্যবহৃত হয়


259

লিনাক্সের অধীনে জাভা অ্যাপ্লিকেশন নিয়ে আমার সমস্যা আছে।

আমি যখন অ্যাপ্লিকেশনটি চালু করি, তখন ডিফল্ট সর্বাধিক হিপ আকার (MB৪ এমবি) ব্যবহার করে আমি শীর্ষস্থানীয় অ্যাপ্লিকেশনটি ব্যবহার করে দেখি যে অ্যাপ্লিকেশনটিতে 240 এমবি ভার্চুয়াল মেমরি বরাদ্দ করা হয়েছে। এটি কম্পিউটারে কিছু অন্যান্য সফ্টওয়্যার নিয়ে কিছু সমস্যা তৈরি করে, যা তুলনামূলক সংস্থান-সীমিত।

সংরক্ষিত ভার্চুয়াল মেমরিটি যাই হোক না কেন ব্যবহার করা হবে, যতদূর আমি বুঝতে পারি, কারণ আমরা একবার গাদা সীমাতে পৌঁছলে একটি OutOfMemoryErrorনিক্ষেপ করা হয়। আমি উইন্ডোজের নীচে একই অ্যাপ্লিকেশনটি চালিয়েছি এবং আমি দেখতে পাচ্ছি যে ভার্চুয়াল মেমরির আকার এবং হিপ আকার একই রকম।

লিনাক্সের অধীনে জাভা প্রক্রিয়াটির জন্য ভার্চুয়াল মেমরিটি কনফিগার করতে পারি এমন কি আছে?

সম্পাদনা 1 : সমস্যাটি গাদা নয়। সমস্যাটি হ'ল যদি আমি উদাহরণস্বরূপ, 128 মেগাবাইটের একটি হ্যাপ সেট করি তবে এখনও লিনাক্স 210 মেগাবাইট ভার্চুয়াল মেমরির বরাদ্দ করে, যা কখনও প্রয়োজন হয় না * **

সম্পাদনা 2 : ব্যবহার ulimit -vভার্চুয়াল মেমরির পরিমাণ সীমাবদ্ধ করতে দেয়। যদি আকার সেটটি 204 মেগাবাইটের নীচে থাকে তবে অ্যাপ্লিকেশনটি চলবে না যদিও এটির জন্য 204 এমবি প্রয়োজন নেই, কেবলমাত্র 64 এমবি। সুতরাং আমি বুঝতে চাই যে জাভা কেন এত ভার্চুয়াল মেমরির প্রয়োজন। এটি কি পরিবর্তন করা যায়?

সম্পাদনা 3 : সিস্টেমে চলছে আরও বেশ কয়েকটি অ্যাপ্লিকেশন। এবং সিস্টেমটির ভার্চুয়াল মেমরির সীমা রয়েছে (মন্তব্যগুলি, গুরুত্বপূর্ণ বিশদ থেকে)।


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

2
সিস্টেমে চলছে আরও বেশ কয়েকটি অ্যাপ্লিকেশন, যা এম্বেড করা আছে। এবং সিস্টেমটির ভার্চুয়াল মেমরির সীমা রয়েছে।
মারিও অর্টেগেন

আহ, শয়তান বিবরণে রয়েছে
বাসেরো

জাভা কোন প্রয়োগ আপনি ব্যবহার করছেন। আইআইআরসি, বগ স্ট্যান্ডার্ড (নন-ওপেনজেডিকে) ফ্রি সান জেআরই এম্বেড ব্যবহারের জন্য লাইসেন্সপ্রাপ্ত নয়।
টম হাটিন -

আমি "এমবেডড" অংশটি মিস করেছি বলে মনে করি ... এটি মেমরি সীমাবদ্ধ এবং হার্ডওয়্যারটি কাস্টমাইজ করা হয়েছে, তবে এটি এখনও একটি স্ট্যান্ডার্ড কম্পিউটার
মারিও অর্টেগন

উত্তর:


630

এটি জাভা নিয়ে দীর্ঘদিনের অভিযোগ ছিল, তবে এটি মূলত অর্থহীন এবং সাধারণত ভুল তথ্যের উপর নির্ভর করে on সাধারন বাক্যায়নটি "জাভাতে হ্যালো ওয়ার্ল্ডে 10 মেগাবাইট লাগে! কেন এটির দরকার নেই?" ওয়েল, এখানে একটি 64-বিট জেভিএম দাবিতে হ্যালো ওয়ার্ল্ড করার একটি উপায় রয়েছে 4 গিগাবাইটের কমপক্ষে একক করে পরিমাপ করার ...

java -Xms1024m -Xmx4096m com.example.Hello

স্মৃতি মাপার বিভিন্ন উপায়

লিনাক্স-এ, শীর্ষ কমান্ড আপনাকে মেমরির জন্য বিভিন্ন নম্বর দেয়। হ্যালো ওয়ার্ল্ড উদাহরণ সম্পর্কে এটি যা বলেছে তা এখানে:

  পিআইডি ব্যবহারকারী পিআর এনআই ভাইরাস রি এসআরআর এস% সিপিইউ% মেম সময় + কম্যান্ড
 2120 কেজি গ্রেগরি 20 0 4373 মি 15 মি 7152 এস 0 0.2 0: 00.10 জাভা
  • ভিআইআরটি হ'ল ভার্চুয়াল মেমরি স্পেস: ভার্চুয়াল মেমরি মানচিত্রের সমস্ত কিছুর যোগফল (নীচে দেখুন)। এটি মূলত অর্থহীন, যখন তা না থাকে (নীচে দেখুন) বাদে।
  • আরইএস হ'ল আবাসিক সেট আকার: বর্তমানে র‍্যামে থাকা পৃষ্ঠাগুলির সংখ্যা। প্রায় সব ক্ষেত্রেই, "খুব বড়" বলার সময় আপনার কেবলমাত্র এটিই ব্যবহার করা উচিত। তবে এটি এখনও খুব ভাল নম্বর নয়, বিশেষত জাভা সম্পর্কে কথা বলার সময়।
  • SHR হ'ল আবাসিক মেমরির পরিমাণ যা অন্যান্য প্রক্রিয়াগুলির সাথে ভাগ করা হয়। একটি জাভা প্রক্রিয়াটির জন্য, এটি সাধারণত ভাগ করা লাইব্রেরি এবং মেমরি-ম্যাপযুক্ত জারিফিলসের মধ্যে সীমাবদ্ধ। এই উদাহরণে, আমার কেবল একটি জাভা প্রক্রিয়া চলছিল, সুতরাং আমি সন্দেহ করি যে 7 কে ওএস দ্বারা ব্যবহৃত লাইব্রেরির ফলাফল।
  • SWAP ডিফল্ট হিসাবে চালু করা হয় না, এবং এখানে প্রদর্শিত হয় না। এটি বর্তমানে ডিস্কে বাসিন্দা ভার্চুয়াল মেমরির পরিমাণটি নির্দেশ করে, এটি আসলে অদলবদলে রয়েছে কিনা । ওএস হ'ল সক্রিয় পৃষ্ঠাগুলি র‍্যামে রাখার বিষয়ে খুব ভাল, এবং অদলবদলের একমাত্র নিরাময় হ'ল (1) আরও মেমরি কিনুন, বা (2) প্রক্রিয়াগুলির সংখ্যা হ্রাস করুন, সুতরাং এই সংখ্যাটি উপেক্ষা করা ভাল।

উইন্ডোজ টাস্ক ম্যানেজারের পরিস্থিতি কিছুটা জটিল। উইন্ডোজ এক্সপির অধীনে, "মেমোরি ইউজেজ" এবং "ভার্চুয়াল মেমরি সাইজ" কলাম রয়েছে, তবে অফিসিয়াল ডকুমেন্টেশনগুলি কী বোঝায় সে সম্পর্কে নীরব। উইন্ডোজ ভিস্তা এবং উইন্ডোজ 7 আরও কলাম যুক্ত করে এবং সেগুলি আসলে নথিভুক্ত হয় । এর মধ্যে "ওয়ার্কিং সেট" পরিমাপ সবচেয়ে কার্যকর; এটি লিনাক্সে RES এবং SHR এর যোগফলের সাথে মোটামুটি s

ভার্চুয়াল মেমরি মানচিত্র বোঝা

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

0000000040000000 36 কে আরএক্স-- / ওশর / লোকাল / জাভা / জেডিকি-1.6-x64/bin/java
0000000040108000 8 কে আরডাব্লু---- / সামার / লোকাল / জাভা / জেডিকি-1.6-x64/bin/java
0000000040eba000 676K rwx-- [আনন]
00000006fae00000 21248 কে rwx-- [আনন]
00000006fc2c0000 62720 কে rwx-- [আনন]
0000000700000000 699072K rwx-- [আনন]
000000072aab0000 2097152K rwx-- [আনন]
00000007aaab0000 349504K rwx-- [আনন]
00000007c0000000 1048576K rwx-- [আনন]
...
00007fa1ed00d000 1652K r-xs- /usr/local/java/jdk-1.6-x64/jre/lib/rt.jar
...
00007fa1ed1d3000 1024K rwx-- [আনন]
00007fa1ed2d3000 4K ----- [আনোন]
00007fa1ed2d4000 1024K rwx-- [আনন]
00007fa1ed3d4000 4K ----- [আনোন]
...
00007fa1f20d3000 164 কে আরএক্স-- / ওশার / লোকাল / জাজা / জেডিকি-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f20fc000 1020K ----- / শ্রোতা / লোকাল / জাভা / জেডিকি-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f21fb000 28K rwx-- /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
...
00007fa1f34aa000 1576K rx-- /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3634000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3833000 16 কে আরএক্স-- / লিবি / এক্স 86_64-linux-gnu/libc-2.13.so
00007fa1f3837000 4K rwx-- /lib/x86_64-linux-gnu/libc-2.13.so
...

বিন্যাসটির একটি দ্রুত ব্যাখ্যা: প্রতিটি সারিটি বিভাগটির ভার্চুয়াল মেমরি ঠিকানা দিয়ে শুরু হয়। এটি বিভাগের আকার, অনুমতি এবং বিভাগটির উত্স অনুসরণ করে। এই শেষ আইটেমটি হয় একটি ফাইল বা "আনন", যা এমএমএপের মাধ্যমে বরাদ্দকৃত মেমরির একটি ব্লক নির্দেশ করে ।

উপরে থেকে শুরু করে, আমাদের আছে

  • জেভিএম লোডার (যেমন, আপনি টাইপ করার পরে প্রোগ্রামটি চালু হয় java)। এটি খুব ছোট; এটি যা কিছু করে তা ভাগ করে নেওয়া লাইব্রেরিতে লোড করা হয় যেখানে আসল জেভিএম কোড সঞ্চয় করা হয়।
  • জাভা হিপ এবং অভ্যন্তরীণ ডেটা ধারণ করে আনন ব্লকের একটি গুচ্ছ। এটি একটি সান জেভিএম, সুতরাং গাদাটি একাধিক প্রজন্মের মধ্যে বিভক্ত হয়ে গেছে, যার প্রতিটি তার নিজস্ব স্মৃতি ব্লক। নোট করুন যে JVM -Xmxমানের উপর ভিত্তি করে ভার্চুয়াল মেমরির স্থান বরাদ্দ করে ; এটি এটি একটি সংকীর্ণ গাদা করতে দেয়। -Xmsমান বলতে গাদা কত হল "ব্যবহারে" যখন প্রোগ্রাম আরম্ভ, এবং ট্রিগার গার্বেজ কালেকশন হিসেবে যে সীমা ধরাই তাঁর স্বভাব অভ্যন্তরীণভাবে ব্যবহৃত হয়।
  • একটি স্মৃতি-ম্যাপযুক্ত জেআরফিল, এই ক্ষেত্রে ফাইলটি "জেডিকে ক্লাসগুলি" ধারণ করে। আপনি যখন একটি জেআর মেমরি-মানচিত্র করেন, আপনি খুব দক্ষতার সাথে তার মধ্যে ফাইলগুলি অ্যাক্সেস করতে পারেন (প্রতিবার এটি শুরু থেকে পড়ার বিপরীতে)। সান জেভিএম ক্লাসপথের সমস্ত জারগুলিকে মেমরি-মানচিত্র তৈরি করবে; যদি আপনার অ্যাপ্লিকেশন কোডটির কোনও জেআর অ্যাক্সেসের প্রয়োজন হয় তবে আপনি এটিকে মেমরি-ম্যাপও করতে পারেন।
  • দুটি থ্রেডের জন্য প্রতি-থ্রেড ডেটা। 1 এম ব্লকটি থ্রেড স্ট্যাক। 4 কে ব্লকের জন্য আমার কাছে খুব ভাল ব্যাখ্যা ছিল না, তবে @ এরিকসো এটিকে "গার্ড ব্লক" হিসাবে চিহ্নিত করেছেন: এতে পড়ার / লেখার অনুমতি নেই, সুতরাং অ্যাক্সেস করা থাকলে সেগমেন্টের ত্রুটি ঘটবে এবং জেভিএম এটি ধরা এবং অনুবাদ করে এটি একটি StackOverFlowError। একটি সত্যিকারের অ্যাপ্লিকেশনটির জন্য, আপনি কয়েক ডজন দেখতে পাবেন যদি না মেমরির মানচিত্রের মাধ্যমে কয়েক হাজার এন্ট্রি পুনরাবৃত্তি হয়।
  • প্রকৃত জেভিএম কোড ধারণ করে এমন একটি ভাগ করা লাইব্রেরি। এর মধ্যে বেশ কয়েকটি রয়েছে।
  • সি স্ট্যান্ডার্ড লাইব্রেরির জন্য ভাগ করা লাইব্রেরি। এটি এমন অনেকগুলি জিনিসের মধ্যে একটি যা জেভিএম লোড করে যা জাভাটির কঠোর অংশ নয়।

ভাগ করা লাইব্রেরিগুলি বিশেষ আকর্ষণীয়: প্রতিটি ভাগ করা লাইব্রেরিতে কমপক্ষে দুটি বিভাগ থাকে: লাইব্রেরির কোড সহ একটি পঠনযোগ্য বিভাগ এবং লাইব্রেরির জন্য বিশ্বব্যাপী প্রতি-প্রক্রিয়া ডেটা রয়েছে এমন একটি পঠন-রচনা বিভাগ (আমি জানি না কী অনুমতি ছাড়াই বিভাগটি; আমি এটি কেবলমাত্র x64 লিনাক্সে দেখেছি)। লাইব্রেরির পঠনযোগ্য অংশটি লাইব্রেরি ব্যবহার করে এমন সমস্ত প্রক্রিয়ার মধ্যে ভাগ করা যায়; উদাহরণস্বরূপ, libcভার্চুয়াল মেমরির 1.5M ভাগ রয়েছে যা ভাগ করা যায়।

ভার্চুয়াল মেমরির আকার কখন গুরুত্বপূর্ণ?

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

ভার্চুয়াল মেমরির আকারটি গুরুত্বপূর্ণ যেখানে আপনি যদি 32-বিট অপারেটিং সিস্টেমে চালিত হন তবে যেখানে আপনি কেবলমাত্র 2Gb (বা কিছু ক্ষেত্রে, 3Gb) প্রক্রিয়া ঠিকানার স্থান বরাদ্দ করতে পারেন। সেক্ষেত্রে আপনি খুব কম সংস্থান নিয়ে কাজ করছেন এবং কোনও বড় ফাইলকে মেমরি-মানচিত্রের জন্য আপনার গাদা আকার হ্রাস করতে বা প্রচুর থ্রেড তৈরি করার মতো ট্রেডঅফস করতে হতে পারে।

তবে, 64৪-বিট মেশিনগুলি সর্বব্যাপী হয়ে গেছে বলে আমি মনে করি না যে ভার্চুয়াল মেমরির আকারটি সম্পূর্ণ অপ্রাসঙ্গিক পরিসংখ্যানের আগে এটি দীর্ঘ হবে।

আবাসিক সেট আকার কখন গুরুত্বপূর্ণ?

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

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

শেষের সারি

আপনি অদলবদল না করে, বিভিন্ন মেমরির পরিসংখ্যান আপনাকে কী বলছে সে সম্পর্কে অতিরিক্ত উদ্বিগ্ন হন না। সতর্কতার সাথে যে একটি বর্ধমান বর্ধমান আরএসএস কিছু ধরণের মেমরি ফাঁস নির্দেশ করতে পারে।

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

ডিস্ক অ্যাক্সেস (অর্থাত্ একটি ডাটাবেস) ব্যয়বহুল, এবং মেমরিটি সস্তা। আপনি যদি অন্যটির জন্য একটি ব্যবসায় করতে পারেন তবে তা করুন।


9
আপনার অ্যাকাউন্টে নেওয়া উচিত যে মেমরির যে অংশগুলি বর্তমানে অদলবদল হয়েছে সেগুলি আরইএস পরিমাপ থেকে অনুপস্থিত। সুতরাং আপনার কম RES মান থাকতে পারে তবে কেবলমাত্র অ্যাপ্লিকেশনটি নিষ্ক্রিয় ছিল এবং বেশিরভাগ গাদা ডিস্কে সরিয়ে নেওয়া হয়েছিল। জাভা অদলবদল করার জন্য খুব খারাপ কাজ করে: প্রতিটি সম্পূর্ণ জিসিতে বেশিরভাগ হিপ হাঁটা এবং অনুলিপি করা হয় যদি আপনার বেশিরভাগ গাদা সোয়াপ থাকে তবে জিসিকে এটিকে সমস্ত আবার মূল স্মৃতিতে লোড করতে হবে।
jrudolph

1
গ্রেট উত্তর কেডগ্রিগরি! আমি একটি সিএফ ব্যবহার করে একটি এম্বেড করা পরিবেশে চলেছি যার কোন অদলবদল নেই। সুতরাং আপনার উত্তরের উপর ভিত্তি করে আমার সমস্ত ভিআইআরটি, সোয়াপ এবং এনএফএলটি মানগুলি মেমরি ম্যাপযুক্ত ফাইলগুলি থেকে আসে ... যা এখন মেঘে পরিণত হয়েছে। আপনি কি জানেন যে SWAP মান এমন পৃষ্ঠাগুলি উপস্থাপন করে যা মেমোরিতে এখনও লোড করা হয়নি বা যে পৃষ্ঠাগুলি মেমরি থেকে সরে গেছে, বা উভয়ই? কীভাবে আমরা সম্ভাব্য ছোটাছুটি করার ধারণাটি পেতে পারি (তারপরে অবিচ্ছিন্ন মানচিত্রটি পরিবর্তন করতে পারি)?
Jeach

2
@ জ্যাচ - আমি অবাক হয়েছি যে কোনও অদলবদলের খবর পাওয়া গেছে, তাই আমার "ট্রাভেল লিনাক্স" বুট করে (উবুন্টু 10.04 সহ একটি থাম্ব ড্রাইভ এবং কোনও স্ব্যাপ নেই)। আমি যখন "এসডব্ল্যাপ" কলামটি শীর্ষে সক্ষম করেছিলাম তখন দেখলাম গ্রহনের 509 মিটার ছিল। আমি যখন তখন এটি পিএমএপ দিয়ে দেখলাম তখন মোট ভার্চুয়াল স্পেস ছিল 650 মিটার। সুতরাং আমি সন্দেহ করি যে "SWAP" চিত্রটি কেবল স্মৃতিতে নয় এমনগুলি নয়, সমস্ত অন ডিস্ক পৃষ্ঠাগুলি উপস্থাপন করে।
কেডিগ্রিগরি

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

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

38

জাভা এবং গ্লিবসি> = 2.10 এর সাথে একটি ज्ञিত সমস্যা রয়েছে (এতে উবুন্টু> = 10.04, আরএইচইএল> = 6 রয়েছে)।

চিকিত্সা এই env সেট করা হয়। পরিবর্তনশীল:

export MALLOC_ARENA_MAX=4

আপনি যদি টমক্যাট চালাচ্ছেন তবে আপনি এটি TOMCAT_HOME/bin/setenv.shফাইলটিতে যুক্ত করতে পারেন ।

ডকারের জন্য এটি ডকফাইফিলে যুক্ত করুন

ENV MALLOC_ARENA_MAX=4

মালুক_আরএএনএএএমএক্স https://www.ibm.com/developerworks/commune/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en সেট করার বিষয়ে একটি আইবিএম নিবন্ধ আছে

এই ব্লগ পোস্ট বলেছেন

আবাসিক স্মৃতি মেমরি ফাঁস বা মেমরি বিভাজনের অনুরূপভাবে ক্রাইপিংয়ের জন্য পরিচিত।

এছাড়াও রয়েছে একটি মুক্ত জেডিকে বাগ জেডিকে -8193521 "গ্লিবসি ডিফল্ট কনফিগারেশন সহ মেমরির অপচয় করে"

আরও রেফারেন্সের জন্য গুগল বা এসও-তে MALLOC_ARENA_MAX অনুসন্ধান করুন।

বরাদ্দ মেমরির স্বল্প বিভাজনের জন্য অনুকূলকরণের জন্য আপনি অন্যান্য ম্যালোক বিকল্পগুলিও টিউন করতে চাইতে পারেন:

# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536

এই উত্তরটি আমাকে সত্যিই একটি টোমইই সার্ভারের সাথে একটি 64 বিট উবুন্টু সার্ভারে সহায়তা করেছিল যা "স্মৃতি-গ্রাহক" হিসাবে একটি লিট পেয়েছিল। আইবিএম-নিবন্ধটির লিঙ্কটি একটি গভীর ব্যাখ্যা। এই ভাল ইঙ্গিত জন্য আবার ধন্যবাদ!
এমউইসনার

1
জেভিএম নেটিভ মেমরি ফাঁস হতে পারে যা একই ধরণের লক্ষণগুলির দিকে পরিচালিত করে। স্ট্যাকওভারফ্লো . com/a/35610063/166062 দেখুন । আনক্লোজড জিজিআইপিআইপুট স্ট্রিম এবং জিজেআইপিআউটপুট স্ট্রিম উদাহরণগুলিও ফাঁসের একটি উত্স হতে পারে।
লারি হোতারি

3
জাভা 8-তে একটি জেভিএম বাগ রয়েছে, যার ফলস্বরূপ সীমাহীন নেটিভ মেমরির বৃদ্ধি ঘটে: বাগস.জাভা / বুগড্যাটাসেবা / ভিউ_বগ.ডো? বুগ_আইডি = জেডিকে-8164293 - এটি আপনাকে প্রভাবিত করে থাকলে MALLOC_ARENA_MAXআপনার স্মৃতিশক্তি বাড়িয়ে দিতে পারে, তবে না সমস্যাটি পুরোপুরি সমাধান করুন।
আউটফকফি

@ লরিহোটারী গ্লিবসি এবং রেডহ্যাট সংস্করণটি নির্দেশ করার জন্য আপনার প্রচেষ্টাকে সত্যই প্রশংসা করুন
স্যাম

2
জাভা 8u131 সম্পর্কিত JVM বাগ JDK-8164293 bugs.openjdk.java.net/browse/JDK-8178124 এর জন্য ব্যাকপোর্টেড বাগফিক্স রয়েছে ।
লারি হোতারি

9

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

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

-এক্সএক্স: রিজার্ভডকোডচিচি সাইজ = 32 মি কোড সংরক্ষিত কোড ক্যাশে আকার (বাইটে) - সর্বাধিক কোড ক্যাশে আকার। [সোলারিস 64৪-বিট, এএমডি ,64, এবং -রসভার x86: 48 মি; 1.5.0_06 এবং তার আগে, সোলারিস 64-বিট এবং এবং 64: 1024 মি।]

-এক্সএক্স: স্থায়ী জেনারেশনের ম্যাক্স্পার্মসাইজ = 64 মি আকার। [৫.০ এবং আরও নতুন: bit৪ বিট ভিএমএস ৩০% বড় আকারে মাপা হয়েছে; 1.4 amd64: 96 মি; ১.৩.১-অনুগ্রহ: 32 মি।]

এছাড়াও, আপনার অ্যাপ্লিকেশনের আসল পিক মেমরির ব্যবহারের সাথে আপনার -Xmx (সর্বোচ্চ হিপ আকার) যথাসম্ভব কাছাকাছি একটি মান হিসাবে সেট করা উচিত । আমি বিশ্বাস করি যে JVM- এর ডিফল্ট আচরণটি প্রতিবার এটি সর্বাধিক পর্যন্ত প্রসারিত করার সময় গাদা আকারের দ্বিগুণ হবে। যদি আপনি 32 এম হিপ দিয়ে শুরু করেন এবং আপনার অ্যাপ্লিকেশনটি 65 এম এ পৌঁছেছে, তবে গাদাটি 32 এম -> 64 এম -> 128 এম বৃদ্ধি পাবে।

আপনি ভিএমকে গাদা বাড়ানোর বিষয়ে কম আক্রমণাত্মক করার চেষ্টাও করতে পারেন:

-XX: MinHeapFreeRatio = 40 প্রসার এড়াতে জিসির পরে ন্যূনতম শতাংশ হিপ মুক্ত free

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


7

হটস্পটের জন্য সান জেভিএমের প্রচুর স্মৃতি দরকার এবং এটি ভাগ করা মেমরির রানটাইম লাইব্রেরিতে মানচিত্র করে।

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


হট স্পট অক্ষম করার বিকল্প কি?
মারিও অর্টেগন

সম্ভবত। আপনি যে JVM ব্যবহার করেন তার জন্য কমান্ড লাইন বিকল্পগুলি পরীক্ষা করুন।
থরবজর্ন রাভন অ্যান্ডারসন

3

কেবল একটি চিন্তা, তবে আপনি কোনও ulimit -vবিকল্পের প্রভাব পরীক্ষা করতে পারেন ।

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


আমার সমস্যাটি হ'ল এটি। আমার হিপ M৪ এম তে সেট করা রয়েছে তবে লিনাক্সের সংরক্ষণ রয়েছে ২০৪ এমবি B আমি যদি 204 এর নীচে ওলিমিট সেট করি তবে অ্যাপ্লিকেশনটি মোটেই চলবে না।
মারিও অর্টেগেন

আকর্ষণীয়: ইউলিমিট সেট করার ফলে অন্যান্য প্রক্রিয়াগুলির জন্য অনিচ্ছাকৃত পার্শ্ব-প্রতিক্রিয়া থাকতে পারে, কেন অ্যাপ্লিকেশনটি চালাতে সক্ষম নয় তা ব্যাখ্যা করে।
ভনসি

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

আপনি কি এটি একটি JRockit JVM দিয়ে চেষ্টা করেছেন?
ভনসি

যেহেতু জেভিএমের মেমরি বরাদ্দকরণ হিপ বরাদ্দ এবং পারম আকারের যোগফল (প্রথমটি -Xms এবং -Xmx বিকল্প ব্যবহার করে স্থির করা যেতে পারে), আপনি কি XX: PermSize এবং -XX: MaxPermSize এর সাহায্যে কিছু সেটিংস চেষ্টা করেছিলেন? (জেভিএম সংস্করণের উপর নির্ভর করে 32MB থেকে 64MB তে ডিফল্ট)?
ভোনসি

3

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

সম্পাদনা: এক্সএক্সের জন্য ছোট মান সেট করতে: ম্যাক্সহ্যাপফ্রিআটিও আপনাকে অবশ্যই সেট করতে হবে -XX: MinHeapFreeRatio Eg

java -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=25 HelloWorld

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

ডিফল্ট পরামিতি

শেষে, সর্বোচ্চ গাদা 905, ব্যবহৃত হিপ 378

মিনহ্যাপ 10, ম্যাক্সহীপ 25

শেষে, সর্বাধিক গাদা 722, ব্যবহৃত হিপ 378

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


1

সূর্যের জাভা ১.৪-এ মেমরির আকার নিয়ন্ত্রণ করতে নিম্নলিখিত যুক্তি রয়েছে:

-Xmsn মেমরি বরাদ্দ পুলের প্রাথমিক আকার, বাইটে উল্লেখ করুন। এই মানটি 1MB এর চেয়ে 1024 এর বেশি হতে হবে be কিলোবাইট নির্দেশ করতে K বা K অক্ষর যুক্ত করুন, বা মেগাবাইট নির্দেশ করতে m বা M অক্ষর যুক্ত করুন। ডিফল্ট মান 2MB। উদাহরণ:

           -Xms6291456
           -Xms6144k
           -Xms6m

-Xmxn মেমরি বরাদ্দ পুলের সর্বাধিক আকার, বাইটে উল্লেখ করুন। এই মানটি 2MB এর চেয়ে 1024 এর বেশি একক হতে হবে। কিলোবাইট নির্দেশ করতে K বা K অক্ষর যুক্ত করুন, বা মেগাবাইট নির্দেশ করতে m বা M অক্ষর যুক্ত করুন। ডিফল্ট মান 64MB। উদাহরণ:

           -Xmx83886080
           -Xmx81920k
           -Xmx80m

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html

জাভা 5 এবং 6 এর আরও কিছু আছে। Http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp দেখুন


1
আমার যে সমস্যাটি রয়েছে তা হ্যাপ সাইজের সাথে নয়, তবে ভার্চুয়াল মেমোরির পরিমাণের সাথে যা লিনাক্স দ্বারা নির্ধারিত হয়েছে
মারিও অর্টেগন

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

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

0

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

সতর্কতার সাথে, আপনি আরও কিছু JVM এরপরে সূর্যের চেয়ে আরও ছোট মেমরির পদক্ষেপ সহ চেষ্টা করতে পারেন, তবে আমি এখানে পরামর্শ দিতে পারি না।

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