简图

关于分代策略

在我学Java的时候 还常常把 内存分为 新生代、老年代、永久代.... 例如下图

点击图片可以查看大图

但是 随着时间的迁移 永久代说法已经不再那么准确了 (有的JVM也不采用分代策略)

而是将永久代转移到了 Meta-space 中 这并不在JVM的内存空间中 而是处于DM中。

这也解释了有些时候 8G 的内存分配 但是占用了 8G 多内存的情况

关于为什么使用元空间? 可以参考一下这个回答

在之前的版本中,字符串常量池存在于永久代中,在大量使用字符串的情况下,非常容易出现OOM的异常。此外,JVM加载的class的总数,方法的大小等都很难确定,因此对永久代大小的指定难以确定。太小的永久代容易导致永久代内存溢出,太大的永久代则容易导致虚拟机内存紧张。