কৌণিক ফায়ারবেস অ্যাপ্লিকেশন মেমরি বরাদ্দের +1 গিগাবাইটের সাথে 20 ঘন্টা পরে ক্র্যাশ হয়


13

আমি দেখেছি যে ব্যবহার AngularFireAuthModuleথেকে '@angular/fire/auth';একটি মেমরি লিক যে 20 ঘণ্টা পর ব্রাউজার ক্র্যাশ কারণ।

সংস্করণ:

আমি সমস্ত প্যাকেজগুলির জন্য ncu -u ব্যবহার করে আজ আপডেট হওয়া সর্বশেষতম সংস্করণটি ব্যবহার করছি।

কৌণিক আগুন: "@angular/fire": "^5.2.3",

Firebase সংস্করণ: "firebase": "^7.5.0",

কিভাবে পুনরুত্পাদন করবেন:

আমি স্ট্যাকব্লিজটিজ সম্পাদকটিতে ন্যূনতম পুনরুত্পাদনযোগ্য কোড তৈরি করেছিলাম

এখানে সরাসরি বাগ স্ট্যাকব্লিজ্ট পরীক্ষার জন্য লিঙ্কটি দেওয়া আছে

উপসর্গ:

কোডটি কিছুই করে না তা আপনি নিজেরাই পরীক্ষা করতে পারেন। এটি কেবল হ্যালো ওয়ার্ল্ড প্রিন্ট করে। তবে, কৌণিক অ্যাপ্লিকেশন দ্বারা ব্যবহৃত জাভাস্ক্রিপ্ট মেমরি 11 কেবি / সেকেন্ড বৃদ্ধি পেয়েছে (ক্রোম টাস্ক ম্যানেজার সিআরটিএল + ইসএসসি)। ব্রাউজারটি খোলা রেখে 10 ঘন্টা রাখার পরে, ব্যবহৃত মেমরিটি প্রায় 800 এমবিতে পৌঁছায় ( মেমরিটির পদচিহ্ন প্রায় 1.6 গিগাবাইটের দ্বিগুণ !)

ফলস্বরূপ, ব্রাউজারটি মেমরির বাইরে চলে যায় এবং ক্রোম ট্যাব ক্র্যাশ হয়।

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

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

কোড যা মেমরি ফুটোয়ের কারণ:

আমি দেখতে পেলাম যে AngularFireAuthModule মডিউলটি ব্যবহার করে মেমরি ফাঁস হয় কারণ এটি কোনও componentকনস্ট্রাক্টারে ইনজেকশন দেওয়া হয় বা এ service

import { Component } from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {AngularFirestore} from '@angular/fire/firestore';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'memoryleak';
  constructor(public auth: AngularFireAuth){

  }
}

প্রশ্ন :

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

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

যদি এটিই একমাত্র সমাধান হয় তবে কীভাবে এটি বাস্তবায়ন করা যায়?

আমার কেবলমাত্র এমন কোনও সমাধানের প্রয়োজন যা শ্রোতার এই অপ্রয়োজনীয় বৃদ্ধি থামিয়ে দেয় কারণ এটি কম্পিউটারকে ধীর করে দেয় এবং আমার অ্যাপ্লিকেশনটিকে ক্র্যাশ করে। আমার অ্যাপ্লিকেশনটি 20 ঘন্টারও বেশি সময় চালানো দরকার তাই এই সমস্যার কারণে এটি এখন ব্যবহারের অযোগ্য। আমি একটি সমাধান জন্য মরিয়া।



আমি আপনার উদাহরণটি আপনার উদাহরণে পুনরুত্পাদন করতে ব্যর্থ হয়েছি
সের্গেই মেল

@ সের্গেইমেল আপনি স্ট্যাকব্লিটজে পোস্ট করা কোডটি ব্যবহার করেছেন?
টিএসআর

হ্যাঁ. আসলে, আমি এটি সম্পর্কে কথা বলছি।
সের্গেই মেল

কোডটি ডাউনলোড করে স্থানীয়ভাবে চালানোর চেষ্টা করুন। ড্রাইভেও আমি এটিকে আপলোড করেছি কেবলমাত্র ড্রাইভ. google.com/file/d/1fvo8eJrbYpZWfSXM5h_bw5jh5tuoWAB2/…
TSR

উত্তর:


7

টিএলডিআর: শ্রোতার সংখ্যা বাড়ানো প্রত্যাশিত আচরণ এবং এটি আবর্জনা সংগ্রহের পরে পুনরায় সেট করা হবে। ফায়ারবেস আথের মেমরি ফাঁস হওয়ার কারণটি বাগ ফায়ারবেস v7.5.0 এ ইতিমধ্যে ঠিক করা হয়েছে, # 1121 দেখুন , package-lock.jsonআপনি সঠিক সংস্করণটি ব্যবহার করছেন তা নিশ্চিত করতে আপনার পরীক্ষা করুন । যদি নিশ্চিত না হন তবে firebaseপ্যাকেজটি পুনরায় ইনস্টল করুন ।

