JDK为什么废弃永久代,而引入元空间( 二 )


所以,大家知道为什么要替换了吧 。
既然都已经要替换,那么一定是废除永久代是对 JVM 来说 , 肯定是好处多多的 。
废除永久代的好处

  • 由于类的元数据分配在本地内存中 , 元空间的最大可分配空间就是系统可用内存空间 。不会遇到永久代存在时的内存溢出错误 。
  • 将运行时常量池从PermGen分离出来,与类的元数据分开 , 提升类元数据的独立性 。
  • 将元数据从PermGen剥离出来到Metaspace,可以提升对元数据的管理同时提升GC效率 。
既然我们在这里说到这个Metaspace,那么肯定得说说这个 Metaspace 的相关参数都是代表的什么配置 。
Metaspace
  • -XX:MetaspaceSize,初始空间大?。?锏礁弥稻突岽シ⒗??占??欣嘈托对?nbsp;, 同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时 , 适当提高该值 。
  • -XX:MaxMetaspaceSize,最大空间,默认是没有限制的 。如果没有使用该参数来设置类的元数据的大小,其最大可利用空间是整个系统内存的可用空间 。JVM也可以增加本地内存空间来满足类元数据信息的存储 。但是如果没有设置最大值,则可能存在bug导致Metaspace的空间在不停的扩展,会导致机器的内存不足;进而可能出现swap内存被耗?。蛔钪盏贾陆?讨苯颖幌低持苯觡ill掉 。如果设置了该参数,当Metaspace剩余空间不足,会抛出:java.lang.OutOfMemoryError: Metaspace space
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
  • -XX:MaxMetaspaceFreeRatio,在GC之后 , 最大的Metaspace剩余空间容量的百分比 , 减少为释放空间所导致的垃圾收集




推荐阅读