转载、引用请标明出处
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,最大空间,默认是没有限制的。
- Metaspace与PermGen之间最大的区别在于:
3 去除PermGen的好处
- 将字符串常量池从PermGen分离出来,与类的元数据分开,提升类的元数据的独立性
- 将类的元数据从PermGen剥离出来到Metaspace,可以提升对元数据的管理同时提升GC效率
以上内容,是本人学习的笔记和工作中的总结,仅供大家参考,有误的地方还请指正
转载、引用请标明出处
https://www.jianshu.com/p/da41cc4122ff
本文出自zhh_happig的简书博客,谢谢
网友评论