{"id":22265,"date":"2020-05-31T03:17:10","date_gmt":"2020-05-31T01:17:10","guid":{"rendered":"https:\/\/savinol.sg-host.com\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/"},"modified":"2020-05-31T03:17:10","modified_gmt":"2020-05-31T01:17:10","slug":"javascript-e-garbage-collector-javascript-html-it","status":"publish","type":"post","link":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/","title":{"rendered":"Javascript e Garbage Collector | Javascript HTML.it"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>Quando si programmano applicazioni in <a href=\"https:\/\/www.html.it\/guide\/guida-javascript-di-base\/\">Javascript<\/a>, capita spesso di \u201cdimenticarsi\u201d del consumo della memoria, affidandosi alla \u201cmagica\u201d capacit\u00e0 del browser (o anche del sistema operativo, in base al contesto applicativo \u2013 vedi <a href=\"https:\/\/www.html.it\/guide\/guida-nodejs\/\">Node.js<\/a>) di gestirlo. In realt\u00e0 non sempre \u00e8 cos\u00ec, e per applicazioni pi\u00f9 complesse capita di doversi chiedere come venga gestito questo aspetto.<\/p>\n<p>Seguendo alcune idee discusse in un <a href=\"http:\/\/stevehanov.ca\/blog\/?id=148\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">post di Steve Hanov<\/a>, \u00e8 possibile verificare se un oggetto Javascript \u00e8 stato \u201cdistrutto\u201d (e quindi rimosso dalla memoria) dal <strong>garbage collector<\/strong> del browser. Sfortunatamente, il metodo funziona con <a href=\"https:\/\/download.html.it\/software\/google-chrome\/\">Chrome<\/a> ed altri browser, ma non con <a href=\"https:\/\/download.html.it\/software\/firefox\/\">Firefox<\/a>. Rimane tuttavia un utile strumento di test e debug.<\/p>\n<h2>Il codice<\/h2>\n<p>Il codice che segue sfrutta la classe <code>WeakMap<\/code> per associare 1 GB di memoria ad un qualsiasi altro oggetto. Nel momento in cui quest\u2019ultimo viene eliminato dal garbage collector, verr\u00e0 rimosso anche il GB associato ad esso. Sfruttando la possibilit\u00e0 (offerta da Chrome) di verificare la quantit\u00e0 di memoria usata, \u00e8 possibile analizzare se l\u2019oggetto che ci interessa analizzare \u00e8 stato liberato o meno.<\/p>\n<p>In aggiunta a quanto detto, si noter\u00e0 la presenza di un <a href=\"https:\/\/www.html.it\/pag\/48700\/gestione-dei-timer-setinterval-e-settimeout\/\">timeout<\/a> che agisce ogni 10 secondi. La spiegazione di ci\u00f2 \u00e8 dovuta al fatto che Chrome esegue il garbage collector ad intervalli pi\u00f9 o meno regolari, proprio di 10 secondi.<\/p>\n<pre><code class=\"language-javascript\">\n\/** Determines if an object is freed\n@param obj is the object of interest\n@param freeFn is a function that frees the object.\n@returns a promise that resolves to {freed: boolean, memoryDiff:number}\n@author Steve Hanov &lt;steve.hanov@gmail.com&gt;\n*\/\nfunction isObjectFreed(obj, freeFn) {\n  return new Promise( (resolve) =&gt; {\n    if (!performance.memory) {\n      throw new Error(\"Browser not supported.\");\n    }\n    \/\/ When obj is GC'd, the large array will also be GCd and the impact will\n    \/\/ be noticeable.\n    const allocSize = 1024*1024*1024;\n    const wm = new WeakMap([[obj, new Uint8Array(allocSize)]]);\n    \/\/ wait for memory counter to update\n    setTimeout( () =&gt; {\n      const before = performance.memory.usedJSHeapSize;\n      \/\/ Free the memory\n      freeFn();\n      \/\/ wait for GC to run, at least 10 seconds\n      setTimeout( () =&gt; {\n        const diff = before - performance.memory.usedJSHeapSize;\n        resolve({ \n          freed: diff &gt;= allocSize, \n          memoryDiff: diff - allocSize\n        });\n      }, 10000);\n    }, 100);\n  });\n}\nlet foo = {bar:1};\nisObjectFreed(foo, () =&gt; foo = null).then( (result) =&gt; {\n  document.write(`Object GCd:${result.freed}, ${result.memoryDiff} bytes freed`)\n}, (error) =&gt; {\n  document.write(`Error: ${error.message}`)\n})\n<\/code><\/pre>\n<p>L\u2019associazione di 1 GB di memoria all\u2019oggetto da analizzare, nasce dalla necessit\u00e0 di dover potere verificare una differenza significativa nella quantit\u00e0 di memoria usata. Senza questo \u201ctrucchetto\u201d, la differenza non sarebbe significativa, e l\u2019analisi di memoria diventerebbe complicata (se non impossibile).<\/p>\n<p>\u00c8 ovvio notare che non \u00e8 certamente l\u2019ideale \u201csprecare\u201d 1 GB di memoria in un ambiente di produzione. Ciononostante, quello appena visto rimane un utile esempio applicabile in fase di test e debug, soprattutto per applicazioni che utilizzano oggetti di difficile gestione, \u201cimmersi\u201d in framework come <a href=\"https:\/\/www.html.it\/guide\/react-la-guida\/\">React<\/a>, <a href=\"https:\/\/www.html.it\/guide\/vue-js-la-guida\/\">Vue.js<\/a> o <a href=\"https:\/\/www.html.it\/guide\/guida-angularjs-2\/\">Angular<\/a>.<\/p>\n<p><em>Fonte<\/em>: <a href=\"http:\/\/stevehanov.ca\/blog\/?id=148\" class=\"text-link text-link--special\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span class=\"underline\">Steve Hanov<\/span><i class=\"ico-external\"\/><\/a><\/p>\n<\/div>\n<p><br \/>\n<br \/><a href=\"http:\/\/feedproxy.google.com\/~r\/htmlitedit\/~3\/KwDr88IbTSA\/\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si programmano applicazioni in Javascript, capita spesso di \u201cdimenticarsi\u201d del consumo della memoria, affidandosi alla \u201cmagica\u201d capacit\u00e0 del browser (o anche del sistema operativo, in base al contesto applicativo \u2013 vedi Node.js) di gestirlo. In realt\u00e0 non sempre \u00e8 cos\u00ec, e per applicazioni pi\u00f9 complesse capita di doversi chiedere come venga gestito questo aspetto&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_s2mail":""},"categories":[37],"tags":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia\" \/>\n<meta property=\"og:description\" content=\"Quando si programmano applicazioni in Javascript, capita spesso di \u201cdimenticarsi\u201d del consumo della memoria, affidandosi alla \u201cmagica\u201d capacit\u00e0 del browser (o anche del sistema operativo, in base al contesto applicativo \u2013 vedi Node.js) di gestirlo. In realt\u00e0 non sempre \u00e8 cos\u00ec, e per applicazioni pi\u00f9 complesse capita di doversi chiedere come venga gestito questo aspetto....\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\" \/>\n<meta property=\"og:site_name\" content=\"AGENZIA WEB Italia\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-31T01:17:10+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/c0748e23499fac2fd73b79d1379fdf42\"},\"headline\":\"Javascript e Garbage Collector | Javascript HTML.it\",\"datePublished\":\"2020-05-31T01:17:10+00:00\",\"dateModified\":\"2020-05-31T01:17:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\"},\"wordCount\":312,\"publisher\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization\"},\"articleSection\":[\"News\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\",\"url\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\",\"name\":\"Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia\",\"isPartOf\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#website\"},\"datePublished\":\"2020-05-31T01:17:10+00:00\",\"dateModified\":\"2020-05-31T01:17:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Javascript e Garbage Collector | Javascript HTML.it\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#website\",\"url\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/\",\"name\":\"AGENZIA WEB Italia\",\"description\":\"Web design Web agency Italia\",\"publisher\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization\",\"name\":\"Multimedia Web\",\"url\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-content\/uploads\/2016\/05\/multimediaweb1.png\",\"contentUrl\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-content\/uploads\/2016\/05\/multimediaweb1.png\",\"width\":200,\"height\":57,\"caption\":\"Multimedia Web\"},\"image\":{\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/c0748e23499fac2fd73b79d1379fdf42\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/991cd68bbfd6f946517378a63fc3a1f7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/991cd68bbfd6f946517378a63fc3a1f7?s=96&d=mm&r=g\",\"caption\":\"admin\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/","og_locale":"it_IT","og_type":"article","og_title":"Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia","og_description":"Quando si programmano applicazioni in Javascript, capita spesso di \u201cdimenticarsi\u201d del consumo della memoria, affidandosi alla \u201cmagica\u201d capacit\u00e0 del browser (o anche del sistema operativo, in base al contesto applicativo \u2013 vedi Node.js) di gestirlo. In realt\u00e0 non sempre \u00e8 cos\u00ec, e per applicazioni pi\u00f9 complesse capita di doversi chiedere come venga gestito questo aspetto....","og_url":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/","og_site_name":"AGENZIA WEB Italia","article_published_time":"2020-05-31T01:17:10+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"admin","Tempo di lettura stimato":"2 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#article","isPartOf":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/"},"author":{"name":"admin","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/c0748e23499fac2fd73b79d1379fdf42"},"headline":"Javascript e Garbage Collector | Javascript HTML.it","datePublished":"2020-05-31T01:17:10+00:00","dateModified":"2020-05-31T01:17:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/"},"wordCount":312,"publisher":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization"},"articleSection":["News"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/","url":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/","name":"Javascript e Garbage Collector | Javascript HTML.it - AGENZIA WEB Italia","isPartOf":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#website"},"datePublished":"2020-05-31T01:17:10+00:00","dateModified":"2020-05-31T01:17:10+00:00","breadcrumb":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/javascript-e-garbage-collector-javascript-html-it\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.nycwebdesign.eu\/webdesign\/"},{"@type":"ListItem","position":2,"name":"Javascript e Garbage Collector | Javascript HTML.it"}]},{"@type":"WebSite","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#website","url":"https:\/\/www.nycwebdesign.eu\/webdesign\/","name":"AGENZIA WEB Italia","description":"Web design Web agency Italia","publisher":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.nycwebdesign.eu\/webdesign\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#organization","name":"Multimedia Web","url":"https:\/\/www.nycwebdesign.eu\/webdesign\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/logo\/image\/","url":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-content\/uploads\/2016\/05\/multimediaweb1.png","contentUrl":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-content\/uploads\/2016\/05\/multimediaweb1.png","width":200,"height":57,"caption":"Multimedia Web"},"image":{"@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/c0748e23499fac2fd73b79d1379fdf42","name":"admin","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.nycwebdesign.eu\/webdesign\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/991cd68bbfd6f946517378a63fc3a1f7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/991cd68bbfd6f946517378a63fc3a1f7?s=96&d=mm&r=g","caption":"admin"}}]}},"_links":{"self":[{"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/posts\/22265"}],"collection":[{"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/comments?post=22265"}],"version-history":[{"count":0,"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/posts\/22265\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/media?parent=22265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/categories?post=22265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nycwebdesign.eu\/webdesign\/wp-json\/wp\/v2\/tags?post=22265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}