Unlock the Secrets: Safeguarding Your Java Code from Sneaky Memory Leaks!

Rajneesh Singh
2 min readDec 20, 2023

--

Memory leaks in Java occur when objects that are no longer needed are not properly deallocated from memory, causing the program to consume more and more memory over time. Some common causes of memory leaks in Java and how to prevent them are as follows:

Unclosed Resources

Cause: Failing to close resources like files, streams, or database connections.

Example:

public void readFile(String fileName) {
FileInputStream fis = new FileInputStream(fileName);
// Read file contents
// Oops, forgot to close 'fis'
}

Prevention:

public void readFile(String fileName) {
try (FileInputStream fis = new FileInputStream(fileName)) {
// Read file contents
} catch (IOException e) {
// Handle exceptions
}
}

Uncleared Collections

Cause: Holding references to objects in collections, preventing their garbage collection.

Example:

List<StringBuilder> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(new StringBuilder("Item " + i));
}
list = null; // The list still holds references to StringBuilder objects

Prevention:

List<StringBuilder> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(new StringBuilder("Item " + i));
}
list.clear(); // Clears the list and allows StringBuilder objects to be garbage collected

Static References

Cause: Static variables holding references to objects that are no longer needed.

Example:

public class MemoryLeakExample {
private static List<String> data = new ArrayList<>();

public void loadData() {
data.add("Some data");
}
}

Prevention:

public class MemoryLeakExample {
private static List<String> data = new ArrayList<>();

public void loadData() {
data.add("Some data");
}

public void clearData() {
data.clear(); // Clears the static data
}
}

Listener References

Cause: Not removing event listeners or callbacks when they are no longer needed.

Example:

class EventListener {
public void startListening() {
SomeEventEmitter.addListener(this);
}

public void stopListening() {
// Oops, forgot to remove the listener
}

public void onEventReceived(Event event) {
// Handle event
}
}

Prevention:

class EventListener {
public void startListening() {
SomeEventEmitter.addListener(this);
}

public void stopListening() {
SomeEventEmitter.removeListener(this); // Remove the listener
}

public void onEventReceived(Event event) {
// Handle event
}
}

Thread Management

Cause: Not properly managing threads and thread pools, leading to thread leakage.

Example: Not shutting down an ExecutorService.

ExecutorService executorService = Executors.newFixedThreadPool(10);
// Submit tasks
// Oops, forgot to shut down executorService

Prevention:

ExecutorService executorService = Executors.newFixedThreadPool(10);
// Submit tasks
executorService.shutdown(); // Properly shut down the executorService

To prevent memory leaks, it’s crucial to be mindful of resource management, clear unnecessary references, and properly clean up after objects and resources that are no longer needed. Additionally, using memory profiling tools can help identify and address memory leaks in Java applications.

References:

Java: The complete reference

Programming with Java

Head First Java: A Brain-Friendly Guide

--

--

Rajneesh Singh
Rajneesh Singh

Written by Rajneesh Singh

Problem Solver | Software Engineer

No responses yet