Advertisement

方法区与常量池(静态与动态常量池)

阅读量:

方法区

Java堆与方法区同属多线程共享的内存区域,其主要功能是存储由虚拟机加载的类型信息、常量、静态变量以及即时编译器生成的代码缓存等数据。该区域亦被称作"非堆",其命名旨在与Java堆形成明确区分。

方法区与永久代解析

在JDK8之前,许多开发者常常将方法区与永久代视为同一概念,但实际上二者并不完全等同。这种混淆主要源于HotSpot虚拟机设计团队在当时将垃圾收集器的分代策略扩展到了方法区,或者说采用永久代作为方法区的实现方式。这一设计使得HotSpot的垃圾收集器可以像处理Java堆内存一样处理方法区的内存,从而避免了需要单独为方法区开发内存管理机制的麻烦。

然而,对于其他类型的虚拟机而言,永久代的存在则并非必然。

缺陷识别与改进策略

缺陷
通过永久代实现方法区的设计,使Java应用更易遭遇内存溢出的问题(永久代存在-XX:MaxPermSize的上限,即使未进行设置也具备默认大小,而J9和JRockit只要未达到进程可用内存的上限,如32位系统中的4GB限制,通常不会发生此类问题)。

此外,某些特殊操作(例如:String::intern())由于与永久代相关,在不同虚拟机环境下可能表现出差异性。

改变

  • 自JDK6起,HotSpot开发团队便已着手计划逐步放弃使用永久代,并转向利用本地内存来实现方法区

全部评论 (0)

还没有任何评论哟~