The current use of the protobuf API uses an expensive code path. The builder uses the parser to instantiate a message, then copies the message into the builder. The parser is creating multi-layered internally buffering streams that cause excessive byte allocations.
Using the parser directly with a coded input stream backed by the byte from the wire will take a fast-path straight to the pb message's ctor. Substantially less garbage is generated.