জাভা প্রক্রিয়াতে স্মৃতি কী গ্রাস করে?


20

আমরা মাঝারি লোডের অধীনে জাভা প্রক্রিয়াটির মেমরি ব্যবহার তদন্তের চেষ্টা করছি।

  PID   USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  12663 test    20   0 8378m 6.0g 4492 S   43  8.4 162:29.95 java

যেমন আপনি দেখতে পাচ্ছেন আমাদের 6 জিবিতে আবাসিক স্মৃতি রয়েছে। এখন আকর্ষণীয় অংশটি হ'ল: এই প্যারামগুলির সাথে প্রক্রিয়াটি কার্যকর করা হয়:

  • -Xmx2048m
  • -Xms2048m
  • -XX: NewSize = 512m
  • -XX: MaxDirectMemorySize = 256m
  • ... আরও কিছু জন জিসি এবং স্টাফ জন্য

এই সেটিংস এবং প্রকৃত মেমরির ব্যবহারের দিকে তাকিয়ে আমরা এই প্রক্রিয়াটি কী ব্যবহার করবে এবং এটি আসলে কী ব্যবহার করে তা আমরা কী প্রত্যাশা করি তার পার্থক্য দেখতে আমরা হোঁচট খেয়ে যাই।

সাধারণত আমাদের স্মৃতি সমস্যা হিপ ডাম্প বিশ্লেষণ করে সমাধান করা হয় তবে এক্ষেত্রে আমাদের স্মৃতি স্তূপের বাইরে কোথাও ব্যবহৃত হয়।

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

সম্পাদনা 0

দেখে মনে হচ্ছে এটি হিপ সম্পর্কিত সমস্যা কারণ আমাদের এখনও সেখানে বেশ কিছু জায়গা রয়েছে:

jmap -heap 12663

ফলাফল (স্থান বাঁচাতে সম্পাদিত)

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize      = 2147483648 (2048.0MB)
NewSize          = 536870912 (512.0MB)
MaxNewSize       = 536870912 (512.0MB)
OldSize          = 1610612736 (1536.0MB)
NewRatio         = 7
SurvivorRatio    = 8
PermSize         = 21757952 (20.75MB)
MaxPermSize      = 85983232 (82.0MB)

New Generation: 45.7% used
Eden Space: 46.3% used
From Space: 41.4% used
To Space: 0.0% used
concurrent mark-sweep generation: 63.7% used
Perm Generation: 82.5% used

সম্পাদনা 1

পিএমএপ ব্যবহার করে আমরা দেখতে পাচ্ছি যে 64Mb এর বরাদ্দের বেশ কিছু পরিমাণ রয়েছে:

pmap -x 12663 | grep rwx | sort -n -k3 | less

ফলাফল স্বরূপ:

... a lot more of these 64Mb chunks
00007f32b8000000       0   65508   65508 rwx--    [ anon ] <- what are these?
00007f32ac000000       0   65512   65512 rwx--    [ anon ]
00007f3268000000       0   65516   65516 rwx--    [ anon ]
00007f3324000000       0   65516   65516 rwx--    [ anon ]
00007f32c0000000       0   65520   65520 rwx--    [ anon ]
00007f3314000000       0   65528   65528 rwx--    [ anon ] 
00000000401cf000       0  241904  240980 rwx--    [ anon ] <- Direct memory ?
000000077ae00000       0 2139688 2139048 rwx--    [ anon ] <- Heap ?

সুতরাং কীভাবে এটি সন্ধান করতে হবে যে এই 64 এমবি অংশগুলি? এগুলি কী ব্যবহার করছে? তাদের মধ্যে কী ধরনের ডেটা রয়েছে?

ধন্যবাদ


2
আমি ঠিক একই সমস্যা পেয়েছি ... এখানে আমার প্রশ্ন। stackoverflow.com/questions/18734389/… আপনার কি এই সম্পর্কে কোনও সমাধান আছে?
ডিপনাটটাইজ

উত্তর:


21

সমস্যাটি এই গ্লিবসি ইস্যুটির সাথে সম্পর্কিত হতে পারে ।

মূলত, যখন আপনার একাধিক থ্রেড বরাদ্দ মেমরি থাকে, গ্লিবসি লক কনট্রেশন এড়ানোর জন্য বরাদ্দ করার জন্য উপলব্ধ আখরড়ার সংখ্যা বাড়িয়ে তুলবে। একটি আখড়া M৪ এমবি বড় large উপরের সীমাটি কোর অ্যারেনার সংখ্যাটি 8 বার তৈরি করা। ইতিমধ্যে তালা থাকা এমন একটি আখড়াটিতে কোনও থ্রেড অ্যাক্সেস করার সময় অ্যারেনাস তৈরি করা হবে যাতে এটি সময়ের সাথে বাড়তে পারে grows

