一、方法区是什么
java虚拟机规范里解释,方法区是可供各个线程共享的运行时区域
二、方法区能做什么
方法区域传统语言中的编译代码存储区或者操作系统进程的正文字段的作用非常类似,它存储了每一个类的结构信息,例如,运行时常量池、字段、方法数据、构造数据和普通方法的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。
运行时常量池、字段、方法数据、构造数据和普通方法的字节码,当类加载器把class文件加载进虚拟机之后,class文件里面的这几部分内容就会保存到方法区里面。
三、设置方法区的内存大小
jdk7之前
(1)-XX:PermSize设置永久代初始分配空间默认是20.75M
(2)-XX:MaxPermSize设置最大永久代分配空间,32位机器默认64M,64位机器默认82M
(3)当jvm加载的类信息容量超过了这个值,会报异常java.lang.OutOfMemoryError:PermGen space
jdk8及以后
(1)元数据区大小可以使用参数-XX:MetaspaceSize和-XX:MaxMetaspaceSize指定
(2)默认值依赖于平台,windows下,-xx:MetaspaceSize是21.75M,-XX:MaxMetaspaceSize的值是-1,即没有限制
(3)默认情况下,虚拟机会耗尽所有的可用系统内存,如果元数据区发生溢出,虚拟机一样会抛出OutOfMemoryError:Metaspace
(4)-xx:MetaspaceSize:设置初始的元空间大小。对于一个64位的服务器端jvm来说,其默认值-xx:MetaspaceSize的值是21M,这就是初始的高水位线,一旦触及这个水位线,Full GC将会触发并卸载没用的类,然后高水位线会被重置。新的高水位线的值取决于GC后释放了多少元空间。如果释放的空间不足,那么在不超过MaxMetaspaceSize时,适当提高该值。如果释放空间过多,则降低该值。
(5)如果初始高水位线设置过低,上述高水位线调整情况发生很多次,通过垃圾回收器的日志可以观察到Full GC多次调用。为了避免频繁的GC,建议将-XX:MetaspaceSize设置为一个相对较高的值。
四、处理OOM
(1)OOM或者heap space异常,一般使用内存映像分析工具对dump出来的堆存储快照分析,分析是内存泄漏还是内存溢出
(2)如果是内存泄漏,可进一步通过查看GC roots的引用链,查找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。
(3)如果不是内存泄漏,那就是说对象必须存活,此时需要增加虚拟机的参数(-Xmx和-Xms)
网友评论