MEMORY MANAGEMENT COMPARATIVE OF C/C+
The process of dynamically allocate memory when
you need and free when you don’t need it
How it’s done?
Allocate memory from the heap with enough size
to store what you need.
Free it when you don’t need it.
It can be done either manually or automatic.
Different algorithms can be used (Ref
counting/mark and sweep, etc)
Manual memory management through pointers
To allocate memory you need to do a request with the size
of the memory block you want to allocate:
char* ptr = malloc(sizeof(char)*20); //Allocate enough size
for an array of chars size 19 + 1 byte reserved for the null
To free memory you call free
free(ptr); //Free memory of ptr
You need to be aware of the ownership of the pointer.
(who’s responsible for free the memory)
You allocate what you need and free as soon as you
don’t need it.
Usually much lower memory footprint.
Dynamic allocations are slow and non-deterministic.
Memory-leaks can happen.
Manual memory management/RAII/Smart pointers
Manual memory management is made through new and
RAII: The object is responsible for free the resources in its
deletion, you can see this approach in standard classes like
string and fstream.
Smart pointers: You’ve a class that encapsulates and
simulates a pointer, so you don’t need to handle the pointer
directly, the standard library of C++11 allows different types
of smart pointers like: unique_ptr, shared_ptr and weak_ptr.
A wide range of tools to help memory management.
You can use a high or low-level approach.
Small performance penalty.
Understand how the methods work can be complex.
Still memory-leaks prone.
JVM (Oracle hotspot)
Automatic Garbage Collection
Mark and sweep algorithm (mark what’s alive, the
remaining are marked as “free”)
No memory is returned to the OS
Different collections by age (young, old and permanent)
Memory is allocated in advance
You don’t need to worry about manual deallocations
Fine tuning of GC to optimize performance
"new" operator has only an increment pointer cost
Complex GC system
Stop-the-world event when running
Major GC is very slow
Hard to detect cause of memory leaks
Non deterministic behaviour
Automatic/Reference counting/Generational GC
Reference counting can’t handle reference
cycles, so here comes the garbage collector.
GC works based on a threshold of
You can disable GC for improve performance as
GC has a performance penalty.
Automatic memory management, you can focus in the algorithm.
You can call GC manually if you want.
Debug tools for GC (i.e: DEBUG_LEAK flags)
Doesn’t care about the memory usage (instead use threshold of
Doesn’t care about size of objects (instead it counts only the numbers).
Performance and space penalty.
Memory leaks are harder for identify the source.
There’re different approaches trying to find the best memory
Sometimes you need to chose between performance or
Non-deterministic GC is not suitable for RT applications.
There’re different tools to track memory leaks (i.e: Valgrind)
Automatic memory management doesn’t mean you don’t
need to think and understand it.