জাভাতে যেখানে আপনি থ্রেড দিয়ে ছিটান, এটি দ্রুত প্রচুর আখড়া তৈরি হতে পারে। এবং এই সমস্ত আখড়া জুড়ে বরাদ্দ ছড়িয়ে আছে। প্রাথমিকভাবে প্রতিটি M৪ এমবি আখড়াটি কেবল নিরবিচ্ছিন্ন স্মৃতি ম্যাপ করা হয় তবে আপনি বরাদ্দ দেওয়ার সাথে সাথে আপনি তাদের জন্য প্রকৃত স্মৃতি ব্যবহার করতে শুরু করেন।

আপনার পিএমএপটিতে সম্ভবত নীচের মতোগুলির তালিকা রয়েছে। 324K + 65212 কে = 65536 কে, 560 কে + 64976 কে == 65536 কে, 620 কে + 64916 কে == 65536 কে কীভাবে লক্ষ্য করুন। যে, তারা 64Mb পর্যন্ত যোগফল।

00007f4394000000 324K আরডব্লু --- [আনন]
00007f4394051000 65212 কে ----- [আনোন]
00007f4398000000 560K আরডব্লু --- [আনন]
00007f439808c000 64976K ----- [আনোন]
00007f439c000000 620 কে আরডব্লু --- [আনন]
00007f439c09b000 64916 কে ----- [আনোন]

কাজের ক্ষেত্র হিসাবে : বাগটি এমন কিছু পরিবেশের পরামিতি উল্লেখ করে যা আপনি আখেরার সংখ্যা সীমাবদ্ধ করতে সেট করতে পারেন, তবে আপনার যথেষ্ট পরিমাণে একটি গ্লিবিসি সংস্করণ প্রয়োজন।


5
এক্সএমএক্স এবং এক্সএমএসকে একই মান হিসাবে সেট করা, এবং পরিবেশ স্ক্রিনে "এক্সপোর্ট এমএলএলকি_আরএনএ_এমএক্স = 4" সেট করা যা আমাদের ওয়েব সার্ভিসটি শুরু করে আমাদের ক্ষেত্রে সহায়তা করে। এর আগে আমরা প্রতি 2 থেকে 8 ঘন্টার মধ্যে ওওএম কিলারের কারণে ওয়েব পরিষেবা পুনঃসূচনাগুলি অনুভব করছিলাম। উবুন্টু ১৪.০৪-এ জিআইএলবিসি সংস্করণটি ২.১৯, যা ভাল, যেহেতু এটিতে = =
১16.১ প্রয়োজন মল্লোক_আরএএনএএমএক্স

এই উত্তর এবং উপরের মন্তব্যটি আমার জন্য জীবনকাল ছিল। আমার ক্ষেত্রে MALLOC_ARENA_MAX = 1 প্রয়োজনীয় এবং কার্যকর ছিল।
জন বাচির

3

কেমন হয় Lamdba প্রোব ? অন্যান্য জিনিসগুলির মধ্যে এটি আপনাকে নীচের স্ক্রিনশটের অনুরূপ মেমরির ব্যবহারের ব্রেকডাউনগুলি প্রদর্শন করতে পারে:

ল্যাম্বদা প্রোবের মেমরি ব্যবহারের দৃশ্য

কখনও কখনও pmap -x your_java_pidসহায়ক হতে পারে।


আপনার উত্তরের জন্য ধন্যবাদ. আমি যদি সঠিকভাবে বুঝতে পারি তবে ল্যাম্বদা প্রোবটি আপাচি টমক্যাটের জন্য? যা আমরা ব্যবহার করি না ... পিএমএপ সম্পর্কিত আমি শীর্ষ পোস্টে তথ্য যুক্ত করব
কনস্টান্টিন এস।

2

জেপ্রোফিলার এমন কিছু হতে পারে যা আপনি খুঁজছেন তবে এটি নিখরচায় নয়। জাভা প্রক্রিয়াটির মেমরির ব্যবহারের তদন্তের জন্য আরও একটি ভাল এবং নিখরচায় সরঞ্জাম হ'ল জাভা ভিজ্যুয়ালভিএম ওরাকল / সান জেডিকে বিতরণে জেডিকে সরঞ্জাম হিসাবে উপলব্ধ K আমি ব্যক্তিগতভাবে সমস্যাটির আরও সামগ্রিক পদ্ধতির (যেমন জেডিকে + ওএস + ডিস্ক ইত্যাদি পর্যবেক্ষণ করা) সুপারিশ করব - কিছু নেটওয়ার্ক মনিটরিং সিস্টেমের ব্যবহার - নাগিওস, ভেরাক্স এনএমএস বা ওপেনএনএমএস।


