This document summarizes challenges in building memory-efficient Java applications and common patterns of memory usage. It discusses how object representation and collection choices can significantly impact memory usage, with overhead sometimes accounting for 50-90% of memory consumption. The document provides examples of how data type modeling decisions, such as high levels of delegation, large base classes, and unnecessary fields, can lead to high memory overhead. It emphasizes measuring and understanding memory usage at the data type and collection level in order to make informed design tradeoffs.