Important Points:
1) objects are created on heap in Java irrespective of there scope e.g. local or member variable. while its worth noting that class variables or static members are created in method area of Java memory space and both heap and method area is shared between different thread.
2) Garbage collection is a mechanism provided by Java Virtual Machine to reclaim heap space from objects which are eligible for Garbage collection.
3) Garbage collection relieves java programmer from memory management which is essential part of C++ programming and gives more time to focus on business logic.
4) Garbage Collection in Java is carried by a daemon thread called Garbage Collector.
5) Before removing an object from memory Garbage collection thread invokes finalize () method of that object and gives an opportunity to perform any sort of cleanup required.
6) As a Java programmer, We can't force Garbage collection in Java; it will only trigger if JVM thinks it needs a garbage collection based on Java heap size.
7) There are methods like System.gc () and Runtime.gc () which is used to send request of Garbage collection to JVM but it’s not guaranteed that garbage collection will happen.
8) If there is no memory space for creating new object in Heap Java Virtual Machine throws OutOfMemoryError or java.lang.OutOfMemoryError heap space.
9) J2SE 5(Java 2 Standard Edition) adds a new feature called Ergonomics goal of ergonomics is to provide good performance from the JVM with minimum of command line tuning.
When an Object becomes Eligible for Garbage Collection:
An Object becomes eligible for Garbage collection or GC if its not reachable from any live threads or any static refrences in other words we can say that an object becomes eligible for garbage collection if its all references are null. Cyclic dependencies are not counted as reference so if Object A has reference of object B and object B has reference of Object A and they don't have any other live reference then both Objects A and B will be eligible for Garbage collection.
Generally an object becomes eligible for garbage collection in Java on following cases:
1) All references of that object explicitly set to null e.g. object = null
2) Object is created inside a block and reference goes out scope once control exit that block.
3) Parent object set to null, if an object holds reference of another object and when you set container object's reference null, child or contained object automatically becomes eligible for garbage collection.
4) If an object has only live references via WeakHashMap it will be eligible for garbage collection. To learn more see, How HashMap works in Java?
Heap Generations for Garbage Collection in Java:
Java
objects are created in Heap and Heap is divided into three parts or generations
for sake of garbage collection in Java, these are called as Young generation,
Tenured or Old Generation and Perm Area of heap.
New
Generation is further divided into three parts known as Eden space, Survivor 1
and Survivor 2 space. When an object first created in heap its gets created in
new generation inside Eden space and after subsequent Minor Garbage collection
if object survives its gets moved to survivor 1 and then Survivor 2 before
Major Garbage collection moved that object to Old or tenured generation.
Permanent
generation of Heap or Perm Area of Heap is somewhat special and it is used to
store Meta data related to classes and method in JVM, it also hosts String pool
provided by JVM. There are many opinions around whether garbage collection in
Java happens in perm area of java heap or not, as per my knowledge this is
something which is JVM dependent and happens at least in Sun's implementation
of JVM. We can also try this by just creating millions of String Object and
watching for Garbage collection or OutOfMemoryError.
Types of Garbage Collector in Java:
Java
Runtime (J2SE 5) provides various types of Garbage collection in Java which can choose based upon application's performance requirement. Java 5
adds three additional garbage collectors except serial garbage collector. Each
is generational garbage collector which has been implemented to increase
throughput of the application or to reduce garbage collection pause times.
- Throughput Garbage Collector
- Concurrent low pause Collector
- The Incremental (Sometimes called train) low pause collector
Full GC and Concurrent Garbage Collection in Java:
Concurrent
garbage collector in java uses a single garbage collector thread that runs
concurrently with the application threads with the goal of completing the
collection of the tenured generation before it becomes full. In normal
operation, the concurrent garbage collector is able to do most of its work with
the application threads still running, so only brief pauses are seen by the
application threads. As a fall back, if the concurrent garbage collector is
unable to finish before the tenured generation fill up, the application is
paused and the collection is completed with all the application threads
stopped. Such Collections with the application stopped are referred as full
garbage collections or full GC and are a sign that some adjustments need to be
made to the concurrent collection parameters. Always try to avoid or minimize
full garbage collection or Full GC because it affects performance of Java
application.
********************************************************************************
Reach us At: - 0120-4029000 / 24 / 25 / 27 / 29 Mobile: 9953584548
Reach us At: - 0120-4029000 / 24 / 25 / 27 / 29 Mobile: 9953584548
Write us at: - Smruti@apextgi.com and pratap@apextgi.com
No comments:
Post a Comment