জেভিএম পতাকা CMSClassUnloadingEnabled আসলে কী করে?


183

জাভা ভিএম পতাকা CMSClassUnloadingEnabledআসলে কী করে তার একটি সংজ্ঞা আমার জীবনের জন্য আমি খুঁজে পাচ্ছি না, কিছু খুব অস্পষ্ট উচ্চ স্তরের সংজ্ঞা যেমন "" আপনার পারমজেন সমস্যা থেকে মুক্তি পেয়েছে "( যা এটি নয় , বিটিডব্লিউ)।

আমি সান / ওরাকল এর সাইট দেখেছি, এবং বিকল্প তালিকা এমনকি আসলে এটি বলে না।

পতাকাটির নামের উপর ভিত্তি করে, আমি অনুমান করছি যে সিএমএস আবর্জনা সংগ্রাহক ডিফল্টরূপে ক্লাসগুলি আনলোড করে না এবং এই পতাকাটি এটি চালু করে - তবে আমি নিশ্চিত হতে পারি না।

উত্তর:


219

আপডেট এই উত্তরটি জাভা 5-7-এর জন্য প্রাসঙ্গিক, জাভা 8 এটি স্থির করেছে: https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation- and-metaspace Kudos mt তে যান । uulu

জাভা 5-7 এর জন্য:

বিশ্বের মানক ওরাকল / সান ভিএম চেহারা হ'ল: ক্লাস চিরকাল থাকে। তাই একবারে বোঝা হয়ে গেলে, কেউ আর চিন্তা না করলেও তারা স্মৃতিতে থাকে। আপনার সাধারণত এমন অনেকগুলি "সেটআপ" ক্লাস না থাকায় এটি সাধারণত কোনও সমস্যা হয় না (= একবার সেটআপের জন্য ব্যবহৃত হয় এবং তারপরে আর কখনও হয় না)। এমনকি তারা যদি 1MB নেয় তবে কে যত্ন করে।

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

আপনি যদি সক্ষম করেন CMSClassUnloadingEnabledতবে জিসি পার্মজেনকেও সাফ করে দেবে এবং আর ব্যবহার করা হয়নি এমন ক্লাসগুলি সরিয়ে ফেলবে।

[সম্পাদনা] আপনাকে সক্ষম করতে হবে UseConcMarkSweepGC( স্যাম হাসলারের ধন্যবাদ )। এই উত্তরটি দেখুন: https://stackoverflow.com/a/3720052/2541


17
মতে stackoverflow.com/a/3720052/2541 জন্য CMSClassUnloadingEnabledকোনো প্রভাব, UseConcMarkSweepGCএছাড়াও সেট করা আবশ্যক
স্যাম Hasler

1
এটি কীভাবে ইউজনক্যাটস سویপজিসি ব্যবহারের ধারণাকে প্রভাবিত করে তা নিশ্চিত নয়, তবে এটি সিএমএসক্লাসউনলোডিংএনেবলডে সম্প্রতি একটি বাগ রয়েছে। এটি এখানে স্থির হিসাবে মন্তব্য করা হয়েছে: bugs.sun.com/bugdatedia/view_bug.do?bug_id=8000325
বিল রোসমাস

3
@ কেভিন: হ্যাঁ, অবশ্যই নীচের অংশে দেখুন groovy.codehaus.org/Running : "। পরে খাঁজকাটা পরিবর্তনশীল শ্রেণীর সৃষ্টি, কিন্তু ডিফল্ট জাভা ভার্চুয়াল মেশিনের PermGen জিসি না যে আপনি জাভা 6 ব্যবহার করে থাকেন বা, অ্যাড -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGCUseConcMarkSweepGCসক্ষম করতে প্রয়োজন হয় CMSClassUnloadingEnabled।"
অ্যারন দিগুল্লা

1
UseConcMarkSweepGC এবং CMSClassUnloadingEnable একসাথে সক্ষম করার সম্পর্কে একটি ভাল নিবন্ধ। blog.redfin.com/devblog/2012/06/…
ভিক্টর

1
আর আর 1.8 এর জন্য বৈধ নয়: ব্লগস.অরাকল.com
পুনাম

35

