Da martedì 26 gennaio è iniziata la distribuzione degli aggiornamenti automatici. Se Firefox non si è ancora aggiornato potete farlo manualmente seguendo le istruzioni riportate in questo articolo della KB Mozilla.
È questo il primo aggiornamento di Firefox del 2016. Di seguito alcune delle novità principali di questa versione, per un elenco completo fate riferimento alle note di versione in inglese.
La novità più interessante è l’attivazione del supporto ai contenuti video WebM/VP9 nei sistemi in cui non è presente il codec H.264, che verrà utilizzato in tutti quei sistemi che lo supportano. Per ulteriori informazioni sui formati che è possibile riprodurre nativamente con Firefox vi rimandiamo a questo articolo della KB Mozilla.
A partire da questa versione, le notifiche Push vengono mostrate anche quando il sito che le trasmette non è caricato. Per ulteriori informazioni su Push, il nuovo standard W3C per le notifiche web, vi rimandiamo a questo articolo della KB di Firefox.
È stata migliorata la schermata di avviso delle connessioni sicure che non sono completamente affidabili per problemi con certificati o che utilizzano algoritmi obsoleti, considerati non più adeguati agli attuali standard di sicurezza.
Sempre per quanto riguarda la sicurezza delle connessioni HTTPS, è stato rimosso il supporto all’algoritmo di cifratura a flusso a chiave simmetrica RC4, ovvero un algoritmo che opera sui singoli bit utilizzando un’unica chiave sia per cifrare che per decifrare, che non rispetta gli odierni standard di sicurezza. Se una connessione HTTPS tenterà di utilizzare tale algoritmo per cifrare il flusso di dati trasmessi, Firefox visualizzerà la schermata di cui al punto precedente.
Sono stati inoltre rimossi due certificati di autorità di certificazione, che non rispettano gli standard molto stringenti di Mozilla in materia, nello specifico quello di Equifax Secure Certificate Authority e UTN – DATACorp SGC. Come sopra, se un sito utilizza un certificato rilasciato e convalidato con uno di questi due certificati, la connessione verrà riconosciuta come non affidabile e verrà visualizzata la schermata di avviso. Per ulteriori informazioni riguardo a come interpretare i dati mostrati nella schermata che appare quando una connessione sicura non è affidabile, vi rimandiamo a questo articolo della KB di Firefox.
A partire da questa versione, le build Windows utilizzeranno per la firma digitale l’algoritmo SHA-256, anziché il vecchio SHA-1.
Risolto un bug che impediva, su Windows XP e Windows Vista, di disattivare l’avvio dello screensaver durante la riproduzione di contenuti video.
Come al solito molte novità riguardano il supporto a nuove caratteristiche di HTML5 e gli strumenti di sviluppo web. Fra le altre cose ora è possibile analizzare l’heap utilizzando lo strumento di gestione della memoria.
Per le altre novità riguardanti gli sviluppatori, oltre che alle note di versione in lingua inglese, vi rimandiamo all’articolo di MDN che tratta l’argomento in dettaglio.
Un altro articolo incentrato sulle novità lato sviluppatori verrà pubblicato a breve anche su hacks.mozilla.org, consigliamo quindi agli interessati di controllare il feed o la homepage del sito.
Per qualunque problema con il nuovo aggiornamento o qualsiasi altro di natura generale con Firefox venite a trovarci sul forum, faremo del nostro meglio per aiutarvi a risolverlo.
È disponibile la versione 43.0 di Firefox. Da martedì 15 dicembre è iniziata la distribuzione degli aggiornamenti automatici, Se Firefox non si è ancora aggiornato potete farlo manualmente seguendo le istruzioni riportate in questo articolo della KB Mozilla.
Sarà questa l’ultima versione del 2015 di Firefox, iniziato con il rilascio della versione 35.0 il 13 gennaio. Di seguito alcune delle novità principali di questa versione, per un elenco completo fate riferimento alle note di versione in inglese.
Rispetto alla versione precedente, ci sono meno novità per quanto riguarda i comuni utenti, molte invece le novità per gli sviluppatori.
A partire da questa versione, Mozilla rende disponibile una versione ufficiale a 64bit per i sistemi Microsoft successivi a Windows 7.
Ora è possibile visualizzare i suggerimenti di ricerca nella barra degli indirizzi. È possibile attivare o disattivare questa funzione dal pannello Ricerca delle opzioni di Firefox.
Ora è possibile specificare una lista aggiuntiva di elementi bloccabili alla protezione antitracciamento. Per ulteriori informazioni sulla protezione antitracciamento fate riferimento a questo articolo del sito di supporto di Firefox.
Migliorata la riproduzione e le API per la gestione dei flussi video m4v.
Ora è possibile utilizzare schermi multipli per i flussi WebRTC, il protocollo per le chat video utilizzato da Firefox Hello. Non avete mai utilizzato Firefox Hello? Beh, allora questo è il momento giusto per iniziare una conversazione con gli amici! 🙂 Per ulteriori informazioni potete fare riferimento a questo articolo della Knowledge Base di Firefox, SUMo per gli amici.
Nei sistemi Microsoft successivi a Windows 8, selezionando un campo di input apparirà automaticamente la tastiera su schermo di sistema.
Come al solito molte novità riguardano il supporto a nuove caratteristiche di HTML5 e gli strumenti di sviluppo web. Fra le altre cose ora è possibile specificare una risoluzione per gli screenshot catturati utilizzando il relativo comando dell’interfaccia da riga di comando (CLI). Questa funzione, che può tornare utile anche ai “non sviluppatori”, consente di catturare uno screenshot della pagina e di salvarla come file o di caricarla sul sito imgur.com semplicemente premendo Shift+F2 e digitando screenshot nomefile o screenshot imgur. Per ulteriori informazioni su tutte le opzioni disponibili è sufficiente digitare help screenshot.
Per le altre novità riguardanti gli sviluppatori, oltre che alle note di versione in lingua inglese, vi rimandiamo all’articolo su MDN che tratta in dettaglio questi argomenti.
Masala, la lady panda rosso scappata dallo zoo di Eureka (California)
Per qualunque problema con il nuovo aggiornamento o qualsiasi altro di natura generale con Firefox venite a trovarci sul forum, faremo del nostro meglio per aiutarvi a risolverlo.
È disponibile la versione 42.0 di Firefox. Da oggi martedì 3 novembre è iniziata la distribuzione degli aggiornamenti automatici, Se Firefox non si è ancora aggiornato potete farlo manualmente seguendo le istruzioni riportate in questo articolo della KB Mozilla.
Il numero 42, oltre a essere ovviamente la risposta alla domanda fondamentale sulla vita, sull’Universo e tutto quanto, come è possibile verificare aprendo la pagina about:life in SeaMonkey, è anche un numero speciale per quanto riguarda il ciclo di rilascio di Firefox; 42 giorni (6 settimane) sono infatti i giorni che intercorrono fra i rilasci delle versioni del browser da quando è stato adottato il ciclo di sviluppo rapido (fast release cycle). E infatti questa versione porta con sé molte novità interessanti. Di seguito alcune delle novità principali di questa versione, per un elenco completo fate riferimento alle note di versione in inglese.
La novità più importante è certamente la protezione antitracciamento in modalità navigazione anonima. Grazie alla protezione antitracciamento alcuni contenuti delle pagine web utilizzati per monitorare la navigazione verranno automaticamente bloccati per una privacy di livello superiore. Per iniziare una nuova sessione in modalità navigazione anonima basta un clic sull’icona raffigurante la maschera. Provatela subito. Per ulteriori informazioni sulla protezione antitracciamento fate riferimento a questo articolo del sito di supporto di Firefox.
A partire da questa versione le schede con contenuti audio in riproduzione verranno contrassegnate con un’icona a forma di altoparlante ed è possibile disattivare l’audio con un semplice clic.
Questa nuova caratteristica funziona con le versioni di Flash superiori alla 19.0 o con gli elementi audio di HTML5. Questo consentirà di identificare subito quale scheda sta riproducendo dei suoni, anche quando si è aperto un gran numero di schede. Per ulteriori informazioni vi rimandiamo all’articolo di SUMO che tratta l’argomento più dettagliatamente.
Numerosi miglioramenti sono stati apportati al gestore password e al sistema di gestione dei login: migliore identificazione dei campi nome utente e password delle pagine, possibilità di copiare, incollare e modificare i dati nel contesto e, molto importante, ora è possibile importare i dati da altri browser (Chrome, Internet Explorer, ecc.). Per ulteriori informazioni su questo argomento vi rimandiamo all’articolo del sito di supporto di Firefox.
Ora è possibile accedere al Centro di controllo dei permessi dei siti direttamente dalla favicon del sito stesso. Ulteriori informazioni in questo articolo della KB di Firefox.
Ora il protocollo WebRTC, quello utilizzato da Firefox Hello, gestisce gli indirizzi IP a 6 blocchi (IPv6). Non avete mai utilizzato Firefox Hello? Beh, allora questo è il momento giusto per iniziare una conversazione con gli amici! 🙂 Per ulteriori informazioni potete fare riferimento a questo articolo della Knowledge Base di Firefox, SUMo per gli amici.
Dietro le quinte continua l’integrazione di nuove specifiche degli standard di nuova generazione HTML5 e CSS4, per quanto riguarda l’ultima versione dei fogli di stile l’integrazione è arrivata al momento al 26%.
Dal punto di vista degli sviluppatori web la novità più interessante è rappresentata dall’introduzione di visualizzare il sorgente di una pagina in una scheda e non più in una nuova finestra. Per le altre novità riguardanti gli sviluppatori, oltre che alle note di versione in lingua inglese, vi rimandiamo agli articoli di Moz Hacks e MDN che trattano in dettaglio questi argomenti.
Per qualunque problema con il nuovo aggiornamento o qualsiasi altro di natura generale con Firefox, venite a trovarci sul forum, faremo del nostro meglio per aiutarvi a risolverlo.
È disponibile la versione 41.0 di Firefox. Da mercoledì 23 settembre è iniziata la distribuzione degli aggiornamenti automatici, Se Firefox non si è ancora aggiornato potete farlo manualmente seguendo le istruzioni riportate in questo articolo della KB Mozilla.
Di seguito alcune delle novità principali di questa versione, per un elenco completo fate riferimento alle note di versione in inglese.
Da questa versione Firefox Hello includerà delle funzioni di messaggistica istantanea. Per scoprire come funziona leggete questo articolo SUMO. Non avete mai utilizzato Firefox Hello? Beh, allora questo è il momento giusto per iniziare una conversazione con gli amici! 🙂 Per ulteriori informazioni potete fare riferimento a questo articolo della Knowledge Base di Firefox, SUMo per gli amici.
Ottimizzata la decodifica delle immagini, questo consentirà di migliorare notevolmente le prestazioni, su alcuni dispositivi la velocità di caricamento risulta quasi doppia rispetto al passato, soprattutto durante lo scrolling delle pagine.
Riassumendo a grandi linee, la risoluzione del Bug. 77999 introduce un processor comune a tutte le pagine per gestire le regole di stile condivise. Prima accadeva che per ogni documento si dovesse impegnare memoria per le regole di stile, anche nel caso queste regole fossero comuni a tutti i documenti, ora invece c’è un processor centrale a cui i documenti possono accedere per le regole di stile. Questo implica che per le regole comuni a tutti i documenti (come ad esempio le personalizzazioni in userContent.css, le regole applicate di default e le regole di Adblock) si faccia una sola allocazione anziché farne una per ciascun documento. Tenete presente che in una scheda ci possono essere più documenti, a seconda di quanti ne vengono richiamati tramite iframe (il caso tipico è rappresentato dai pulsanti di condivisione sui social). Mentre il contributo delle regole di default e delle, eventuali, personalizzazioni via userContent.css sono irrisori e trascurabili, il foglio di stile caricato da Adblock (sostanzialmente per nascondere i banner pubblicitari) è abbastanza grande e incide notevolmente sulla memoria utilizzata (per qualche dato e per approfondire l’argomento si faccia riferimento a questo articolo di Nicholas Nethercote).
Per quanto riguarda Account Firefox, ora è possibile aggiungere un’immagine al proprio profilo.
Ora alle applicazioni che utilizzano il protocollo WebRTC (come ad esempio Firefox Hello) è richiesto il Perfect Forward Secrecy (PFS). Il Perfect Fowrward Secrecy protegge le proprie video chat non consentendo a un eventuale aggressore che dovesse appropriarsi della chiave privata del server di poter decifrare le chiavi generate per cifrare le singole conversazioni. Hello utilizza già il PFS, con questa modifica qualsiasi video chat basata su WebRTC è obbligata a implementarlo.
Migliorato il supporto IME (utilizzato per l’inserimento di caratteri orientali) nei sistemi Microsoft a partire da Windows Vista e successivi, grazie all’API Text Services Framework (TSF).
Da questa versione non è più disponibile la preferenza browser.newtab.url in quanto troppo spesso utilizzata da software terzi per aprire pagine indesiderate. È comunque possibile modificare la pagina caricata all’apertura di una nuova scheda tramite l’estensione New Tab Override.
Dal punto di vista degli sviluppatori web la novità più interessante è rappresentata dall’introduzione di un’API JavaScript mediante la quale è possibile, fra le altre cose, inviare del testo alla clipboard. Uno dei motivi per cui su molti siti si ricorre ancora alla tecnologia Adobe Flash è proprio per effettuare l’operazione di copia negli appunti (ad esempio su Github). Questa novità consentirà sempre più di abbandonare il plugin Flash e creare siti e applicazioni che sfruttino i soli standard web (HTML5, CSS e JavaScript). Per ulteriori informazioni su questa nuova API Javascript leggete l’articolo di Mozilla hacks “Flash free clipboard for the Web”, qui di seguito un piccolo esempio.
Qui un altro esempio che copia negli appunti il testo di questo articolo:
Per le altre novità riguardanti gli sviluppatori, oltre che alle note di versione in lingua inglese, vi rimandiamo agli articoli di Moz Hacks e MDN che trattano in dettaglio questi argomenti.
Per qualunque problema con il nuovo aggiornamento o qualsiasi altro di natura generale con Firefox venite a trovarci sul forum, faremo del nostro meglio per aiutarvi a risolverlo.
È disponibile la versione 40.0 di Firefox. Da oggi martedì 11 agosto è iniziata la distribuzione degli aggiornamenti automatici, Se Firefox non si è ancora aggiornato potete farlo manualmente seguendo le istruzioni riportate in questo articolo della KB Mozilla.
Di seguito alcune delle novità principali di questa versione, per un elenco completo fate riferimento alle note di versione in inglese.
La novità più importante è l’integrazione di Firefox con la nuova versione del sistema di casa Microsoft, Windows 10. Questa volta Microsoft, per promuovere Edge, il nuovo browser che andrà a sostituire Internet Explorer, ha voluto complicare la procedura per impostare il browser di sistema e addirittura modifica questa impostazione ad ogni aggiornamento. non è comunque difficile impostare Firefox come browser predefinito su Windows 10, vi rimandiamo per i dettagli a questo articolo. Se invece siete interessati a conoscere più a fondo la questione etica sulla “furbata” di Microsoft, potete leggere la lettera tradotta in italiano scritta da Chris Beard e indirizzata al CEO Microsoft (Satya Nadella).
Ora potrete accludere un nuovo link in una conversazione Firefox Hello. Può essere utile per fornire un documento o un articolo di riferimento che sarà l’argomento della conversazione in Hello. Ulteriori informazioni in questo articolo. Non avete mai utilizzato Firefox Hello? Beh, allora questo è il momento giusto per iniziare una conversazione con gli amici! 🙂 Per ulteriori informazioni potete fare riferimento a questo articolo della Knowledge Base di Firefox, SUMo per gli amici.
È stato migliorato lo strumento di protezione da phishing e malware, ora verranno controllati e identificati anche i cosidetti software indesiderati. Per ulteriori informazioni a riguardo vi rimandiamo a questo articolo di SUMO.
È stato modificato l’aspetto del Gestore dei componenti aggiuntivi, ora utilizzerà una versione più simile a una pagina web come già avviene da Firefox 38 per il pannello “Opzioni”.
A partire da questa versione verrà mostrato un avviso se le estensioni non sono state firmate digitalmente da Mozilla. Per ulteriori informazioni sulla procedura di firma digitale dei componenti aggiuntivi fate riferimento a questo articolo SUMO. È stata inoltre rimossa la possibilità di utilizzare l’API XPCOM per richiamare funzioni da librerie esterne compilate; questo potrebbe, se gli sviluppatori non hanno avuto la premura di aggiornare i loro componenti, rendere incompatibili alcune estensioni, tipicamente quelle di software esterni che utilizzano questo tipo di tecnologia.
Per quanto riguarda i sistemi Linux, è stato attivato di default l’off main thread compositing, in altre parole ora c’è un thread apposito che gestisce queste attività e non viene rallentato o bloccato da codice in esecuzione nel thread principale di Firefox. Questo consente di migliorare lo scorrimento, la qualità grafica e la riproduzione dei contenuti video.
Sui sistemi Windows, scorrimento e animazioni più fluidi grazie alla funzione hardware sync (sincronizzazione hardware)
Ridotta notevolmente la memoria utilizzata per il ridimensionamento e la riproduzione delle immagini di tipo JPEG.
Per le novità riguardanti gli sviluppatori, oltre che alle note di versione in lingua inglese, vi rimandiamo agli articoli di Mozilla Hacks e MDN che trattano in dettaglio questi argomenti.
Per qualunque problema con il nuovo aggiornamento o qualsiasi altro di natura generale con Firefox venite a trovarci sul forum, faremo del nostro meglio per aiutarvi a risolverlo.
Come tutti gli ambienti di programmazione che non richiedono una gestione esplicita della memoria da parte del programmatore, anche SpiderMonkey (il motore JavaScript di Firefox) ha bisogno di un Garbage Collector, cioè di uno strumento che si occupi di analizzare lo heap per liberare le risorse non più utilizzate. Non esiste un metodo univoco o migliore degli altri per l’implementazione di un Garbage Collector e la scelta di quale algoritmo utilizzare dipende dagli obiettivi che ci si propone di raggiungere: implementazioni più “leggere” consentono un minor impiego di risorse macchina a scapito però di una maggiore frammentazione della memoria. Al contrario implementazioni più complesse richiedono un maggiore tempo di esecuzione ma consentono di evitare la frammentazione dello heap.
Gli sviluppatori di Firefox hanno adottato nel corso degli anni diverse implementazioni del Garbage Collector che hanno tenuto conto della sempre maggiore incidenza del codice JavaScript nelle pagine web. Inizialmente il Garbage Collector utilizzava un algoritmo di tipo reference counting, per poi passare a partire dal 2010 all’implementazione di un Garbage Collector di tipo conservativo mark e sweep. Entrambi questi algoritmi richiedono pochissime risorse computazionali, ma hanno il difetto di produrre una frammentazione dello heap.
È così che dal 2013 si è passati , grazie all’implementazione dell’exact stack rooting, a un’implementazione di un Garbage Collector di tipo generazionale sempre basato sul tracing. Grazie a questa modifica del codice è stato poi possibile implementare lo strumento di compattazione. Nell’articolo è spiegato il funzionamento della compattazione, quando viene eseguita, si analizza il guadagno di memoria che si riesce a ottenere e vengono discusse delle idee per migliorarlo ulteriormente.
Per un approfondimento delle tecniche di Garbage Collection si può consultare questo articolo in italiano che tratta l’argomento in generale e approfondisce il caso del Garbage Collector della Java Virtual Machine.
Sommario
La compattazione è una nuova funzione del Garbage Collector di Firefox, disponibile a partire dalla versione 38, che consente di ridurre la frammentazione esterna nello heap JavaScript. L’obiettivo di questa funzione è ottimizzare il consumo di memoria in generale oltre che gestire con maggiore efficienza i casi di memoria insufficiente. Al momento è stata implementata unicamente la compattazione degli oggetti JavaScript, uno solo tra i vari tipi di celle dello heap elaborate dal Garbage Collector.
Il problema
Lo heap JavaScript è composto da 4000 blocchi di memoria denominati arene, ciascuna delle quali è suddivisa in celle di dimensioni prestabilite. Arene diverse sono utilizzate per memorizzare differenti tipi di celle e ciascuna arena contiene celle dello stesso tipo e della stessa dimensione.
Lo heap contiene diversi tipi di celle, incluse quelle destinate agli oggetti JavaScript, le stringhe e i simboli, ma anche celle utilizzate per dati interni come script (per memorizzare il codice JavaScript), shape (per memorizzare la rappresentazione degli oggetti grafici e delle loro proprietà) e jitcode (codice JIT compilato). Di tutte queste, solitamente le celle utilizzate per gli oggetti JavaScript sono quelle che utilizzano la maggiore quantità di memoria.
Un’arena non può essere liberata se al suo interno c’è una cella che contiene dati in uso. Celle allocate nello stesso periodo possono avere dei cicli di vita differenti, talvolta accade quindi che nello heap si trovino più arene ciascuna contenente solo poche celle attive. Lo spazio libero di ciascuna arena può ancora essere impiegato per allocare nuove celle dello stesso tipo, ma sarà inutilizzabile per celle di tipo diverso o per essere reimpiegato dal sistema in caso di memoria insufficiente.
Di seguito è mostrato un diagramma semplificato dello heap con arene che contengono due diverse tipologie di celle.
Si noti che se fosse possibile utilizzare lo spazio libero nell’arena 3 per allocare le celle dell’arena 5, si otterrebbe un’intera arena libera.
Misurare lo spazio inutilizzato
È possibile conoscere lo spazio utilizzato da queste celle non più attive visitando la pagina about:memory e premendo il tasto MeasureL’ammontare complessivo di memoria per ciascun tipo di cella è visualizzato nella sezione js-main-runtime-gc-heap-committed/unused/gc-things. Per maggiori informazioni su come interpretare i rapporti della pagina about:memory consultare questo articolo su MDN.
Di seguito uno screenshot dell’intera sezione js-main-runtime-gc-heap-committed con la compattazione del Garbage Collector disattivata che mostra la differenza tra spazio utilizzato e non:
Ho effettuato misurazioni approssimative dell’utilizzo di memoria durante la mia normale navigazione con la compattazione sia attivata che disattivata per osservare le differenze. La procedura per ottenere questi dati è descritta nell’ultima sezione dell’articolo. I dati sono stati rilevati con una cinquantina di schede aperte, tra cui Google Mail, Google Calendar, varie pagine di Bugzilla e altri siti. Questo è il risultato ottenuto:
Totale allocazioni esplicite
Celle inutilizzate
Prima della compattazione
1324,46 MiB
69,58 MiB
Dopo la compattazione
1296,28 MiB
40,18 MiB
È possibile osservare una riduzione delle allocazioni esplicite di 29,4MiB (mebibytes). Si tratta solo del 2% rispetto al totale delle allocazioni complessive, ma considerando solo lo spazio occupato dall’allocazione di oggetti JavaScript (al momento gli unici soggetti a compattazione) sale a oltre 8%.
Funzionamento della compattazione
Per recuperare lo spazio inutilizzato il Garbage Collector dovrebbe essere in grado di spostare le celle fra differenti arene, in modo da concentrare le celle attive in un numero limitato di arene e liberare le altre. Certo è più facile a dirsi che a farsi, perché per ogni cella spostata bisognerebbe riaggiornare anche i relativi puntatori. Anche un solo puntatore non aggiornato potrebbe bastare a causare un crash di Firefox.
Questa operazione inoltre è molto dispendiosa in termini di risorse perché richiede l’analisi di un numero non irrilevante di celle alla ricerca dei puntatori da aggiornare. Per questo motivo l’idea è quella di procedere alla compattazione dello heap solo nei momenti in cui si disponga di poca memoria o l’utente non stia utilizzando Firefox.
L’algoritmo di compattazione è suddiviso in tre fasi:
Selezione delle celle da spostare.
Spostamento delle celle.
Aggiornamento di tutti i puntatori con riferimenti a queste celle.
Selezione delle celle da spostare
Ciò che ci proponiamo di fare è spostare il minor numero di dati possibile e di farlo senza riallocare ulteriore memoria, partendo dal presupposto che la memoria a disposizione sia già in esaurimento. Per fare questo inseriamo in una lista tutte le arene che contengono spazio libero, ordinandole in modo decrescente a seconda del numero di celle libere al loro interno. Suddividiamo la lista in due parti a partire dal punto in cui le arene della prima parte contengono abbastanza celle libere per ospitare le celle attive delle arene nella seconda parte. Sposteremo tutte le celle delle arene della seconda parte.
Spostamento delle celle
Allochiamo dunque una nuova cella da una delle arene che non subiranno spostamenti. Il passaggio precedente ci assicura che ci sia abbastanza spazio libero per effettuare questa operazione. A questo punto copiamo i dati dalla posizione iniziale.
In alcuni casi troveremo una cella con puntatori che puntano alla cella medesima: essi verranno aggiornati in questa fase. Il browser potrebbe contenere riferimenti a oggetti esterni, in questo caso utilizzeremo un hook per aggiornarli.
Dopo aver spostato una cella, aggiorneremo la locazione di memoria originale con un puntatore di reindirizzamento che faccia riferimento alla nuova posizione in modo da poterla facilmente ritrovare in seguito. Questo permetterà inoltre al Garbage Collector di identificare le celle che sono state spostate e vedremo come ciò verrà utilizzato nel successivo passaggio.
Aggiornamento dei puntatori alle celle spostate
Questa è la parte più dispendiosa del processo di compattazione. Nel caso più generale, non è possibile conoscere quali celle contengano dei puntatori alle celle che abbiamo spostato, quindi sembra proprio che sia necessario effettuare una scansione di tutte le celle presenti nello heap. Una tale scansione globale dello heap sarebbe davvero dispendiosa in termini di risorse macchina impiegate.
Abbiamo però alcuni metodi per ridurre le risorse impiegate. Innanzitutto si noti che lo heap è suddiviso in più zone: una zona per ogni scheda aperta e altre zone utilizzate dal sistema. Dato che, di norma, le celle non contengono mai puntatori con riferimenti a zone diverse da quella in cui si trovano, la compattazione potrà essere effettuata per zona e non su tutto lo heap. Il caso particolare di celle con puntatori a zone diverse da quella di appartenenza verrà effettuato a parte. La compattazione per zone ci consentirà di suddividere il processo in diverse sezioni incrementali.
In secondo luogo, per costruzione, esistono delle tipologie di celle che non possono contenere puntatori a altre tipologie di celle (a essere precisi ci sono alcune tipologie di celle che non possono proprio contenere dei puntatori), è quindi possibile escludere a priori alcune celle dalla ricerca.
Infine, possiamo parallelizzare questa operazione e sfruttare tutte le risorse della CPU disponibili.
È importante notare che ciò è stato reso possibile solo grazie al lavoro fatto a suo tempo implementando l’exact stack rooting, come descritto in questo articolo del blog Mozilla. Infatti è possibile spostare gli oggetti solamente conoscendo quali locazioni nello stack sono root, altrimenti si corre il rischio di sovrascrivere dei dati non correlati nello stack che potrebbero essere interpretati erroneamente come dei puntatori a celle.
Programmare l’esecuzione della compattazione
Come accennato in precedenza, la compattazione non viene effettuata a ogni ciclo di esecuzione del Garbage Collector. Allo stato attuale dell’implementazione essa viene effettuata nelle seguenti situazioni:
è stata utilizzata tutta la memoria e si cerca di fare un ultimo tentativo per liberare dello spazio utile;
il sistema operativo genera un messaggio riguardante la gestione della memoria non corretta da parte di Firefox;
l’utente non utilizza il sistema per un certo periodo di tempo (per impostazione predefinita questo periodo è attualmente di 20 secondi).
Nei primi due casi la compattazione viene avviata per scongiurare situazioni di memoria insufficiente, mentre nel terzo caso si cerca di ottimizzare la memoria a disposizione senza impattare la navigazione.
Conclusione
Spero che questo articolo sia riuscito a spiegare il problema che ci proponiamo di risolvere grazie allo strumento di compattazione del Garbage Collector e come stiamo cercando di affrontarlo.
Un inaspettato effetto positivo dell’implementazione della compattazione nel Garbage Collector è che ha rivelato alcuni errori nel tracing dei puntatori alle celle. E questo tipo di errori possono generare dei crash difficili da identificare e riprodurre e generare possibili falle nella sicurezza del browser, quindi possiamo considerarlo un ulteriore miglioramento anche da questo punto di vista.
Idee per il futuro
L’introduzione della compattazione è stata un’importante tassello per il miglioramento del Garbage Collector di Firefox, ma non è comunque finita qui. Ci sono ancora molti altri aspetti su cui possiamo concentrarci per migliorarlo ulteriormente.
Attualmente la compattazione viene effettuata solo sugli oggetti JavaScript, ma esistono molti altri oggetti nello heap e estenderla anche a questi potrebbe consentirci di ottimizzare ulteriormente la memoria utilizzata. Una domanda sorge spontanea: è possibile determinare a priori se le celle contengono dei puntatori alle celle che andremo a spostare? Se trovassimo il modo per farlo, le risorse impiegate per la compattazione verrebbero ulteriormente ridotte. Una possibile soluzione è scansionare lo heap in background, ma per farlo si renderebbe necessario individuare le modifiche effettuate alle celle dal mutator.
L’attuale algoritmo del Garbage Collector raggruppa assieme celle allocate in diversi momenti. Solitamente, le celle che sono allocate nello stesso momento hanno una durata simile, motivo per cui questa scelta non è il massimo.
Se riuscissimo a minimizzare i tempi di esecuzione della compattazione sarebbe possibile effettuarla ogni qualvolta il Garbage Collector rilevi un certo livello di frammentazione dello heap.
Come calcolare lo spazio liberato con la compattazione
Per stimare a grandi linee lo spazio liberato grazie alla compattazione è possibile effettuare i seguenti passaggi:
Disattivare la compattazione aprendo la pagina about:config e impostando la preferenza javascript.options.mem.gc_compacting a false.
Al momento attuale è preferibile disattivare la modalità multiprocesso di Firefox dal pannello Opzioni.
Riavviare Firefox e aprire alcune schede. Per guadagnare tempo è presente un’opzione che permette di ricaricare tutte le schede della sessione precedente. Attendere che le pagine vengano caricate.
Aprire la pagina about:memory e effettuare un’esecuzione completa del Garbage Collector facendo clic su Minimize memory usage e successivamente su Measure. Poiché è necessario un po’ di tempo affinché la memoria si assesti, è consigliabile effettuare l’operazione un certo numero di volte per ottenere dei valori significativi.
Annotare l’ammontare delle allocazioni esplicite (Total GC size) e quello di js-main-runtime-gc-heap-committed/unused/gc-things.
Riattivare nuovamente la compattazione impostando javascript.options.mem.gc_compacting a true. Non è necessario riavviare Firefox.
Fare nuovamente clic su Minimize memory usage e successivamente su Measure.
Confrontare le letture con quelle precedenti.
Notare che i valori ottenuti non saranno precisi a causa delle varie operazioni in atto in background, ma rappresentano comunque una buona approssimazione.