জাভাস্ক্রিপ্ট মেমরি সন্ধান করা ক্রোমের সাথে ফাঁস হয়


163

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

কোডটির জন্য একটি jsfiddle এখানে: http://jsfiddle.net/4QhR2/

// scope everything to a function
function main() {

    function MyWrapper() {
        this.element = null;
    }
    MyWrapper.prototype.set = function(elem) {
        this.element = elem;
    }
    MyWrapper.prototype.get = function() {
        return this.element;
    }

    var MyView = Backbone.View.extend({
        tagName : "div",
        id : "view",
        events : {
            "click #button" : "onButton",
        },    
        initialize : function(options) {        
            // done for demo purposes only, should be using templates
            this.html_text = "<input type='text' id='textbox' /><button id='button'>Remove</button>";        
            this.listenTo(this,"all",function(){console.log("Event: "+arguments[0]);});
        },
        render : function() {        
            this.$el.html(this.html_text);

            this.wrapper = new MyWrapper();
            this.wrapper.set(this.$("#textbox"));
            this.wrapper.get().val("placeholder");

            return this;
        },
        onButton : function() {
            // assume this gets .remove() called on subviews (if they existed)
            this.trigger("cleanup");
            this.remove();
        }
    });

    var view = new MyView();
    $("#content").append(view.render().el);
}

main();

তবে, গুগল ক্রোমের প্রোফাইলার কীভাবে ব্যবহার করতে হয় তা যাচাই করার জন্য আমি অস্পষ্ট fact হ্যাজ প্রোফাইলার স্ন্যাপশটে একটি গাজিলিয়ন জিনিস প্রদর্শিত হবে এবং কী ভাল / খারাপ তা কীভাবে ডিকোড করতে হবে তার আমার কোনও ধারণা নেই। আমি এ পর্যন্ত যে টিউটোরিয়ালগুলি দেখেছি তা হয় আমাকে কেবল "স্ন্যাপশট প্রোফাইলার ব্যবহার করতে" বলুন বা পুরো প্রোফাইলার কীভাবে কাজ করে তা সম্পর্কে একটি বিস্তৃত বিশদ ম্যানিফেস্টো আমাকে জানান। কেবলমাত্র একটি সরঞ্জাম হিসাবে প্রোফাইলারটি ব্যবহার করা কি সম্ভব, বা পুরো জিনিসটি কীভাবে ইঞ্জিনিয়ার করা হয়েছিল তা আমাকে সত্যিই বুঝতে হবে?

সম্পাদনা: টিউটোরিয়ালগুলি এর মতো:

জিমেইল মেমরি ফাঁস ফিক্সিং

ডেভটুলগুলি ব্যবহার করা

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

সুতরাং আপনি একটি ফাঁস পেয়েছেন। এখন কি?

  • প্রোফাইল প্যানেলের নীচের অর্ধেক অংশে ফাঁস হওয়া অবজেক্টগুলির ধরে রাখার পথ পরীক্ষা করুন

  • যদি বরাদ্দ সাইটটি সহজেই অনুমান করা যায় না (যেমন ইভেন্ট শ্রোতা):

  • বরাদ্দের জন্য স্ট্যাক ট্রেস সংরক্ষণ করার জন্য জেএস কনসোলের মাধ্যমে রক্ষণাবেক্ষণকারী অবজেক্টের কনস্ট্রাক্টরকে নির্দেশ দিন

  • বন্ধ ব্যবহার করছেন? নির্মাণের সময় সৃষ্টি স্ট্যাক সম্পত্তি সেট করতে উপযুক্ত বিদ্যমান পতাকাটি (যেমন goog.events.Listtener.ENABLE_MONITORING) সক্ষম করুন

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

এই আরও কিছু সুনির্দিষ্ট বিষয় নীচে @ জোনাথন নাগুইনের উত্তরে উত্থাপিত হয়েছে ।


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

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

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

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

উত্তর:


205

মেমরি ফাঁসের সন্ধান করার জন্য একটি ভাল ওয়ার্কফ্লো হ'ল তিনটি স্ন্যাপশট কৌশল যা প্রথমে লোরেনা লি এবং জিমেইল দল তাদের কিছু স্মৃতি সমস্যার সমাধান করার জন্য ব্যবহার করে। পদক্ষেপগুলি হ'ল সাধারণভাবে:

  • একটি গাদা স্ন্যাপশট নিন।
  • স্টাফ কর
  • অন্য একটি হিপ স্ন্যাপশট নিন।
  • একই জিনিস পুনরাবৃত্তি।
  • অন্য একটি হিপ স্ন্যাপশট নিন।
  • স্ন্যাপশট 3 এর "সারাংশ" ভিউতে স্ন্যাপশট 1 এবং 2 এর মধ্যে বরাদ্দ করা ফিল্টার অবজেক্টগুলি।

