Automatically unload (discard/hibernate) longly unused tabs to free resources / when running out of memory
Categories
(Firefox :: Tabbed Browser, defect)
Tracking
()
Tracking | Status | |
---|---|---|
firefox67 | --- | fixed |
People
(Reporter: b1437400, Assigned: gsvelto)
References
(Blocks 3 open bugs)
Details
(Keywords: memory-footprint, Whiteboard: [Snappy:P2])
Attachments
(3 files, 5 obsolete files)
Reporter | ||
Comment 2•13 years ago
|
||
Reporter | ||
Comment 3•13 years ago
|
||
Updated•13 years ago
|
Comment 4•13 years ago
|
||
Reporter | ||
Comment 5•13 years ago
|
||
Reporter | ||
Updated•13 years ago
|
Comment 6•13 years ago
|
||
Reporter | ||
Comment 7•13 years ago
|
||
Reporter | ||
Comment 8•13 years ago
|
||
Comment 9•13 years ago
|
||
Comment 10•13 years ago
|
||
Reporter | ||
Comment 11•13 years ago
|
||
Comment 12•13 years ago
|
||
Reporter | ||
Comment 13•13 years ago
|
||
Reporter | ||
Comment 14•13 years ago
|
||
Comment 15•13 years ago
|
||
Reporter | ||
Comment 16•13 years ago
|
||
Comment 17•13 years ago
|
||
Comment 18•13 years ago
|
||
Reporter | ||
Comment 19•13 years ago
|
||
Comment 20•13 years ago
|
||
Comment 21•13 years ago
|
||
Comment 22•13 years ago
|
||
Reporter | ||
Comment 23•13 years ago
|
||
Comment 24•13 years ago
|
||
Comment 25•13 years ago
|
||
Comment 26•13 years ago
|
||
Comment 27•13 years ago
|
||
Comment 28•13 years ago
|
||
Updated•13 years ago
|
Comment 29•13 years ago
|
||
Comment 30•13 years ago
|
||
Comment 31•13 years ago
|
||
Comment 32•13 years ago
|
||
Comment 33•13 years ago
|
||
Comment 34•13 years ago
|
||
Comment 35•13 years ago
|
||
Comment 36•13 years ago
|
||
Comment 37•13 years ago
|
||
Comment 38•13 years ago
|
||
Comment 39•13 years ago
|
||
Comment 40•13 years ago
|
||
Comment 41•13 years ago
|
||
Comment 42•13 years ago
|
||
Comment 43•13 years ago
|
||
Comment 44•13 years ago
|
||
Comment 46•13 years ago
|
||
Comment 47•13 years ago
|
||
Comment 48•13 years ago
|
||
Comment 49•13 years ago
|
||
Comment 50•13 years ago
|
||
Comment 51•13 years ago
|
||
Comment 52•13 years ago
|
||
Comment 53•13 years ago
|
||
Comment 54•13 years ago
|
||
Comment 55•13 years ago
|
||
Comment 56•13 years ago
|
||
Comment 57•13 years ago
|
||
Comment 58•13 years ago
|
||
Comment 59•13 years ago
|
||
Comment 60•13 years ago
|
||
Comment 61•13 years ago
|
||
Comment 62•13 years ago
|
||
Comment 63•13 years ago
|
||
Comment 64•13 years ago
|
||
Updated•13 years ago
|
Updated•13 years ago
|
Comment 65•13 years ago
|
||
Comment 66•13 years ago
|
||
Comment 67•13 years ago
|
||
Comment 68•13 years ago
|
||
Comment 69•13 years ago
|
||
Comment 70•13 years ago
|
||
Comment 71•13 years ago
|
||
Comment 72•13 years ago
|
||
Comment 73•13 years ago
|
||
Comment 74•13 years ago
|
||
Comment 75•13 years ago
|
||
Comment 76•13 years ago
|
||
Comment 77•13 years ago
|
||
Comment 78•13 years ago
|
||
Comment 79•13 years ago
|
||
Comment 80•13 years ago
|
||
Comment 81•12 years ago
|
||
Comment 82•12 years ago
|
||
Comment 83•12 years ago
|
||
Comment 84•12 years ago
|
||
Comment 85•12 years ago
|
||
Comment 87•12 years ago
|
||
Comment 88•12 years ago
|
||
Comment 89•12 years ago
|
||
Comment 90•12 years ago
|
||
Comment 91•12 years ago
|
||
Comment 92•12 years ago
|
||
Comment 93•12 years ago
|
||
Comment 94•12 years ago
|
||
Comment 95•12 years ago
|
||
Updated•12 years ago
|
Updated•12 years ago
|
Updated•12 years ago
|
Comment 97•12 years ago
|
||
Comment 98•11 years ago
|
||
Comment 99•11 years ago
|
||
Comment 100•11 years ago
|
||
Updated•11 years ago
|
Updated•11 years ago
|
Updated•11 years ago
|
Comment 101•11 years ago
|
||
Comment 102•11 years ago
|
||
Comment 103•11 years ago
|
||
Comment 104•11 years ago
|
||
Updated•11 years ago
|
Comment 105•11 years ago
|
||
Comment 106•11 years ago
|
||
Comment 107•11 years ago
|
||
Comment 108•11 years ago
|
||
Comment 109•11 years ago
|
||
Comment 110•11 years ago
|
||
Comment 111•11 years ago
|
||
Comment 112•11 years ago
|
||
Comment 113•11 years ago
|
||
Comment 114•11 years ago
|
||
Comment 115•11 years ago
|
||
Updated•11 years ago
|
Comment 116•11 years ago
|
||
Updated•10 years ago
|
Comment 119•10 years ago
|
||
unrelated |
Comment 120•10 years ago
|
||
Comment 121•10 years ago
|
||
Comment hidden (off-topic) |
Comment hidden (off-topic) |
Comment 124•10 years ago
|
||
Comment 125•10 years ago
|
||
spam-reviewed |
Comment 126•10 years ago
|
||
Comment 127•10 years ago
|
||
Comment 128•10 years ago
|
||
Updated•10 years ago
|
Comment 129•10 years ago
|
||
Comment 130•10 years ago
|
||
Comment 131•10 years ago
|
||
Comment 132•10 years ago
|
||
Comment 133•10 years ago
|
||
Comment 134•10 years ago
|
||
Comment 135•10 years ago
|
||
Comment 136•10 years ago
|
||
Comment 137•10 years ago
|
||
Comment hidden (off-topic) |
Comment hidden (off-topic) |
Comment hidden (off-topic) |
Comment 141•10 years ago
|
||
spam-reviewed |
Comment hidden (off-topic) |
Comment 143•10 years ago
|
||
Comment 144•10 years ago
|
||
Comment 145•10 years ago
|
||
Comment 146•10 years ago
|
||
Comment 147•10 years ago
|
||
Comment 148•10 years ago
|
||
Comment 149•10 years ago
|
||
Comment 150•10 years ago
|
||
Comment 151•10 years ago
|
||
Comment 152•10 years ago
|
||
Comment 153•9 years ago
|
||
Comment hidden (me-too) |
Comment 156•9 years ago
|
||
Comment 157•9 years ago
|
||
spam-reviewed |
Comment 158•8 years ago
|
||
Comment 160•7 years ago
|
||
Comment 161•7 years ago
|
||
Comment 162•7 years ago
|
||
Comment 163•7 years ago
|
||
Comment 164•7 years ago
|
||
Comment 165•7 years ago
|
||
Comment 166•7 years ago
|
||
Comment 167•7 years ago
|
||
Comment 168•7 years ago
|
||
Comment 169•7 years ago
|
||
Comment 170•7 years ago
|
||
Comment 171•7 years ago
|
||
Comment 172•7 years ago
|
||
Comment 173•7 years ago
|
||
Updated•6 years ago
|
Comment 177•6 years ago
|
||
I believe that 1524501 is not a duplicate of this bug.
This bug is not about an event to act when memory is low while the other one is.
There's an overlap on purpose with a small difference.
I suggest to either change the title of this bug to include that or keep the other open as something which would be an addition to this bug which is about discarding when memory is low.
What do you think?
Updated•6 years ago
|
Assignee | ||
Comment 178•6 years ago
|
||
I was aware of this bug but I had opened a new one because there's a significant difference between the two: in this bug we want to reclaim memory by unloading tabs that have long been idle even though we don't need that memory right away. Bug 1524501 is about forcibly unloading tabs when we know we're low on memory and not doing so would lead to an OOM crash. The latter is always positive for the user as we're introducing a small annoyance (reloading the tabs) in exchange for not crashing; the former might be annoying for no immediate benefit if we unload tabs that the user will come back to soon. See this experiment by :dietrich for some discussion on the topic.
Assignee | ||
Comment 179•6 years ago
|
||
I will resume my work under this bug since the title has changed but we should also have a separate one for the original intent, i.e. unloading tabs that have been idle for a long time even if available memory is plentiful.
Updated•6 years ago
|
Comment 180•6 years ago
|
||
Forcible unloading tabs when running out of memory is very important to introduce and very welcome.
But I am not sure about unloading tabs that have been idle for a long time - maybe user should be given message about that with options to chose from: unload these tabs or not.
Comment 181•6 years ago
|
||
Just set a option to enable the "unload idle tabs" (disabled by default) and, below, a place for the user to define the time to trigger the unload
As a alternative or even in parallel, only start to unload after X loaded tabs (let me guess about 20 tabs, but that can also be a option)
Assignee | ||
Comment 182•6 years ago
|
||
I've cooked up a very rough WIP that implements this functionality. There's still a few issues to be sorted though and I would like to write tests for this. The biggest issue I encountered is that I seem to be able to run into a race if I unload the tabs while switching through them. I don't know if this is a problem with my patch or with the discardBrowser() implementation.
Assignee | ||
Comment 183•6 years ago
|
||
This unloads the tabs in the correct order, first tabs not playing audio and not pinned, then pinned tabs not playing audio and finally tabs playing audio if nothing else is available.
Comment 184•6 years ago
|
||
A pop up with this information will be very annoying for me and much other users and shouldn't definitely be activated automatically. A push notification could be an option. In my opinion pinned Tabs and media tabs shouldn't be affected by this else I wouldn't pin them up. I already need to "restart" my Youtube Playlist every XX Minutes, affected media tabs would only increase the cycle of "restarting" it. You should think about a "Whitelist" instead of pinned and media tabs.
But as a hard fact, I cant use Firefox without a discarding Addon, else i would run out of memory (16GB), up to twice per day. I cant imagine this as a goal from Mozilla.
Possible Settings:
[X] Activate automatic discard of inactive Tabs after [30] Minutes and after [10] Minutes if a battery is used.
[ ] Also discard pinned and audio playing tabs.
[X] Display a Push Notification after discarding tabs. ("XX Tab(s) are discarded cause of inactivity.")
[X] Do not load discarded Tabs at start of Firefox to improve the startup time of Firefox.
This decreases waste of Memory and Energy.
(Yes CPU/GPU? hungry sites can also waste Energy. I won't see the difference on my overclocked I7 but on a mobile Device...!)
Sorry @all I don't know the difference between unloaded, discarded and so on. Not leeching memory and staying ready on a click is important for a prosumer with much tabs).
Comment 185•6 years ago
|
||
This option should not affect tabs with filled forms. This could result in bad UX. (Write a long text - going for a break - all discarded/deleted)
Assignee | ||
Comment 186•6 years ago
|
||
This removes the need to go through the browser-to-tab mapping when discarding
a tab and simplifies the relevant code. Besides being renamed discardBrowser()
was also split so that one can check if a tab can be discarded prior to trying
it.
Assignee | ||
Comment 187•6 years ago
|
||
This adds a mechanism that discards tabs when the browser detects a low-memory
scenario. Tabs are discarded in LRU order prioritizing regular tabs over
pinned ones, pinned ones over tabs playing audio and all of the previous over
pinned tabs playing audio.
Assignee | ||
Updated•6 years ago
|
Comment 188•6 years ago
|
||
(In reply to Gabriele Svelto [:gsvelto] from comment #186)
Created attachment 9045221 [details]
Bug 675539 - Make tab discard functionality work on tab objects directlyThis removes the need to go through the browser-to-tab mapping when discarding
a tab and simplifies the relevant code. Besides being renamed discardBrowser()
was also split so that one can check if a tab can be discarded prior to trying
it.
It's called discardBrowser deliberately, because it throws away the browser. The tab (the thing that sits in the tab bar) remains...
Assignee | ||
Comment 189•6 years ago
|
||
(In reply to Dão Gottwald [::dao] from comment #188)
It's called discardBrowser deliberately, because it throws away the browser. The tab (the thing that sits in the tab bar) remains...
Makes sense, I'll reverse the name change, though passing the tab instead of the browser object still looks like a reasonable choice unless I'm missing something.
Comment 190•6 years ago
|
||
(In reply to Gabriele Svelto [:gsvelto] from comment #187)
Created attachment 9045222 [details]
Bug 675539 - Unload tabs in low-memory scenariosThis adds a mechanism that discards tabs when the browser detects a low-memory
scenario. Tabs are discarded in LRU order prioritizing regular tabs over
pinned ones, pinned ones over tabs playing audio and all of the previous over
pinned tabs playing audio.
Could we reload the tab if it is selected? discardBrowser does nothing if the tab is selected. Ex: If the current tab contains a serious memory leak, it is probably better reloading it than waiting for the OOM killer to kill Firefox.
Assignee | ||
Comment 191•6 years ago
|
||
(In reply to Kristian Klausen from comment #190)
Could we reload the tab if it is selected? discardBrowser does nothing if the tab is selected. Ex: If the current tab contains a serious memory leak, it is probably better reloading it than waiting for the OOM killer to kill Firefox.
That is an interesting idea but a bit disruptive for the user. For the time being I haven't considered evaluating how much memory a tab is using but since it's possible to get an approximation we might want to add this down the line as a measure of last resort.
Comment hidden (abuse-reviewed) |
Comment hidden (off-topic) |
Comment 194•6 years ago
|
||
Comment 195•6 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/60a25e3f7b50
https://hg.mozilla.org/mozilla-central/rev/a836b30ac070
Comment 196•6 years ago
|
||
Will that new behaviour require a mention in our release notes?
Comment 197•6 years ago
|
||
I believe, although not required, it should be mentioned in the release notes.
Comment 198•6 years ago
|
||
(In reply to Pascal Chevrel:pascalc from comment #196)
Will that new behaviour require a mention in our release notes?
Note that at this time, this is preffed to run on Nightly only for now.
Comment 199•6 years ago
|
||
(In reply to Mike Conley (:mconley) (:⚙️) from comment #198)
(In reply to Pascal Chevrel:pascalc from comment #196)
Will that new behaviour require a mention in our release notes?
Note that at this time, this is preffed to run on Nightly only for now.
We have release notes for Nightly :)
Assignee | ||
Comment 200•6 years ago
|
||
Ideally I'd say yes because this should significantly reduce the chances of Firefox crashing because of an OOM condition. However we'll need at least a couple of weeks worth of crash ping data to confirm my hypothesis. Also this is Windows-only ATM because it's the only platform where we can detect a low-memory condition.
Updated•6 years ago
|
Comment 201•6 years ago
|
||
@Gabriele it's possible to detect low-memory condition on Linux: https://github.com/torvalds/linux/commit/eb414681d5a07d28d2ff90dc05f69ec6b232ebd2
Is there is separate bugreport about implementing automatic unload unused tabs on Linux, or I should register one?
Assignee | ||
Comment 202•6 years ago
|
||
The unloading part of this bug is system agnostic, what needs to be implemented is low-memory detection and I don't think we have a bug for that so feel free to open one and CC me. Thanks.
Comment 203•6 years ago
|
||
Done: bug 1532955
Comment 204•6 years ago
|
||
Can I get a bit of detail on how a tab is determined as a candidate for offloading? How long does it need to sit unvisited/unviewed, etc.?
Comment 205•6 years ago
|
||
(In reply to tahn from comment #204)
Can I get a bit of detail on how a tab is determined as a candidate for offloading? How long does it need to sit unvisited/unviewed, etc.?
All background tabs are candidates for being unloaded when there is a memory pressure event, there is no minimum tab lifetime. The order is outlined in the patch description above (Comment 187).
Comment 206•6 years ago
|
||
Is there an easily available option, or will there be one for the user to configure the threshold for a memory pressure event?
It is a huge problem with modern browsers that if you work from home on a machine with lots of system memory with applications that need lots of RAM which you also use privately, that a modern browser will happily gobble up 8GB+ if running for a while, making it impossible to launch actual work without manually terminating it. I understand this might be desirable on some entertainment-only machines to optimize performance, but in general this seems really like something that should be configurable.
(Especially since most modern desktop systems, unlike e.g. Android, lack a cooperative "please give up some of your memory" event for processes that is based on something else than the process itself deciding/observing that system memory as a whole is already critically low)
Assignee | ||
Comment 207•6 years ago
|
||
(In reply to jonas from comment #206)
Is there an easily available option, or will there be one for the user to configure the threshold for a memory pressure event?
It is a huge problem with modern browsers that if you work from home on a machine with lots of system memory with applications that need lots of RAM which you also use privately, that a modern browser will happily gobble up 8GB+ if running for a while, making it impossible to launch actual work without manually terminating it. I understand this might be desirable on some entertainment-only machines to optimize performance, but in general this seems really like something that should be configurable.
The threshold is not configurable, but there's a number of extensions that allow you to unload tabs manually or based on usage, last time of visit, etc... You might want to try one of those. This is just meant to save Firefox when the alternative is crashing.
Comment 208•6 years ago
|
||
Thanks so much, I didn't know where to start with this comment thread!
(In reply to Kestrel from comment #205)
(In reply to tahn from comment #204)
Can I get a bit of detail on how a tab is determined as a candidate for offloading? How long does it need to sit unvisited/unviewed, etc.?
All background tabs are candidates for being unloaded when there is a memory pressure event, there is no minimum tab lifetime. The order is outlined in the patch description above (Comment 187).
Comment 209•6 years ago
|
||
but there's a number of extensions
Last time I checked (admittedly a while ago) none of them worked with quantum, also they tend to offer something else other than raw total memory usage as trigger.
Also, I am wondering: if you want to avoid crashing, are you also avoiding OOM kills on linux?
Because right now on all big linux desktops firefox has kinda awful behavior (all other browsers as well) when a website allocates infinite memory in a javascript loop, which can lead to a full system freeze in seconds (since the OOM killer can take minutes to kick in on linux on a graphical desktop, sadly) Often hard reset is the only quick way to solve this, making this a very effective denial of service with almost no way of defending other than advanced sandboxes like VMs.
This could all be solved if the threshold wasn't "oh no malloc() returned NULL" or "99.999999% of system memory and swap used" but some saner lower value, ideally configurable.
Can addons solve this problem? Will kick in fast enogh with a tight website javascript allocation loop to work in all such situations? Isn't it easier to just make this threshold configurable at least through about:config? This doesn't seem like something that should be solved through addon hackery, given the major impact it has on linux desktops.
Comment 210•6 years ago
|
||
Can you tell me what the user experience is when a "tab is discarded"?
We close the tabs on them? Or are they suspended in some way? Or do we walk them through a guided path to close it themselves to save on memory? Trying to understand the user experience.
(In reply to Gabriele Svelto [:gsvelto] from comment #187)
Created attachment 9045222 [details]
Bug 675539 - Unload tabs in low-memory scenariosThis adds a mechanism that discards tabs when the browser detects a low-memory
scenario. Tabs are discarded in LRU order prioritizing regular tabs over
pinned ones, pinned ones over tabs playing audio and all of the previous over
pinned tabs playing audio.
Comment 211•6 years ago
|
||
Two people on Reddit reported that discarding is too aggresive:
Comment 212•6 years ago
|
||
discarding is too aggresive
Agree (just tried it). It definitely needs time and memory thresholds options, as for me.
Comment 213•6 years ago
|
||
Also need an option "don't unload pinned tabs"
Comment 214•6 years ago
|
||
It should be possible to set Firefox to trigger tab discarding when only free physical memory is running low. User should have a choice to choose between 3 options for browser.tabs.unloadOnLowMemory
:
(1) no tab discarding,
(2) tab discarding when the total amount of both free physical memory and swap space is running low (provided in Bug 675539),
(3) tab discarding when free physical memory is running low (default setting) (Bug 1553260).
Tab discarding when free physical memory is running low should be set as default.
Alternatively, values (2) or (3) should be chosen automatically by Firefox based on total RAM present in PC/device: (2) if less than 8 GB is available in PC, and (3) if 8 GB or more is available. This value could be slightly different for different operating systems; user could have option to change this value too.
Discussion:
https://www.reddit.com/r/firefox/comments/brafza/latest_firefox_release_is_faster_than_ever_the/eoc44sk
https://www.reddit.com/r/firefox/comments/bncank/firefox_beta_keeps_reloading_tabs_on_a_pc_with_16/enis26r/?context=5
Assignee | ||
Comment 215•6 years ago
|
||
Thanks for the suggestions but this bug is not the right place to discuss this. Please file another bug to discuss how to evolve this feature and CC me; let's move the discussion over there so we have a clean slate.
Comment 216•6 years ago
|
||
(In reply to Gabriele Svelto [:gsvelto] from comment #215)
Thanks for the suggestions but this bug is not the right place to discuss this. Please file another bug to discuss how to evolve this feature and CC me; let's move the discussion over there so we have a clean slate.
I have filed for new bug (Bug 1553260) at the time I made Bug 675539 comment 214.
Comment 217•6 years ago
|
||
(In reply to Tradewatcher from comment #185)
This option should not affect tabs with filled forms. This could result in bad UX. (Write a long text - going for a break - all discarded/deleted)
see my comment 91 - form data is already saved (so we can restore it on a crash). note that there is state that will be lost on some pages (think for example a 3D editor without automatic save-to-cloud (or save-to-localstorage)). The Page Lifecycle API is designed to address some of these aspects, and also give the browser more leeway to freeze and/or unload tabs to manage memory and other resources.
Comment 219•6 years ago
|
||
Chromium goes through the process of discarding using the Page Lifecycle Spec. https://wicg.github.io/page-lifecycle/spec.html Is this something that Gecko can implement in the future? It may help with the aggressiveness of the discarding because it allows you to remove a certain set of resource usage (gpu textures, decoded images, render trees, etc) while keeping the DOM in a frozen state. When memory pressure then gets too tight it goes into the discard process.
Comment 220•6 years ago
|
||
(In reply to dtapuska from comment #219)
Chromium goes through the process of discarding using the Page Lifecycle Spec. https://wicg.github.io/page-lifecycle/spec.html Is this something that Gecko can implement in the future? It may help with the aggressiveness of the discarding because it allows you to remove a certain set of resource usage (gpu textures, decoded images, render trees, etc) while keeping the DOM in a frozen state. When memory pressure then gets too tight it goes into the discard process.
Issues:
https://bugzilla.mozilla.org/show_bug.cgi?id=1480376
https://github.com/mozilla/standards-positions/issues/87
Are also relevant.
Comment 221•5 years ago
|
||
(In reply to Joe Wilson from comment #0)
Since bug 586068 landed - there is a new state for every tab: it can be
stalled (unloaded).My suggestion is to automatically stall/unload tabs that were inactive for x
hours in order to free some RAM.
The way I see it - there should be a pref in about:config which will define
the time that needs to pass, before the tab (if it wasn't activated during
that time) becomes stalled.
The same thing does BarTab addon.
Did this "pref" ever get done? I think it should be in the options, as opposed to about:config.
Assignee | ||
Comment 222•5 years ago
|
||
(In reply to Worcester12345 from comment #221)
Did this "pref" ever get done? I think it should be in the options, as opposed to about:config.
No, it's also unrelated to this because this one was about unloading tabs to prevent out-of-memory crashes, not to free unused resources. I don't know if we'll add unloading unused tabs even when memory is abundant, but if we do the user should have control over it. In the meantime there's a few extensions that do this and which have tunable parameters (e.g. unload after x minutes).
Comment 223•5 years ago
|
||
(In reply to Gabriele Svelto [:gsvelto] from comment #222)
(In reply to Worcester12345 from comment #221)
Did this "pref" ever get done? I think it should be in the options, as opposed to about:config.
No, it's also unrelated to this because this one was about unloading tabs to prevent out-of-memory crashes, not to free unused resources. I don't know if we'll add unloading unused tabs even when memory is abundant, but if we do the user should have control over it. In the meantime there's a few extensions that do this and which have tunable parameters (e.g. unload after x minutes).
Will these extensions work with versions newer than 71.0b9 (64-bit)? What extensions? I might like to try one out.
Assignee | ||
Comment 224•5 years ago
|
||
(In reply to Worcester12345 from comment #223)
Will these extensions work with versions newer than 71.0b9 (64-bit)? What extensions? I might like to try one out.
Give this one a try: https://addons.mozilla.org/en-US/firefox/addon/auto-tab-discard/
There's quiet a few more including ones that integrate with tree-style tabs.
Description
•