面试:你知道JVM的方法区是干什么的吗
跑一个main函数需要多少个类?类存在哪里?
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(10000000);
}
}
使用vm工具查看
以上字节码以class保存在磁盘中,Java运行的时候必须把这个文件加载到内存中,存储在jvm的方法区中。如上图所示。
- 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域
- 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的
- 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:Metaspace,比如:
例如:
有大量的第三方jar包加载;
Tomcat部署的工程过多;
大量动态生成反射类;
在Java1.8中,HotSpot虚拟机已经将将发区(永久代)移除,取而代之的就是元空间。
试验
案例试验:限制springboot的方法区大小,看是否发生java.lang.OutOfMemoryError:Metaspace
jvm配置上Metaspace的大小
-XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m