java内存区域-方法区

来源:互联网 发布:云和山的彼端 mac 编辑:程序博客网 时间:2024/05/24 02:55

方法区同java堆一样,是各个线程共享的一块内存区域,用来存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码

因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假设两个线程都在找java类,当这个类没有被加载时,只能有一个线程去加载,而其他线程等待。

java虚拟机规范把方法区描述为堆的一个逻辑部分,但他却有一个别名(Non-heap 非堆),明确的把方法区和堆区分开来。

很多人还愿意把方法区称为“永久代”,but二者在本质上并不是等价的,仅仅是因为Sun Hotspot虚拟机的设计团队把GC分代收集扩展到了方法区,或者是通过永久代实现方法区。

方法区除了和java堆一样不需要在物理上连续的内存,和可以设置固定大小和可扩展内存外,它还可以设置不实现垃圾收集。相对而言,GC在这个区域的收集行为很少,但并不意味着数据进入这个区域就长生不老了,这个区域的内存回收目的主要是针对常量池的回收以及类型的卸载

当方法区无法满足内存的分配需求时,抛出OutOfMemoryError错误。