আপনার উদাহরণস্বরূপ, আমি স্টার্ট বোতামটির ক্লিক ইভেন্ট না হওয়া পর্যন্ত ব্যাকবোন ভিউ তৈরিতে বিলম্ব করে এই প্রক্রিয়াটি দেখানোর জন্য কোডটি মানিয়ে নিয়েছি (আপনি এটি এখানে খুঁজে পেতে পারেন )। এখন:

  • এইচটিএমএল চালান (এই ঠিকানাটি ব্যবহারের স্থানীয়ভাবে সংরক্ষিত ) এবং একটি স্ন্যাপশট নিন।
  • ভিউ তৈরি করতে শুরু ক্লিক করুন।
  • অন্য একটি স্ন্যাপশট নিন।
  • অপসারণ ক্লিক করুন।
  • অন্য একটি স্ন্যাপশট নিন।
  • স্ন্যাপশট 3 এর "সারাংশ" ভিউতে স্ন্যাপশট 1 এবং 2 এর মধ্যে বরাদ্দ করা ফিল্টার অবজেক্টগুলি।

এখন আপনি মেমরি ফাঁস খুঁজে পেতে প্রস্তুত!

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

এখানে চিত্র বর্ণনা লিখুন

জাভাস্ক্রিপ্ট থেকে ইয়েলো নোডের সরাসরি উল্লেখ রয়েছে। আপনার জাভাস্ক্রিপ্ট থেকে রেফারেন্সগুলি সনাক্ত করতে একই বিযুক্ত ডিওএম গাছের হলুদ নোডগুলি সন্ধান করুন। DOM উইন্ডো থেকে এলিমেন্টের দিকে পরিচালিত বৈশিষ্ট্যের একটি চেইন থাকা উচিত।

আপনার বিশেষে আপনি এইচটিএমএল ডিভ উপাদানটি লাল হিসাবে চিহ্নিত হিসাবে দেখতে পাচ্ছেন। আপনি যদি উপাদানটি প্রসারিত করেন তবে দেখবেন এটি একটি "ক্যাশে" ফাংশন দ্বারা রেফারেন্স করা হয়েছে।

এখানে চিত্র বর্ণনা লিখুন

সারিটি নির্বাচন করুন এবং আপনার কনসোলটিতে টাইপ করুন $ 0, আপনি আসল ফাংশন এবং অবস্থান দেখতে পাবেন:

>$0
function cache( key, value ) {
        // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
        if ( keys.push( key += " " ) > Expr.cacheLength ) {
            // Only keep the most recent entries
            delete cache[ keys.shift() ];
        }
        return (cache[ key ] = value);
    }                                                     jquery-2.0.2.js:1166

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

function cache( key, value ) {
    return value;
}

এখন আপনি যদি প্রক্রিয়াটি পুনরাবৃত্তি করেন তবে আপনি কোনও লাল নোড দেখতে পাবেন না :)

ডকুমেন্টেশন:


8
আমি তোমার প্রচেষ্টাকে সাধুবাদ জানাই. প্রকৃতপক্ষে, তিনটি স্নাপশট কৌশলটি টিউটোরিয়ালে নিয়মিতভাবে উল্লেখ করা হয়। দুর্ভাগ্যক্রমে, বিশদগুলি প্রায়শই বাদ যায়। উদাহরণস্বরূপ, আমি $0কনসোলে ফাংশনটি প্রবর্তনকে প্রশংসা করি , এটি আমার কাছে নতুন ছিল - অবশ্যই, আমি কী জানি না আপনি কীভাবে এটি ব্যবহার করতে $1শিখেছিলেন ( $2একইভাবে কাজ করার সময় মনে হয় নিরর্থক বলে মনে হয়)। দ্বিতীয়ত, আপনি কীভাবে সারিটি হাইলাইট করতে জানলেন #button in function cache()এবং অন্যান্য কয়েক ডজন সারি নয়? অবশেষে, এখানে লাল নোডগুলিও রয়েছে NodeListএবং HTMLInputElementআমি এগুলি খুঁজে বের করতে পারি না।
একাদশ

