PermGen elimination in JDK 8
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
In JDK 8, one of the significant changes in memory management within the Java Virtual Machine (JVM) was the elimination of the PermGen space, which had been a persistent source of problems for developers. Its removal was aimed at improving the Java Virtual Machine's performance and alleviating development burdens stemming from memory management issues. This article delves into the details of PermGen elimination, explaining the technical aspects while highlighting its implications for Java developers.
Understanding PermGen
Before diving into the impact of its elimination, it's essential to understand what PermGen was. Permanent Generation, or PermGen for short, was a special heap space in the JVM used to store metadata required by the JVM to describe the classes and methods used in the application. This included:
- Class metadata: Information on classes and methods.
- Internalized strings: Unique string instances used by the JVM.
- Method object: JVM representation of Java methods and constructors.
Shortcomings of PermGen
PermGen space came with several drawbacks:
- Fixed Size: The size of the PermGen space had to be configured at startup with command-line options like
-XX:PermSizeand-XX:MaxPermSize. This fixed size could lead toOutOfMemoryErrorif more classes got loaded than the pre-configured PermGen could accommodate. - Fragmentation: The space could become fragmented, making it hard to reclaim space, thus requiring careful sizing.
- Complexity: Managing PermGen space was often an additional burden for developers, complicating JVM tuning.
Introduction to Metaspace
Starting with JDK 8, PermGen was replaced by Metaspace. Unlike PermGen, Metaspace uses native memory (outside of the Java heap), which leads to several improvements.
Key Characteristics of Metaspace
- Automatic Sizing: Metaspace grows and shrinks automatically based on the application need, greatly reducing the risk of
OutOfMemoryErrorbecause of too many class loads, making configuration easier and more robust. - Native Memory Usage: Being allocated in native memory, Metaspace leverages the underlying system's memory management capabilities, overcoming limited PermGen space.
- Optional Limits: Though Metaspace can grow automatically, you can still set limits with flags like
-XX:MetaspaceSizeand-XX:MaxMetaspaceSizeto avoid using excessive native memory.
Detailed Technical Changes
Memory Layout Changes
The JVM memory space layout with PermGen was as follows:
With JDK 8's Metaspace:
Garbage Collection
Garbage collection behavior also changes. Previously, PermGen was subject to garbage collection, leading to unwanted complexity and performance issues. Metaspace benefits from using native memory, meaning less direct interference with the heap's garbage collection cycles.
Improved Class Loading
With Metaspace, class-loading operations are significantly more efficient. It provides dynamic class storage, which is beneficial for applications with many dynamic class loadings, such as those running heavy research or enterprise applications with numerous libraries.
Configuration and Monitoring
Even without a fixed size, some tuning might be necessary for applications with specific demands.
Key JVM Arguments
-XX:MetaspaceSize: This is the initial (and minimum) size of Metaspace.-XX:MaxMetaspaceSize: This sets an upper limit on the size of Metaspace to prevent excessive memory use.
Monitoring Tools
Multiple tools can be used to monitor and manage Metaspace:
- JVisualVM: Provides an interface to monitor memory including Metaspace usage.
- JConsole: Another tool for real-time monitoring, useful for flagging and managing potential issues with native storage.
Summary of Improvements
The following table summarizes the improvements brought by eliminating PermGen:
| Feature | PermGen | Metaspace |
| Memory Type | Java heap | Native memory |
| Sizing | Fixed, manual sizing required | Dynamic sizing, with optional limits |
| Error Handling | OutOfMemoryError on exceeding size | Limiting mainly by native memory size |
| Fragmentation | Prone to fragmentation | Less prone to fragmentation |
| Tuning Complexity | High, due to manual configuration | Lower, automatic but tunable |
Conclusion
The elimination of PermGen space in favor of Metaspace in JDK 8 is a pivotal shift, designed to enhance Java's robustness, ease the burden on developers, and improve application reliability. It reflects a more adaptive memory management strategy in line with contemporary system capabilities, simplifying tuning and reducing vulnerabilities related to memory constraints.
With these transformations, Java's ability to handle complex and resource-intensive applications has been greatly strengthened, providing developers with a more consistent and manageable environment. This evolution underscores Java's ongoing commitment to performance, ease-of-use, and developer friendliness.

