When Memory Leaks happen in Java
Objects inaccessible by running code but still stored in memory
Class allocates a large chunk of memory (e.g. new byte[1000000]), stores a strong reference to it in a static field, and then stores a reference to itself in a ThreadLocal. Allocating the extra memory is optional (leaking the Class instance is enough), but it will make the leak work that much faster.
Static field holding object reference
class MemorableClass { static final ArrayList list = new ArrayList(100); }
Calling String.intern() on lengthy String
String str=readString(); // read lengthy string any source db,textbox/jsp etc.. // This will place the string in memory pool from which you can't remove str.intern();
Unclosed open streams ( file , network etc… )
try { BufferedReader br = new BufferedReader(new FileReader(inputFile)); ... ... } catch (Exception e) { e.printStacktrace(); }
Unclosed connections
try { Connection conn = ConnectionFactory.getConnection(); ... ... } catch (Exception e) { e.printStacktrace(); }
The thread clears all references to the custom class or the ClassLoader it was loaded from.