`bs` is the block size, in order to read and write blocks of 1G at a time, dd needs to prepare 1G of data in ram, otherwise there's no way to pass that much to a single write() call (okay, for writing zeroes in particular there would be, but dd doesn't care what the input file is).
Apart from...