Understanding and optimizing persistent memory allocation