7
আপনি কীভাবে জানলেন যে cacheসারিটিতে তথ্য রয়েছে যখন অন্যরা নেই? এমন অনেক শাখা রয়েছে যেটির একটি কম দূরত্ব রয়েছে cache। এবং আমি নিশ্চিত নই যে আপনি কীভাবে জানতেন যে তিনি HTMLInputElementসন্তানের সন্তান HTMLDivElement। আমি দেখতে পাচ্ছি এটির অভ্যন্তরে এটি রেফারেন্স করা হয়েছে ("এইচটিএমএলডিভিলিমেটে নেটিভ"), তবে এটি নিজের এবং দুটি গুলিও উল্লেখ করে HTMLButtonElementযা আমার কাছে বোধগম্য নয়। আমি অবশ্যই এই উদাহরণটির উত্তরটি সনাক্ত করে আপনাকে প্রশংসা করি, তবে কীভাবে এটি অন্যান্য বিষয়গুলিতে সাধারণীকরণ করা যায় সে সম্পর্কে আমার সত্যিই ধারণা নেই।
একাদশ

2
এটি আশ্চর্যজনক, আমি আপনার উদাহরণটি ব্যবহার করছিলাম এবং আমি আপনার চেয়ে আলাদা ফলাফল পেয়েছি (আপনার স্ক্রিনশট থেকে)। তবুও, আমি আপনার সমস্ত সহায়তার প্রশংসা করি। আমি মনে করি আমার আপাতত যথেষ্ট আছে, এবং যখন আমার কাছে একটি বাস্তব জীবনের উদাহরণ রয়েছে যার সাথে আমার সুনির্দিষ্ট সহায়তার প্রয়োজন হবে, আমি এখানে একটি নতুন প্রশ্ন তৈরি করব। আবার ধন্যবাদ.
একাদশ

2
এখানে $ 0 এর ব্যাখ্যা পাওয়া যাবে: developer.chrome.com/devtools/docs/commandline-api#0-4
সুকৃত গুপ্ত

4
কী Filter objects allocated between Snapshots 1 and 2 in Snapshot 3's "Summary" view.মানে?
কে - এসও-তে বিষক্রিয়া বাড়ছে।

8

এখানে একটি জেসফিডেলের মেমরি প্রোফাইলিংয়ের একটি টিপ: আপনার jsfiddle ফলাফলকে আলাদা করতে নীচের URL টি ব্যবহার করুন, এটি jsfiddle সমস্ত ফ্রেমওয়ার্ক সরিয়ে দেয় এবং কেবল আপনার ফলাফলকে বোঝায়।

http://jsfiddle.net/4QhR2/show/

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

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

https://developers.google.com/chrome-developer-tools/docs/javascript-memory-profiling


6

মূলত আপনাকে আপনার গাদা স্ন্যাপশটের অভ্যন্তরের অবজেক্টের সংখ্যাটি দেখতে হবে। যদি দুটি স্ন্যাপশটের মধ্যে অবজেক্টের সংখ্যা বৃদ্ধি পায় এবং আপনি অবজেক্টগুলি নিষ্পত্তি করেন তবে আপনার স্মৃতি ফাঁস হবে। আমার পরামর্শটি হ'ল আপনার কোডগুলিতে ইভেন্ট হ্যান্ডলারের সন্ধান করুন যা আলাদা না হয়।


3
উদাহরণস্বরূপ, আমি যদি 'সরিয়ে ফেলুন' ক্লিক করার আগে জেসফিডেলের একটি হিপ স্ন্যাপশটটি দেখি, তবে সেখানে আরও 10,000,000 অবজেক্ট উপস্থিত রয়েছে। আমার জিসফিল্ড কোডটি আসলে তৈরি করা বস্তুগুলি আমি কোথায় খুঁজব? আমি ভেবেছিলাম Window/http://jsfiddle.net/4QhR2/showসম্ভবত এটি কার্যকর হবে তবে এটি কেবল অন্তহীন কাজ। সেখানে কী চলছে আমার কোনও ধারণা নেই।
এলেভেনটিভেন

@ এলিভেন্টিওন: আমি জেএসফিডাল ব্যবহার করব না। পরীক্ষার জন্য কেন কেবল নিজের কম্পিউটারে একটি ফাইল তৈরি করবেন না?
নীল আকাশ

1
@ ব্লুস্কাইস আমি একটি জিসফিল তৈরি করেছি যাতে এখানকার লোকেরা একই কোডবেস থেকে কাজ করতে পারে। তবুও, আমি যখন পরীক্ষার জন্য আমার নিজের কম্পিউটারে একটি ফাইল তৈরি করি তখন হ্যাপ স্ন্যাপশটে এখনও 50,000+ অবজেক্ট উপস্থিত থাকে।
ইলেভেনটিওনে

