ava 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.[44][45]
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 either stored directly in fields (for objects) or on the stack (for methods) rather than on the heap, as is commonly true for non-primitive data types (but see escape analysis). This was a conscious decision by Java's designers for performance reasons.
Java contains multiple types of garbage collectors. By default,[citation needed] HotSpot uses the parallel scavenge 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 Concurrent Mark-Sweep (CMS) garbage collector is sufficient.[46] Oracle aims to replace CMS with the Garbage-First collector (G1).[47]
No comments:
Post a Comment