Abstracting Runtime Heaps for Program Understanding