Java方法区(Method Area),在Java虚拟机(JVM)内存结构中是一个非常重要的组成部分。方法区是用来存储类信息、常量、静态变量以及即时编译器编译后的代码等数据的内存区域。
存储位置:JDK1.8之前,方法区存储在堆内存之中;JDK1.8及之后,方法区存储在直接内存之中。
存储对象:JDK1.6及之前方法区(永久代实现)存储的有常量池(字符串,运行时),静态变量,代码缓存;JDK1.7之后,方法区(永久代实现),将字符串常量和静态变量挪到了堆内存里面。
为什么JDK1.7之后要将字符串常量,静态变量挪到堆内存呢?
因为在永久代,这些对象回收比较困难,但是大多数字符串常量都是朝生夕死,需要高效的被GC,因此基于效率和节省空间角度考虑,将字符串常量挪到了堆里面。
Java 8及其后续版本使用Metaspace(元空间)来替代传统的PermGen(永生代),可以使用以下命令行选项来配置Metaspace:
设置Metaspace的最大大小:-XX:MaxMetaspaceSize=256m
设置Metaspace的初始大小:-XX:MetaspaceSize=64m
设置Metaspace的最大可用空间百分比:-XX:MaxMetaspaceFreeRatio=70
设置Metaspace的最小可用空间百分比:-XX:MinMetaspaceFreeRatio=40