The OutOfMemoryError (OOM) is thrown when the JVM cannot allocate an object because it has run out of heap memory and the garbage collector cannot free enough space. This is a serious error that usually indicates a memory leak or insufficient heap configuration.
# Increase heap size (temporary fix)
java -Xmx512m -Xms256m MyApplication
# For large applications
java -Xmx2g MyApplication
# Enable GC logging to diagnose
java -Xmx512m -verbose:gc -XX:+PrintGCDetails MyApplication
// Wrong Loading millions of records into memory
List<Record> allRecords = database.findAll(); // OOM for large tables!
allRecords.forEach(r -> process(r));
// Correct Process in batches
int pageSize = 1000;
int page = 0;
List<Record> batch;
do {
batch = database.findAll(PageRequest.of(page++, pageSize));
batch.forEach(r -> process(r));
batch.clear(); // Help GC
} while (batch.size() == pageSize);
// Correct Or use streaming (Spring Data)
database.streamAll().forEach(r -> process(r));
class Cache {
// Wrong Static map grows forever "-- never cleared!
static Map<String, Object> cache = new HashMap<>();
static void add(String key, Object value) {
cache.put(key, value); // Memory leak!
}
}
// Correct Use WeakHashMap "-- entries removed when key is GC'd
static Map<String, Object> cache = new WeakHashMap<>();
// Correct Or use a bounded cache with eviction
static Map<String, Object> cache = Collections.synchronizedMap(
new LinkedHashMap<>(100, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > 100; // Max 100 entries
}
}
);
// Correct Or use Caffeine/Guava cache with TTL
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// Wrong Reading entire 10GB file into memory
byte[] content = Files.readAllBytes(Paths.get("huge-file.csv")); // OOM!
// Correct Stream lines one at a time
try (Stream<String> lines = Files.lines(Paths.get("huge-file.csv"))) {
lines.forEach(line -> processLine(line));
}
// Correct Or use BufferedReader
try (BufferedReader reader = new BufferedReader(new FileReader("huge-file.csv"))) {
String line;
while ((line = reader.readLine()) != null) {
processLine(line);
}
}
OutOfMemoryError is a family of failures, not a single heap diagnosis. The message may point to Java heap space, GC overhead, metaspace, direct buffer memory, native thread creation, or another allocation boundary. Record the exact message, JVM options, process limits, container limits, GC logs, and workload phase before changing heap size.
For heap growth, capture a heap dump near failure and compare retained sizes, dominator paths, class counts, and allocation trends. A large object is not automatically a leak; the useful question is why it remains reachable. For native or direct memory, heap dumps may look normal, so inspect native memory tracking, thread count, buffer ownership, and operating-system evidence.
A larger heap can provide necessary capacity, but it can also postpone a leak and lengthen recovery. Bound caches by size and lifetime, stream large inputs, page database results, release direct buffers through their owning API, and remove listeners or ThreadLocal values when their scope ends. Avoid collecting an unbounded result before writing the first byte of output.
Reproduce the failure with a representative load and keep the diagnostic artifacts from the failing run. After a correction, compare live-set size after full collection, allocation rate, pause behavior, throughput, and container headroom. The test should run long enough to distinguish a stable plateau from slow retention growth.
Try this next
0 of 2 completed
"Java heap space" means the heap is full. "GC overhead limit exceeded" means GC is running constantly (>98% of time) but recovering less than 2% of heap "" effectively the heap is full but GC keeps trying.
Use JVM flags: -Xms for initial heap, -Xmx for maximum heap. Example: java -Xms256m -Xmx2g MyApp. For servers, set both to the same value to avoid heap resizing overhead.
Use profiling tools like VisualVM (free), JProfiler, or YourKit. Take heap dumps with jmap and analyze with Eclipse MAT. Look for objects that keep growing in count over time.
Explore 500+ free tutorials across 20+ languages and frameworks.