方法区(Method Area)
是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范把方法区表述为堆的一个逻辑部分,但是他却有一个别名叫Non-Heap(非堆),目的应该是与java堆区分开来。
java虚拟机规范对方法区的限制非常宽松,不需要连续的内存、可以选择固定大小和可扩展,还可以选择不实现垃圾收集。但是这部分区域的回收是有必要的,这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收成绩比较令人不满意,尤其是类型的卸载条件相当苛刻。
根据java虚拟机规范的规定,当方法区无法满足内存需求时,将抛出OutOfMemoryError异常。