এটি জাভা নিয়ে দীর্ঘদিনের অভিযোগ ছিল, তবে এটি মূলত অর্থহীন এবং সাধারণত ভুল তথ্যের উপর নির্ভর করে 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৪-বিট মেশিনগুলি সর্বব্যাপী হয়ে গেছে বলে আমি মনে করি না যে ভার্চুয়াল মেমরির আকারটি সম্পূর্ণ অপ্রাসঙ্গিক পরিসংখ্যানের আগে এটি দীর্ঘ হবে।
আবাসিক সেট আকার কখন গুরুত্বপূর্ণ?
আবাসিক সেট আকার হ'ল ভার্চুয়াল মেমরি স্পেসের সেই অংশটি যা আসলে র্যামে থাকে। যদি আপনার আরএসএস আপনার মোট শারীরিক স্মৃতির একটি উল্লেখযোগ্য অংশ হয়ে ওঠে, তবে এটি উদ্বেগ শুরু করার সময় হতে পারে। যদি আপনার আরএসএস আপনার সমস্ত শারীরিক স্মৃতি গ্রহণ করতে বৃদ্ধি পায় এবং আপনার সিস্টেমটি অদলবদল শুরু করে, দুশ্চিন্তা শুরু করার খুব ভাল সময় হয়েছে।
তবে আরএসএসও বিভ্রান্ত করছে, বিশেষত একটি হালকা বোঝা মেশিনে। কোনও প্রক্রিয়া দ্বারা ব্যবহৃত পৃষ্ঠাগুলি পুনরায় দাবি করতে অপারেটিং সিস্টেম প্রচুর পরিশ্রম ব্যয় করে না। এটি করে লাভ করার খুব কম সুবিধা রয়েছে এবং ভবিষ্যতে যদি প্রক্রিয়াটি পৃষ্ঠাটি স্পর্শ করে তবে ব্যয়বহুল পৃষ্ঠা ত্রুটির সম্ভাবনা রয়েছে। ফলস্বরূপ, আরএসএসের পরিসংখ্যানগুলিতে সক্রিয় ব্যবহারে নেই এমন প্রচুর পৃষ্ঠা অন্তর্ভুক্ত থাকতে পারে।
শেষের সারি
আপনি অদলবদল না করে, বিভিন্ন মেমরির পরিসংখ্যান আপনাকে কী বলছে সে সম্পর্কে অতিরিক্ত উদ্বিগ্ন হন না। সতর্কতার সাথে যে একটি বর্ধমান বর্ধমান আরএসএস কিছু ধরণের মেমরি ফাঁস নির্দেশ করতে পারে।
জাভা প্রোগ্রামের সাহায্যে, স্তূপের মধ্যে কী ঘটছে সেদিকে মনোযোগ দেওয়া আরও বেশি গুরুত্বপূর্ণ। ব্যবহৃত মোট স্থানের পরিমাণ গুরুত্বপূর্ণ, এবং এটি হ্রাস করতে আপনি নিতে পারেন এমন কয়েকটি পদক্ষেপ রয়েছে। জঞ্জাল সংগ্রহের ক্ষেত্রে আপনি যে পরিমাণ সময় ব্যয় করেছেন এবং স্তূপের কোন অংশ সংগ্রহ করছেন তা আরও গুরুত্বপূর্ণ।
ডিস্ক অ্যাক্সেস (অর্থাত্ একটি ডাটাবেস) ব্যয়বহুল, এবং মেমরিটি সস্তা। আপনি যদি অন্যটির জন্য একটি ব্যবসায় করতে পারেন তবে তা করুন।