面试:你知道JVM的方法区是干什么的吗

跑一个main函数需要多少个类?类存在哪里?

  1. public class Test {
  2. public static void main(String[] args) throws InterruptedException {
  3. Thread.sleep(10000000);
  4. }
  5. }

使用vm工具查看
image.png
image.png
以上字节码以class保存在磁盘中,Java运行的时候必须把这个文件加载到内存中,存储在jvm的方法区中。如上图所示。

  1. 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域
  2. 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的
  3. 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展
  4. 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:Metaspace,比如:

例如:
有大量的第三方jar包加载;
Tomcat部署的工程过多;
大量动态生成反射类;
在Java1.8中,HotSpot虚拟机已经将将发区(永久代)移除,取而代之的就是元空间。

试验

案例试验:限制springboot的方法区大小,看是否发生java.lang.OutOfMemoryError:Metaspace
jvm配置上Metaspace的大小

  1. -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m