জাভা জেভিএম-এর জন্য এক্সএক্সএক্স বিকল্পগুলির সর্বাধিক সম্পূর্ণ তালিকা ব্লগ পোস্ট অনুসারে , এটি নির্ধারণ করে যে ক্লাস আনলোডিং সিএমএস আবর্জনা সংগ্রাহকের অধীনে সক্ষম করা হয়েছে কিনা। ডিফল্ট হয় false। সেখানে অন্য কোনো বিকল্প বলা হয় ClassUnloadingযে trueডিফল্ট যা (সম্ভবত) অন্য আবর্জনা সংগ্রাহক প্রভাবিত দ্বারা।

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

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


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

বাস্তবে, আপনি যখন কোনও ওয়েবঅ্যাপের হট রেডপ্লাই করেন তখন এটি ঘটে। (বা অন্ততপক্ষে, যা হওয়ার দরকার তা যদি হয় তবে আপনি যদি পার্জেন স্টোরেজ ফাঁস হওয়ার সমস্যাগুলি এড়াতে পারেন তবে))


24

এটি দরকারী যেখানে একটি উদাহরণ:

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabledআমাদের ওয়েবলোগিক 10.3 এ সেট করে জেভিএম এমন একটি সমস্যার সমাধান করতে সহায়তা করেছে যেখানে জ্যাকস-ডাব্লুএস বাস্তবায়ন প্রতিটি ওয়েব পরিষেবা কলের জন্য একটি নতুন প্রক্সি ক্লাস তৈরি করেছিল, যা শেষ পর্যন্ত মেমরির ত্রুটিগুলি থেকে বেরিয়ে আসে।

এটি সনাক্ত করা তুচ্ছ ছিল না। নিম্নলিখিত কোডটি সর্বদা এর জন্য একই প্রক্সি ক্লাস ফিরিয়ে দেয়port

final MyPortType port = 
Service.create(
        getClass().getResource("/path/to.wsdl"), 
        new QName("http://www.example.com", "MyService"))
    .getPort(
        new QName("http://www.example.com", "MyPortType"), 
        MyPortType.class);

অভ্যন্তরীণভাবে, এই প্রক্সিটি একটি উদাহরণে প্রেরণ করা হয়েছিল weblogic.wsee.jaxws.spi.ClientInstance, যা আবার নতুন $Proxy[nnnn]ক্লাসে প্রেরণ করা nহয়েছিল যেখানে প্রতিটি কলে বৃদ্ধি করা হয়েছিল। পতাকাগুলি যুক্ত করার সময়, nএখনও বাড়ানো হয়েছিল, তবে কমপক্ষে সেই অস্থায়ী ক্লাসগুলি মেমরি থেকে সরানো হয়েছিল।

আরও সাধারণ নোটে, জাভা প্রতিবিম্ব এবং প্রক্সির মাধ্যমে ভারী ব্যবহার করার সময় এটি খুব কার্যকর হতে পারে java.lang.reflect.Proxy


বাস্তব অভিজ্ঞতা ভাগ করে নেওয়ার জন্য +1। আমাদের টর্কবক্সেও এই সমস্যা ছিল যেখানে জেআরবি সংকলন প্রক্রিয়াগুলির কারণে সার্ভার প্রচুর ক্লাস তৈরি করেছে generated
নুরেটিন

7
এছাড়াও মনে রাখবেন -XX:+CMSPermGenSweepingEnabledপক্ষে অবচিত-XX:+CMSClassUnloadingEnabled
nurettin

3
এই ইস্যুটির জন্য আসল স্থিরতা হ'ল একবার বন্দরটি তৈরি করা এবং এটি পুনরায় ব্যবহার করা। জ্যাকস-ডাব্লুএস এভাবে ব্যবহার করার কথা। বন্দরটিও 100% থ্রেড নিরাপদ।
rustx

@ রুস্টিক্স: কিছু দাবিদার লিঙ্ক দিয়ে আপনি কি এই দাবিটি ফিরিয়ে দিতে পারবেন? আমি সর্বদা ওয়েব পরিষেবাদি প্রক্সি এবং স্টাবগুলি পুনরায় ব্যবহার করা সম্পর্কে খুব সতর্ক ছিলাম ... যেমন অ্যাপাচি সিএক্সএফ দাবি অস্বীকারগুলি দেখুন । বা এই প্রশ্ন
লুকাশ এডার

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