Memory management is the art and the process of coordinating and controlling the use of memory in a computer system.
Memory management can be divided into three areas:
Memory management hardware (MMUs, RAM, etc.);
Operating system memory management (virtual memory, protection);
Application memory management (allocation, deallocation, garbage collection).
Unity Supports automatic memory management,where you don’t have to bother about your used assets/objects,Unity’s mono engine will release the memory and will use the same for other purposes.In the past,the user has to manually allocate the memory and release it at an appropriate time,which was an overhead.
Even now you can manually remove GameObjects or components of GameObjects at runtime using Destroy Function.
public class DestroyBasic : MonoBehaviour
void Update ()
public class DestroyComponent : MonoBehaviour
void Update ()
Destroy is fine…How about DestroyImmediate? Which one to use?
Destroys the object
obj immediately. You are strongly recommended to use Destroy instead.
This function should only be used when writing editor code since the delayed destruction will never be invoked in edit mode. In game code you should use Object.Destroy instead. Destroy is always delayed (but executed within the same frame). Use this function with care since it can destroy assets permanently! Also note that you should never iterate through arrays and destroy the elements you are iterating over. This will cause serious problems (as a general programming practice, not just in Unity).
Value and Reference Types
- Value types are types which hold both data and memory on the same location.
- Memory allocated on stack.
- These include integers, floats, booleans and Unity’s struct types (eg, Color andVector3).
- A reference type has a pointer which points to the memory location.
- Memory allocated on heap.
- Examples of reference types include objects, strings and arrays.
When a function is called, the values of its parameters are copied to an area of memory reserved for that specific call. Data types that occupy only a few bytes can be copied very quickly and easily. However, it is common for objects, strings and arrays to be much larger and it would be very inefficient if these types of data were copied on a regular basis. Fortunately, this is not necessary; the actual storage space for a large item is allocated from the heap and a small “pointer” value is used to remember its location. From then on, only the pointer need be copied during parameter passing. As long as the runtime system can locate the item identified by the pointer, a single copy of the data can be used as often as necessary.
To determine which heap blocks are no longer in use, the memory manager searches through all currently active reference variables and marks the blocks they refer to as “live”. At the end of the search, any space between the live blocks is considered empty by the memory manager and can be used for subsequent allocations. For obvious reasons, the process of locating and freeing up unused memory is known as garbage collection (or GC for short).
Further reading on Automatic Memory Management : http://bit.ly/1gRja5l
I thought of writing about Memory management in unity through C#,but nothing can beat Wendelin Reich’s articles in Gamasutra about C# memory Management for unity.
There are three posts on C# memory management,
- This first post discusses the fundamentals of memory management in the garbage-collected world of .NET and Mono. Author also discussed some common sources of memory leaks.
- The second looks at tools for discovering memory leaks. The Unity Profiler is a formidable tool for this purpose, but it’s also expensive. Author therefore discussed .NET disassemblers and the Common Intermediate Language (CIL) to show you how you can discover memory leaks with free tools only.
- The third post discusses C# object pooling. Again, the focus is on the specific needs that arise in Unity/C# development.
Courtesy :Unity3d and Gamasutra