All posts by Torleif

How to increase heap size for node

Experienced getting fatal build errors on our build server during ESLint linting of our React project:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed – JavaScript heap out of memory

<--- Last few GCs --->

[10012:0000000001DA2080] 184320 ms: Mark-sweep 2035.1 (2051.8) -> 2034.3 (2051.8) MB, 2297.9 / 0.0 ms (average mu = 0.114, current mu = 0.001) allocation failure scavenge might not succeed
[10012:0000000001DA2080] 185393 ms: Mark-sweep 2035.3 (2051.8) -> 2033.6 (2051.8) MB, 1068.8 / 0.0 ms (average mu = 0.077, current mu = 0.003) allocation failure scavenge might not succeed

The MB values looked very suspicious in that they were on either side of 2048 MB (2 GB), so suspected our project had run into some sort of limit. And seems there is indeed a max limit of ~2 GB by default on the heap size.

To increase the node heap size limit, set the --max-old-space-size to something more than 2048, e.g. like this on Windows:

setx NODE_OPTIONS "--max-old-space-size=4096" /m

To verify that it actually works (or check what it is by default), this command seems to do it:

node -e "console.log(require('v8').getHeapStatistics().total_available_size / 1024 / 1024)"

Note that the output for some reason always seem to be a bit more than what’s set as the limit. Not sure what that’s about, but anyways… 🤷‍♂️

Natural sort in Javascript

Sorting strings naturally/numerically in Javascript is very simple. You just need to remember the existence of the Intl.Collator… which I keep forgetting…

You simply create one and use its compare function:

const collator = new Intl.Collator(undefined, {
    usage: 'sort',
    numeric: true
})

const simple = ['a1', 'a12', 'a2']
simple.sort(collator.compare)
// => ['a1', 'a2', 'a12']

const objects = [{"id": "a1"}, {"id": "a12"}, {"id": "a2"}]
const by = (key) => (a, b) => collator.compare(a[key], b[key])
objects.sort(by('id'))
// => [{id: 'a1'}, {id: 'a2'}, {id: 'a12'}]

Git: Undo last commit

Sometimes I forget to create a new feature branch, and accidentally commit to master. Keep having to look up how to fix it…

# From master, create new branch, which will include the accidental commits
git branch feature/foobar

# Move master HEAD back, which will remove the commits from there
git reset --hard HEAD~1

# Checkout feature branch, where the commits should still exist
git checkout feature/foobar