方法区概述 《Java虚拟机规范》中明确说明:"尽管所有额方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会去进行垃圾收集或者进行压缩",但是对于HotspotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆区分开,所以,方法区看做是一个独立于Java堆的内存空间
java.lang.OutOfMemoryErrot:PermGen space
或java.lang.OutOfMemoryError:Metaspace
设置方法区大小与OOM
java.lang.OutOfMemoryErrot:PermGen space
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
指定,代替原有的参数-XX:MetaspaceSize
是21M-XX:MaxMetaspaceSize
是-1,即没有限制OutOfMemoryError:Metaspace
-XX:MetaspaceSize
设置初始化的元空间大小,对于一个64位的服务器端JVM来说,其默认的-XX:MetaspaceSize
值为21M,这就是初始的高水位线,一旦触及这个水位线,,Full GC
将会触发卸载没用的类(即这些类的类加载器不在存活),然后这个高水位线将会被重置。新的高水位线的值取决于GC后释放了多少元空间。如果释放的空间不足,那么在不超过MetaspaceSize
时,适当提高该值,如果释放空间过多,将适当降低该值Fun GC
被多次调用,我了避免频繁的GC,建议将-XX:MetaspaceSize
设置为一个相对较高的值如何解决OOM?
方法区(Method Area)存储什么? 存储内容:类型信息、常量、静态变量、即使编译器编译后的代码缓存等
类Class、接口interface、枚举enum、注解annotation
),JVM必须在方法区中存储以下类型信息:接口interface
或是java.lang.Object
,都没有父类)方法区的垃圾回收 方法区的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型
final
的常量等,而符号引用则属于编译原理方面的概念,包括三类常量: HotSpot
虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收OSGi
、JSP
的重加载等,否则通常是很难达成的java.lang.Class
对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法方法区储存什么
用户存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等
补充说明:全局常量:static final 被声明为final的类变量的处理方法则不同,每个全局变量在编译的时候就会被分配了
常量池
运行时常理池
OutOfMemoryError
异常扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有