方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆(Non-Heap)。
jdk6及以前
很多人都更愿意把方法区称呼为“永久代”。
HotSpot虚拟机中,静态变量、字符串常量池都是分配在永久代中,我们可以通过-XX:PermSize和-XX:MaxPermSize
限制永久代的大小,即可间接限制其中常量池的容量。
jdk7
原本存放在永久代的静态变量、字符串常量池被移至Java堆之中。无法通过永久代参数限制常量池大小。可以使用-Xmx
参数限制最大堆大小进而限制常量池大小。
jdk8
终于完全废弃了永久代的概念。
永久代已被元空间(Metaspace)
所取代。它使用的是本地内存(Native Memory),也就是直接在操作系统的内存中进行分配和管理。这使得元空间的大小不再受到 Java 堆的限制。
把JDK 7中永久代还剩余的内容(主要是类型信息,运行时常量池、类型信息、常量、字段、方法等)全部移到元空间中。无法通过永久代参数限制常量池大小。