美文网首页
Metaspace与PermGen

Metaspace与PermGen

作者: zhh_happig | 来源:发表于2018-12-20 14:27 被阅读0次

转载、引用请标明出处
https://www.jianshu.com/p/da41cc4122ff
本文出自zhh_happig的简书博客,谢谢

以下内容,是本人学习的笔记和工作中的总结,仅供大家参考,有误的地方还请指正

1 PermGen方法区

  • 所有的被intern的String被存储在PermGen的串常量池中.
  • PermGen区使用-XX:MaxPermSize=N来设置最大大小
  • 但是由于应用程序string.intern通常是不可预测和不可控的,因此不好设置这个大小。
  • 设置不好的话,常常会引起 java.lang.OutOfMemoryError: PermGen space

2 java7、java8方法区的变化:Metaspace

  • java7、java8的字符串常量池被移到了java heap
    • 字符串常量池被限制在整个应用的堆内存中
    • 在运行时调用String.intern()增加字符串常量不会使永久代OOM了
  • java8的时候去除PermGen,将其中的方法区移到non-heap中的Metaspace
    • Metaspace与PermGen之间最大的区别在于:
      • Metaspace并不在虚拟机内存中,而是使用本地内存
    • 可以使用-XX:MaxMetaspaceSize来设置类的元数据区的大小
      • 类元数据的空间占用达到MaxMetaspaceSize设置的值,将会触发对象和类加载器的垃圾回收
      • 元数据区也会报错:java.lang.OutOfMemoryError: Metaspace space
    • 如果没有设置空间大小,
      • 其最大可利用空间是整个系统内存的可用空间
      • 如果没有设置空间大小,Metaspace的空间不足的时候会动态扩展
    • Metaspace相关参数
      • -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类的卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
      • -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。

3 去除PermGen的好处

  • 将字符串常量池从PermGen分离出来,与类的元数据分开,提升类的元数据的独立性
  • 将类的元数据从PermGen剥离出来到Metaspace,可以提升对元数据的管理同时提升GC效率

以上内容,是本人学习的笔记和工作中的总结,仅供大家参考,有误的地方还请指正

转载、引用请标明出处
https://www.jianshu.com/p/da41cc4122ff
本文出自zhh_happig的简书博客,谢谢

相关文章

网友评论

      本文标题:Metaspace与PermGen

      本文链接:https://www.haomeiwen.com/subject/ttkykqtx.html