本文主要是介绍Java虚拟机--方法区(运行时常量池),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章引用:
深入理解Java虚拟机
https://blog.csdn.net/huangfan322/article/details/53220169
一 方法区描述
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息/常量//静态信息/即时编译器编译后的代码等数据.虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却又一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来.
对于习惯在HotSpot虚拟机上开发,部署程序的开发者来说,很多人都更愿意把方法区成为”永久代”(Permanent Generation),本质上两者并不相等,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已,这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内容,能够省去专门为方法区编写内存管理代码的工作.对于其他虚拟机(如BEA JRockit/ IBM J9)来说是不存在永久代的概念的.原则上,如何实现方法区属于虚拟机实现细节,不受虚拟机规范约束,但是使用永久代来实现方法区,现在看来并不是一个好主意,因为这样更容易遇到内存泄漏问题(永久代有-XX:MaxPermSize的上限,J9和JRockit只要没有触碰到进程可用内存的上限,例如:32位操作系统中的4GB,就不会出现问题),而且有极少的方法(例如String.intern())会因为这个原因导致不同虚拟机下有不同的表现.因此,对于HotSpot虚拟机,根据官方发布的路线图信息,现在也有放弃永久代并逐步采用Native Memory来实现方法区的规划了,在目前已经发布的JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出
这篇关于Java虚拟机--方法区(运行时常量池)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!