Metaspace 里存什么、为什么会被撑爆、什么时候被回收?这篇用 BufferPool/MemoryPool 的数字和 hidden class 做的小实验量出来(类卸载的细节、元空间碎片在后面的篇目)。
起始:Metaspace 已用 710 KB,已加载类 826,堆已用 3104 KB 再定义 5000 个相同内容的类(都保留引用):Metaspace 已用 10673 KB(涨了约 9965 KB),已加载类 5855,堆已用 10272 KB(堆也涨了约 7 MB,具体构成没有细查) Metaspace 已提交 16192 KB,Compressed Class Space 已用 2786 KB
保留引用地不断定义类,成功定义 7962 个之后 → OutOfMemoryError: Metaspace
起始 Metaspace 已用 714 KB,已卸载类 0 定义 5000 个类但不保留引用:Metaspace 已用 10704 KB(9989 KB 增长),已卸载类 0 System.gc() 之后:Metaspace 已用 911 KB,已卸载类 5000,已加载类 861
MetaspaceSize = 22020096(即 21 MB) MaxMetaspaceSize = 18446744073709551615(即无上限) CompressedClassSpaceSize = 1073741824(即 1024 MB)