Simply put, Metaspace is a new memory space – starting from the Java 8 version; it has replaced the older PermGen memory space. The most significant difference is how it handles memory allocation. Specifically, this native memory region grows automatically by default.
In Java 8, PermGen method area replaced with MetaSpace. They have moved permGem to the separate memory in the native OS and that is called MetaSpace. It can by default auto increases its size. In MetaSpace, classes can load and unload during the lifespan of the JVM.
Noun. metaspace (countable and uncountable, plural metaspaces) (philosophy) A space transcending ordinary physical space, such as cyberspace. (computing theory) The conceptual space occupied by metaobjects.
The default size of PermGen memory is 64 MB on 32-bit JVM and 82 MB on the 64-bit version.
The main difference from a user perspective - which I think the previous answer does not stress enough - is that Metaspace by default auto increases its size (up to what the underlying OS provides), while PermGen always has a fixed maximum size. You can set a fixed maximum for Metaspace with JVM parameters, but you cannot make PermGen auto-increase.
To a large degree it is just a change of name. Back when PermGen was introduced, there was no Java EE or dynamic class(un)loading, so once a class was loaded it was stuck in memory until the JVM shut down - thus Permanent Generation. Nowadays classes may be loaded and unloaded during the lifespan of the JVM, so Metaspace makes more sense for the area where the metadata is kept.
Both of them contain the java.lang.Class
instances and both of them suffer from ClassLoader leaks. Only difference is that with Metaspace default settings, it takes longer until you notice the symptoms (since it auto increases as much as it can), i.e. you just push the problem further away without solving it. OTOH I imagine the effect of running out of OS memory can be more severe than just running out of JVM PermGen, so I'm not sure it is much of an improvement.
Whether you're using a JVM with PermGen or with Metaspace, if you are doing dynamic class unloading, you should to take measures against classloader leaks, for example by using my ClassLoader Leak Prevention library.
Bye, Bye PermGen, Hello Metaspace
PermGen has been completely removed.
Metaspace garbage collection - Garbage collection of the dead classes and classloaders is triggered once the class metadata usage reaches the MaxMetaspaceSize
.
The space Metadata
was held is no longer contiguous to the Java heap
, The metadata
has now moved to native memory to an area known as the Metaspace
.
In Simple words,
Since the class metadata is allocated out of native memory, the max available space is the total available system memory. Thus, you will no longer encounter OOM errors
and could end up spilling into the swap space.
The removal of PermGen
doesn’t mean that your class loader leak issues are gone. So, yes, you will still have to monitor your consumption and plan accordingly, since a leak would end up consuming your entire native memory.
Some other articles, with analysis: Link1, Link2 , and this
In short, Metaspace size auto increases in native memory as required to load class metadata if not restricted with -XX:MaxMetaspaceSize
PermGen
Metaspace
Here to make it simple.
what is PermGen :
PermGen is a special heap space separated from the main memory heap. Class metadata is loaded here.
java 7 : PermGen is the space where JVM keeps track of metadata of the classes which have been loaded.
java 8 : PermGen is replaced by Metaspace with the capability to auto increase the native memory as per the requirement to load the class metadata.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With