2
তার ফাঁস অফ হিপ তাই
জেপ্রফিলার

2

সমস্যাটি স্তূপের বাইরে, সুতরাং সেরা প্রার্থী হলেন:

JNI leak  
Allocation of direct memory buffer

আপনি সরাসরি বাফারের আকার সীমাবদ্ধ করে রেখেছেন বলে আমার মতে সেরা প্রার্থী হলেন জেএনআই ফাঁস।


1

JDK- এ অন্তর্ভুক্ত হিপ মেমরির বরাদ্দ দেখার জন্য একটি কার্যকর সরঞ্জাম রয়েছে যার নাম jmap, এর উপরে আপনার স্ট্যাক ইত্যাদিও রয়েছে (এক্সএসএস)। মেমরির ব্যবহার সম্পর্কে আরও তথ্য পেতে এই দুটি jmap কমান্ড চালান:

jmap -heap <PID>
jmap -permstat <PID>

আরও বেশি তথ্য পেতে আপনি jconsole (জেডিকেও অন্তর্ভুক্ত) এর সাথে প্রক্রিয়াটির সাথে সংযোগ করতে পারেন। Jconsole তবে JMX অ্যাপ্লিকেশনটিতে কনফিগার করা আবশ্যক।


আপনার উত্তরের জন্য ধন্যবাদ তবে সমস্যাটি মনে হচ্ছে বাইরে কোথাও কোথাও আছে। আমি jmap থেকে কিছু তথ্য প্রতিবিম্বিত করতে শীর্ষ পোস্ট আপডেট করব
কনস্টান্টিন এস।

প্রক্রিয়াটির কতটি থ্রেড রয়েছে? স্ট্যাকের আকারটি বেশিরভাগ প্ল্যাটফর্মগুলিতে 2MB ডিফল্ট হয়, তাই থ্রেডের সংখ্যার সাথে গুণিত করুন। আমি যদি সমস্ত "অনুপস্থিত" মেমরির জন্য অ্যাকাউন্ট করে তবে সম্ভবত এটির কিছুটা অবাক হব।
হাম্পাসলি

প্রায় 300 থ্রেড, পিএমএপ থেকে নেওয়া তথ্য আমাদের 1 মিবির স্ট্যাক আকার রয়েছে। এবং একই পিএমএপ আউটপুট থেকে এটি দেখে মনে হচ্ছে না যে কোনও স্ট্যাক 100Kb এর বেশি ব্যবহার করে
কনস্ট্যান্টিন এস।

0

JVisualVM ব্যবহার করুন। এর বিভিন্ন বিভিন্ন মতামত রয়েছে যা আপনাকে জানাবে যে হিপ মেমরিটি কতটা ব্যবহৃত হচ্ছে, পারমজেন এবং আরও অনেক কিছু।

আপনার প্রশ্নের উত্তর হিসাবে। আপনি যা আশা করতে পারেন তার থেকে জাভা মেমরিটিকে একেবারেই আলাদাভাবে পরিচালনা করে।

আপনি যখন-এক্সএমএস এবং-এক্সএমএক্স প্যারামিটারগুলি সেট করেন, আপনি জেভিএমকে বলছেন যে এটি শুরু করার জন্য গাদাতে কত মেমরি বরাদ্দ করা উচিত এবং এটি সর্বোচ্চ হিসাবে কত বরাদ্দ করা উচিত telling

যদি আপনার কাছে জাভা অ্যাপ্লিকেশন থাকে যা মোট 1m মেমরি ব্যবহার করে তবে -Xms256m -Xmx2g এ পাস করেছে তবে JVM 256m মেমরির ব্যবহারের মাধ্যমে নিজেকে আরম্ভ করবে। এটি এর চেয়ে কম ব্যবহার করবে না। আপনার অ্যাপ্লিকেশনটি কেবল 1 মিটার মেমরি ব্যবহার করে তা বিবেচ্য নয়।

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

আপনার ক্ষেত্রে, যেহেতু আপনি ন্যূনতম এবং সর্বাধিক মেমরিটি 2 জি তে নির্ধারণ করছেন তাই জেভিএম শুরুতে 2 জি বরাদ্দ করবে এবং এটি বজায় রাখবে।

জাভা মেমরি পরিচালনা বেশ জটিল এবং মেমরি ব্যবহার টিউন করা নিজেই একটি কাজ হতে পারে। তবে সেখানে প্রচুর সংস্থান রয়েছে যা সাহায্য করতে পারে।

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