Analysis of software performance typically takes into account clock cycles and memory consumption at each sampling point in time. Although this is a valid strategy, we argue that it is also worth investigating data and control flow structures, as observed using memory traces and call stacks, because of their importance for performance engineering. In this work, we present a visual approach to memory profiling that supports analysis of memory layout, access patterns, and aliasing in correlation to program execution. Our method leverages language-agnostic dynamic code instrumentation to minimize the impact of tracing on performance, i.e., the application remains usable on commodity hardware. The profiled data is then clustered and visualized using a density-based scatter plot. If debug symbols are available, the scatter plot is augmented by a flame graph to ease linking to the high-level source code. Our visualization helps software engineers to identify runtime behavior by relating memory addresses to instruction execution. We demonstrate our approach using a set of examples revealing different memory access patterns and discuss their influence on software performance.