@ এলিভেন্টিও ওয়ান হিপ স্ন্যাপশট আপনাকে মেমরি ফুটে উঠেছে কিনা সে সম্পর্কে ধারণা দেয় না। আপনার কমপক্ষে দুটি দরকার।
কনস্ট্যান্টিন দিনভ

2
প্রকৃতপক্ষে. আমি হাইলাইট করেছিলাম যখন হাজার হাজার বস্তু উপস্থিত রয়েছে তখন কী সন্ধান করতে হবে তা জানা কতটা কঠিন।
একাদশ


3

আপনি বিকাশকারী সরঞ্জামগুলির টাইমলাইন ট্যাবেও দেখতে পারেন। আপনার অ্যাপ্লিকেশনটির ব্যবহার রেকর্ড করুন এবং ডিওএম নোড এবং ইভেন্ট শ্রোতার গণনায় নজর রাখুন।

যদি মেমরি গ্রাফটি প্রকৃতপক্ষে কোনও মেমরি ফাঁস নির্দেশ করে তবে আপনি কীভাবে ফাঁস হচ্ছে তা নির্ধারণের জন্য প্রোফাইলারটি ব্যবহার করতে পারেন।


3

আপনিও পড়তে চাইতে পারেন:

http://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/

এটি ক্রোম বিকাশকারী সরঞ্জামগুলির ব্যবহার ব্যাখ্যা করে এবং হ্যাপ স্ন্যাপশট তুলনা এবং উপলব্ধ বিভিন্ন পৃথক হ্যাপ স্ন্যাপশট ভিউ ব্যবহার করে মেমরি ফাঁস কীভাবে নিশ্চিত এবং সনাক্ত করতে পারে সে সম্পর্কে কিছু ধাপে ধাপে পরামর্শ দেয়।


2

আমি হিপ স্ন্যাপশট নেওয়ার পরামর্শটি দ্বিতীয় স্থানে রেখেছি, তারা মেমরি ফাঁস সনাক্তকরণের জন্য দুর্দান্ত, ক্রোম স্ন্যাপশটটিংয়ের একটি দুর্দান্ত কাজ করে।

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

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


0

ক্রোম বিকাশকারী সরঞ্জামগুলি ব্যবহার করে মেমরি ফাঁস সনাক্তকরণের ক্ষেত্রে কয়েকটি গুরুত্বপূর্ণ নোট:

1) স্বয়ংক্রিয়ভাবে ক্রোমের পাসওয়ার্ড এবং নম্বর ক্ষেত্রের মতো নির্দিষ্ট উপাদানের মেমরি ফাঁস রয়েছে। https://bugs.chromium.org/p/chromium/issues/detail?id=967438 । বিচ্ছিন্ন উপাদানগুলির সন্ধানের সময় তারা আপনার গাদা স্ন্যাপশটকে কলুষিত করার সময় ডিবাগ করার সময় সেগুলি ব্যবহার করা এড়িয়ে চলুন।

2) লগ ইন করবেন না কিছু ব্রাউজার কনসোলে। ক্রোম কনসোলে লিখিত জিনিসগুলি আবর্জনা সংগ্রহ করবে না, ফলে আপনার ফলাফলকে প্রভাবিত করবে। আপনার স্ক্রিপ্ট / পৃষ্ঠার শুরুতে আপনি নিম্নলিখিত কোডটি রেখে আউটপুট দমন করতে পারেন:

console.log = function() {};
console.warn = console.log;
console.error = console.log;

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

var divs = document.querySelectorAll("div");
for (var i = 0 ; i < divs.length ; i++)
{
    divs[i].id = divs[i].id || "AutoId_" + i;
}
divs = null; // Free memory

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

মেমরি ফাঁস সনাক্ত করতে আমি কীভাবে আমার পরীক্ষা চালাচ্ছি

1) পৃষ্ঠা লোড করুন (কনসোল আউটপুট দমন সহ!)

2) পৃষ্ঠায় এমন স্টাফ করুন যা মেমরি ফাঁস হতে পারে

3) একটি হিপ স্ন্যাপশট নিতে এবং "বিচ্ছিন্ন" অনুসন্ধানের জন্য বিকাশকারী সরঞ্জামগুলি ব্যবহার করুন

4) উপাদানগুলি তাদের আইডি বা বহিরাগত এইচটিএমএল বৈশিষ্ট্যগুলি থেকে তাদের সনাক্ত করতে হোভার করুন


এছাড়াও, ব্রাউজারে ডিবাগিংকে আরও কঠিন করে তোলে বলে মাইনাইফিং / ইউগ্লিফাইটিং অক্ষম করা সবসময়ই ভাল ধারণা।
জিমি থমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.