课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存管理是程序员在开发软件的时候需要重点掌握的一个编程技术,下面我们就通过案例分析来了解一下,java编程运行时常量池的概念与作用。
方法区
方法区(MethodArea)也被称为永久代。方法区用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。
和Java堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出OutOfMemoryError异常。JDK1.7之前,HotSpot虚拟机把它当成永久代来进行垃圾回收。可通过参数-XX:PermSize和-XX:MaxPermSize设置。JDK1.8之后,取消了永久代,用**metaspace(元数据)**区替代。可通过参数-XX:MaxMetaspaceSize设置。
运行时常量池
运行时常量池(RuntimeConstantPool)是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池(ConstantPoolTable),用于存放编译器生成的各种字面量和符号引用,这部分内容会在类加载后被放入这个区域。
字面量-文本字符串、声明为final的常量值等。
符号引用-类和接口的完全限定名(FullyQualifiedName)、字段的名称和描述符(Descriptor)、方法的名称和描述符。除了在编译期生成的常量,还允许动态生成,例如String类的intern()。这部分常量也会被放入运行时常量池。
直接内存
直接内存(DirectMemory)并不是虚拟机运行时数据区的一部分,也不是JVM规范中定义的内存区域。
在JDK1.4中新加入了NIO类,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
总结
简单的归类,Java运行时内存区域中:
属于线程私有的区域是:程序计数器、Java虚拟机栈、本地方法栈;
属于线程共享的区域是:Java堆、方法区(包括运行时常量池)。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。