Our startup sequence is sub-optimal. We query JDK to index timezone database and JDK generates a tonne of garbage in the process. The whole feat requires roughly 500MB RAM. Once out of startup sequence all this is collected and we can operate in 128MB heap.
The data itself is memory mapped. Columns are kept as primitives so that they take as much memory as their unit size times rows.