Computer History Notes - Herong's Tutorial Notes - v3.13, by Herong Yang
Java Supports Automatic Garbage Collection
This section provides a quick demonstration of JVM (Java Virtual Machine) garbage collector removing dead objects - objects that have no more references.
Java supports automatic garbage collection.
What Is Garbage Collection? Garbage collection is a program execution activity that finds objects with no references and removes them from memory.
JVM (Java Virtual Machine) has a built-in execution thread that automatically performs garbage collection.
Here is a sample Java program showing you how JVM garbage collector works:
/* GarbageCollectionDemo.java * Suggested JVM options: -Xms2m -Xmx4m * Copyright (c) 2003-2022 HerongYang.com. All Rights Reserved. */ import java.util.*; class GarbageCollectionDemo { static MyList objList = null; static int wait = 500; // milliseconds static int initSteps = 4; static int testSteps = 1; static int objSize = 512; // 1/2 MB public static void main(String[] arg) { if (arg.length>0) initSteps = Integer.parseInt(arg[0]); if (arg.length>1) testSteps = Integer.parseInt(arg[1]); objList = new MyList(); Monitor m = new Monitor(); m.setDaemon(true); m.start(); myTest(); } public static void myTest() { for (int m=0; m<initSteps; m++) { mySleep(wait); objList.add(new MyObject()); } for (int n=0; n<10*8*8/testSteps; n++) { for (int m=0; m<testSteps; m++) { mySleep(wait); objList.add(new MyObject()); } for (int m=0; m<testSteps; m++) { mySleep(wait); objList.removeTail(); // objList.removeHead(); } } } static void mySleep(int t) { try { Thread.sleep(t); } catch (InterruptedException e) { System.out.println("Interrupted..."); } } static class MyObject { private static long count = 0; private long[] obj = null; public MyObject next = null; public MyObject prev = null; public MyObject() { count++; obj = new long[objSize*128]; // objSize KB } protected final void finalize() { count--; } static long getCount() { return count; } } static class MyList { static long count = 0; MyObject head = null; MyObject tail = null; static long getCount() { return count; } void add(MyObject o) { // add the new object to the head; if (head==null) { head = o; tail = o; } else { o.prev = head; head.next = o; head = o; } count++; } void removeTail() { if (tail!=null) { if (tail.next==null) { tail = null; head = null; } else { tail = tail.next; tail.prev = null; } count--; } } void removeHead() { if (head!=null) { if (head.prev==null) { tail = null; head = null; } else { head = head.prev; head.next = null; } count--; } } } static class Monitor extends Thread { public void run() { Runtime rt = Runtime.getRuntime(); System.out.println( "Time Total Free Free Total Act. Dead Over"); System.out.println( "sec. Mem. Mem. Per. Obj. Obj. Obj. Head"); long dt0 = System.currentTimeMillis()/1000; while (true) { long tm = rt.totalMemory()/1024; long fm = rt.freeMemory()/1024; long ratio = (100*fm)/tm; long dt = System.currentTimeMillis()/1000 - dt0; long to = MyObject.getCount()*objSize; long ao = MyList.getCount()*objSize; System.out.println(dt + " " + tm + " " + fm + " " + ratio +"%" + " " + to + " " + ao + " " + (to-ao) + " " + (tm-fm-to)); mySleep(wait); } } } }
If you run this Java sample program, you will get output similar to this:
java -Xms2m -Xmx4m GarbageCollectionDemo Time Total Free Free Total Act. Dead Over sec. Mem. Mem. Per. Obj. Obj. Obj. Head 0 1984 1772 89% 0 0 0 212 1 1984 1260 63% 512 512 0 212 1 1984 852 42% 1024 512 512 108 2 1984 842 42% 1536 1024 512 -394 2 2848 1197 42% 1536 1536 0 115 3 4556 1887 41% 2560 2048 512 109 3 4556 1885 41% 2560 2560 0 111 4 4556 1375 30% 3072 2048 1024 109 4 4556 1373 30% 3072 2048 1024 111 5 4556 1373 30% 3584 2048 1536 -401 5 4556 861 18% 3584 2048 1536 111 6 4556 861 18% 3584 2048 1536 111 6 6080 1875 30% 2560 2048 512 1645 7 6080 1873 30% 2560 2048 512 1647 7 6080 1361 22% 3072 2048 1024 1647 8 6080 851 13% 3584 2048 1536 1645 8 6080 849 13% 3584 2048 1536 1647 9 6080 849 13% 3584 2048 1536 1647 9 6080 1876 30% 2560 2048 512 1644 10 6080 1876 30% 2560 2048 512 1644 10 6080 1366 22% 3072 2048 1024 1642 11 6080 854 14% 3584 2048 1536 1642 11 6080 852 14% 3584 2560 1024 1644 12 6080 852 14% 3584 2048 1536 1644 12 6080 1878 30% 2560 2560 0 1642 16 6080 1366 22% 3072 2560 512 1642 16 6080 1364 22% 3072 2048 1024 1644 17 6080 854 14% 3584 2560 1024 1642 17 6080 852 14% 3584 2048 1536 1644 18 6080 1878 30% 2560 2560 0 1642 18 6080 1876 30% 2560 2048 512 1644 19 6080 1366 22% 3072 2560 512 1642
The output shows that the JVM garbage collector worked several times to remove dead objects.
Table of Contents
2002 - .NET Framework Developed by Microsoft
1995 - PHP: Hypertext Preprocessor Created by Rasmus Lerdorf
►1995 - Java Language Developed by Sun Microsystems
Java Compilation and Execution Processes
Java Is an Object-Oriented Language
►Java Supports Automatic Garbage Collection
Java Supports Multi-Threading Programming
1991 - WWW (World Wide Web) Developed by Tim Berners-Lee
1991 - Gopher Protocol Created by a University of Minnesota Team
1984 - X Window System Developed a MIT Team
1984 - Macintosh Developed by Apple Inc.
1983 - "Sendmail" Mail Transfer Agent Developed by Eric Allman
1979 - The Tcsh (TENEX C Shell) Developed by Ken Greer
1978 - Bash (Bourne-Again Shell) Developed by Brian Fox
1978 - The C Shell Developed by Bill Joy
1977 - The Bourne Shell Developed by Stephen Bourne
1977 - Apple II Designed by Steve Jobs and Steve Wozniak
1976 - vi Text Editor Developed by Bill Joy
1974 - Internet by Vinton Cerf
1972 - C Language Developed by Dennis Ritchie
1971 - FTP Protocol Created by Abhay Bhushan
1970 - UNIX Operating System Developed by AT&T Bell Labs