什么是方法区?它的作用是什么?代码举例讲解

方法区(Method Area)是JVM内存结构的一部分,它用于存储类加载器、常量、静态变量、类信息(类名、访问修饰符、字段、方法)等数据。

方法区的作用是:

  1. 存储类加载器及定义在方法区的类型信息。
  2. 存储常量、静态变量等数据,这些数据在程序运行期间保持不变。
  3. 方法区用于存储共享数据,这些数据可以在程序运行期间被多个线程访问。
  4. 方法区的大小仅受本地内存限制,但是可以使用XX:MaxMetaspaceSize参数来限制最大大小。

来看一个简单示例:

public class MethodAreaDemo {
    public static final int NUM = 10;    // 常量在方法区
    public static String str = "Hello";  // 静态变量在方法区

    public static void main(String[] args) {
        // 同一静态变量被多个线程访问
        new Thread(()->{
            str = "Hi";
            System.out.println(str);     // Hi
        }).start();

        new Thread(()->{
            System.out.println(str);     // Hi
        }).start();
    }
}

在该示例中:

  1. 常量NUM和静态变量str存储在方法区。
  2. 多个线程访问公共的静态变量str,其值在方法区共享。
  3. str在方法区的同一块内存被赋值和访问。

所以,方法区用于共享数据的存储和访问。理解方法区有助于我们更好的管理这部分内存,判断数据存储位置。