Automatic Memory Management
Java uses an automatic garbage collector to manage memory in the object lifecycle.
The programmer determines when objects are created, and the Java
runtime is responsible for recovering the memory once objects are no
longer in use. Once no references to an object remain, the unreachable memory becomes eligible to be freed automatically by the garbage collector. Something similar to a memory leak may
still occur if a programmer’s code holds a reference to an object that
is no longer needed, typically when objects that are no longer needed
are stored in containers that are still in use. If methods for a
nonexistent object are called, a “null pointer exception” is thrown.[30][31]
One
of the ideas behind Java’s automatic memory management model is that
programmers can be spared the burden of having to perform manual memory
management. In some languages, memory for the creation of objects is
implicitly allocated on the stack, or explicitly allocated and deallocated from the heap.
In the latter case the responsibility of managing memory resides with
the programmer. If the program does not deallocate an object, a memory leak occurs.
If the program attempts to access or deallocate memory that has already
been deallocated, the result is undefined and difficult to predict, and
the program is likely to become unstable and/or crash. This can be
partially remedied by the use of smart pointers,
but these add overhead and complexity. Note that garbage collection
does not prevent “logical” memory leaks, i.e. those where the memory is
still referenced but never used.
Garbage
collection may happen at any time. Ideally, it will occur when a
program is idle. It is guaranteed to be triggered if there is
insufficient free memory on the heap to allocate a new object; this can
cause a program to stall momentarily. Explicit memory management is not
possible in Java.
Java does not support C/C++ style pointer arithmetic,
where object addresses and unsigned integers (usually long integers)
can be used interchangeably. This allows the garbage collector to
relocate referenced objects and ensures type safety and security.
As in C++ and some other object-oriented languages, variables of Java’s primitive data types are not objects. Values of primitive types are either stored directly in fields (for objects) or on thestack (for methods) rather than on the heap, as commonly true for objects (but see Escape analysis).
This was a conscious decision by Java’s designers for performance
reasons. Because of this, Java was not considered to be a pure
object-oriented programming language. However, as of Java 5.0, autoboxing enables programmers to proceed as if primitive types were instances of their wrapper class.
Java contains multiple types of garbage collectors. By default, HotSpot uses the Concurrent Mark Sweep collector,
also known as the CMS Garbage Collector. However, there are also
several other garbage collectors that can be used to manage the Heap.
For 90% of applications in Java, the CMS Garbage Collector is good
enough.
Walang komento:
Mag-post ng isang Komento