一.方法区(Method Area)概述
1.对于习惯于在HotSpot虚拟机上开发和部署程序的开发者来说,很多人愿意将方法区称之为"永久代"(Permanent Generation)
2.同javaHeap一样,是各个线程共享的内存区域
3.用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
4.它有一个别名Non-Heap(非堆),目的是应该与java堆区分别开来
5.当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
二.类信息包含哪些内容?
1.类型全限定名
2.类型的直接超类的全限定名(除非这个类型是java.lang.Object)
3.类型是类类型还是接口类型
4.类型的访问修饰符(public, abstract, final的某个子集)
5.任何直接超接口的全限定名的有序列表
6.类型的常量池
7.字段信息
8.方法信息
9.除了常量以外的所有的静态变量
10.一个类到ClassLoader的引用
11.一个到类Class的引用
三.常量池介绍
1.Class文件中的常量池:
主要用于存储两大类型常量:①字面量(Literal)②符号引用量(Symbolic Reference)
①字面量:文本字符串,或者声明为final的常量值等
②符号引用量:
- 类和接口的全限定名
- 字段名称和描述符
- 方法名称和描述符
2.运行时常量池
①Class文件的常量池用于存储字面量和符号引用量,这部分内容在类被加载进入方法区的运行时常量池中时被释放
②常量并不一定只在编译时期才能产生,也就是并非预先置入Class文件常量池中的内容才会被加载进入运行时期常量池中
③String的inter()方法可以在运行期间将新的常量放置入运行时期常量池中
四.字段信息
五.方法信息