ফায়ারবেসের পূর্ববর্তী সংস্করণগুলি প্রতিশ্রুতি শৃঙ্খলার মাধ্যমে ইনডেক্সডডিবি পোলিং করছিল, যা মেমরি ফাঁসের কারণ হয়, জাভাস্ক্রিপ্টের প্রতিশ্রুতি ফাঁস মেমরি দেখুন

var repeat = function() {
  self.poll_ =
      goog.Timer.promise(fireauth.storage.IndexedDB.POLLING_DELAY_)
      .then(goog.bind(self.sync_, self))
      .then(function(keys) {
        // If keys modified, call listeners.
        if (keys.length > 0) {
          goog.array.forEach(
              self.storageListeners_,
              function(listener) {
                listener(keys);
              });
        }
      })
      .then(repeat)
      .thenCatch(function(error) {
        // Do not repeat if cancelled externally.
        if (error.message != fireauth.storage.IndexedDB.STOP_ERROR_) {
          repeat();
        }
      });
  return self.poll_;
};
repeat();

নন-রিকার্সিভ ফাংশন কলগুলি ব্যবহার করে পরবর্তী সংস্করণগুলিতে স্থির করা:

var repeat = function() {
  self.pollTimerId_ = setTimeout(
      function() {
        self.poll_ = self.sync_()
            .then(function(keys) {
              // If keys modified, call listeners.
              if (keys.length > 0) {
                goog.array.forEach(
                    self.storageListeners_,
                    function(listener) {
                      listener(keys);
                    });
              }
            })
            .then(function() {
              repeat();
            })
            .thenCatch(function(error) {
              if (error.message != fireauth.storage.IndexedDB.STOP_ERROR_) {
                repeat();
              }
            });
      },
      fireauth.storage.IndexedDB.POLLING_DELAY_);
};
repeat();


রৈখিকভাবে শ্রোতার সংখ্যা বৃদ্ধি:

সূক্ষ্মভাবে শ্রোতার সংখ্যা বাড়ানো প্রত্যাশিত কারণ ফায়ারবেস ইন্ডেক্সডেডিবি জরিপ করতে এটি করছে doing যাইহোক, শ্রোতা যখনই জিসি চান সরিয়ে দেওয়া হবে।

576302 ইস্যু পড়ুন : ভুলভাবে মেমরি (শ্রোতাদের এক্সএইচআর ও লোড) ফাঁস দেখাচ্ছে

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

সরঞ্জামদণ্ডের বোতামটি মেজর জিসিকে অনুরোধ করে যা শ্রোতাদের সংগ্রহ করতে সক্ষম।

ডেভটুলগুলি চলমান অ্যাপ্লিকেশনটিতে হস্তক্ষেপ না করার চেষ্টা করে, তাই এটি নিজেরাই জিসিকে জোর করে না।


বিচ্ছিন্ন শ্রোতারা আবর্জনা সংগ্রহ করা হয়েছে তা নিশ্চিত করতে, আমি জেএস হিপকে চাপ দিতে এই স্নিপেট যুক্ত করেছি, যার ফলে জিসিকে ট্রিগার করতে বাধ্য করা হয়েছে:

var x = ''
setInterval(function () {
  for (var i = 0; i < 10000; i++) {
    x += 'x'
  }
}, 1000)

শ্রোতা আবর্জনা সংগ্রহ করা হয়

আপনি দেখতে পাচ্ছেন, জিসি ট্রিগার করা হলে বিচ্ছিন্ন শ্রোতাগুলি পর্যায়ক্রমে সরানো হয়।



শ্রোতার সংখ্যা এবং মেমরি ফাঁস সম্পর্কিত অনুরূপ স্ট্যাকওভারফ্লো প্রশ্ন এবং গিটহাব সম্পর্কিত সমস্যা:

  1. ক্রোম দেব সরঞ্জামগুলিতে শ্রোতাদের পারফরম্যান্সের প্রোফাইলিং ফলাফল
  2. জাভাস্ক্রিপ্ট শ্রোতাদের বর্ধমান রাখা
  3. মেমোরি ফুটো হওয়ার কারণ সহজ অ্যাপ?
  4. $ এইচটিপি 'জিইটি' মেমরি ফাঁস (নয়!) - শ্রোতার সংখ্যা (অ্যাঙ্গুলারজেএস ভি.1.4.7 / 8)

আমি 7.5.0 ব্যবহার করে নিশ্চিত করেছি এবং বিভিন্ন পরিবেশে একাধিকবার পরীক্ষা করেছি। এমনকি এটি.auth.auth.setPersistance ('কিছুই নয়') মেমরি ফাঁস প্রতিরোধ করে না। দয়া করে এখানে কোডটি
TSR

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

@TSR কল this.auth.auth.setPersistence('none')মধ্যে ngOnInitনিষ্ক্রিয় অধ্যবসায় করতে কন্সট্রাকটর পরিবর্তে।
জোশুয়া চান

@ জোশুয়াচান কোনও পরিষেবাদির পদ্ধতিটি কল করার ক্ষেত্রে কী ব্যাপার? এটি কোনও নির্মাণকারীতে ইনজেকশন দেওয়া হচ্ছে এবং সরাসরি এটির দেহে উপলব্ধ। কেন এটি ভিতরে যেতে হবে ngOnInit?
সার্জি

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