When memory is managed manually, a developer must explicitly allocate and free memory. This provides the developer more control over how memory is used by the program. With automatic memory management, memory allocation is handled behind the scenes. This process is abstracted through a garbage collection in some programming languages.
There is less overhead with manual memory management, and this can allow for better program performance. Programming languages that incorporate automatic memory management do not require complex code to manage memory and are not prone to issues like memory leaks and dangling pointers.
Memory management is like having a refrigerator full of food. In manual memory management, you are responsible for removing expired food to make space for new food. With garbage collection, food that is expired is automatically removed, making space for whenever you decide save your left over pizza.