Skip to main content

When does Garbage Collection run in Java?

First, we cannot force garbage collection to run (System.gc()). Sometimes it will but it’s unpredictable.

What are the steps to Garbage Collection in Java?

  • Mark: GC walks through the object graph and marks the objects that are reachable as live
  • Sweep: deletes unreachable objects
  • Compact: compacts the memory by moving around the objects

GC collectors are called generational collectors since the heap is divided into 2 spaces: Young and old generation spaces. Young generation is for new objects and is divided into Eden, “Survivor 0” and “Survivor 1” spaces.

Old generation holds objects that survive for a long time.

Minor garbage collection runs in the Young Generation space. Major garbage collection runs across the entire heap.

Steps to GC:

  • As your application runs, new objects get allocated to the Eden space.
  • Some objects become unreachable.
  • When the Eden space becomes full, and your application tries to create another object, and the JVM tries to allocate space on the Eden, the allocation fails and that causes Minor GC to run.
  • All live objects are marked as reachable and those are Moved into Survivor space 0.
  • The unreachable objects are swept and cleaned up.
  • Each survived object is labeled with a counter to indicate how many times it’s survived the Garbage Collector.
  • Application allocates new objects into Eden and some objects in the Survivor 0 space become unreachable. After Eden is full again, JVM tries to allocate space to Eden. It fails and triggers the Minor GC to run again.  
  • The new reachable objects are moved from Eden to Survivor 1. 
  • Survivor 0 reachable objects are moved from Survivor 0 to Survivor 1. Why? To avoid the compacting step.
  • Unreachable objects from Eden and Survivor 0 are removed.
  • Survivor 1 now holds objects that survived 1 cycle of garbage collection and 2 cycles of garbage collection (the ones moved from Survivor 0).
  • And again, new objects are allocated to Eden. As Eden becomes full, Minor GC runs and moves the reachable objects from Eden and the reachable objects from Survivor 1 to Survivor 0. Unreachable objects from Eden and Survivor 1 are swept and cleaned up.
  • This continues until a threshold number (i.e. 16) is reached. Whatever object has survived 16 Minor GC sweeps will be moved from Young Generation to Old Generation.
  • A garbage collection thread keeps watching the Old Generation area and monitors when it becomes nearly full. When Old Generation is nearly full, the Major GC goes over both the Young and Old Generation (the entire heap) and does Mark, Sweep and Compacting which can be a performance hit. 

Comments

Popular posts from this blog

Beginner Java Exercise: Sentinel Values and Do-While Loops

In my previous post on while loops, we used a loop-continuation-condition to test the arguments. In this example, we'll loop at a sentinel-controlled loop. The sentinel value is a special input value that tests the condition within the while loop. To jump right to it, we'll test if an int variable is not equal to 0. The data != 0 within the while (data != 0) { ... } is the sentinel-controlled-condition. In the following example, we'll keep adding an integer to itself until the user enters 0. Once the user enters 0, the loop will break and the user will be displayed with the sum of all of the integers that he/she has entered. As you can see from the code above, the code is somewhat redundant. It asks the user to enter an integer twice: Once before the loop begins, and an x amount of times within the loop (until the user enters 0). A better approach would be through a do-while loop. In a do-while loop, you "do" something "while" the condition...

Programming Language Concepts Test Questions/Answers

One of the easiest methods that I use to learn new topics is by creating notes on the subject and then by turning those notes into questions and answers. Remembering answers to questions just seems more natural. I was able to memorize 323 questions and answers in a matter of a couple of days. I wanted to start doing this for some topics that I find pretty interesting. To begin, here are some questions and answers to Programming Language Concepts (PLC). I'm reading your mind right now and the answer is yes, there will be more. 1. Name 3 reasons for studying PLC. - Better understanding of current programming languages - Advancement of computing - Increased capability to express ideas - Increased capability to learn new programming language. - Better understanding of which programming language to choose.  2. Name the 5 programming domains and languages best suited for each. - Scientific (Fortran, ALGOL 60) - Business (COBOL) - AI (Lisp, Scheme, Prolog) - Web (PHP, ...

Creating your own ArrayList in Java

Wanted to show that certain data structures in Java can be created by you. In this example, we'll go ahead and create an ArrayList data structure that has some of the methods that the built in ArrayList class has. We'll create 2 constructors: The default constructor that creates an ArrayList with a default size of 10. Constructor that allows an initial size to be passed to the array. We'll also create a number of methods: void add(Object x);  A method that allows you to place an Object at the end of the ArrayList. void add(int index, Object x);  A method that allows you to place a value at a given location. Object get(int index):  Allows you to retrieve a value of the arrayList array from a given location. int size();  Allows you to get the number of elements currently in the Arraylist. boolean isEmpty();  Tests to see if the Arraylist is empty. boolean isIn(Object x);  A method that sees if a particular object exist in the arrayList. int ...