阅读更多
Java虚拟机运行一个程序时,程序相关的所有数据,都存放在运行时数据区中。运行时数据区包括:
方法区,堆,Java栈,PC寄存器,本地方法栈。
1.
方法区:在Java虚拟机中,被装载类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件,一个线性二进制数据流,然后将它传输到虚拟机中,紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。此类型的静态变量同样也是存储在方法区中。(Class对象是在堆上分配内存空间)。
方法区存储的类信息包括:
(1).这个类型的全限定名
(2).这个类型的直接超类的全限定名
(3).这个类型是类类型还是接口类型
(4).这个类型的访问修饰符(public, protected, private,final, abstract,默认)
(5).任何直接超接口的全限定名的有序列表.
(6).此类型的常量池
(7).字段信息:字段名,字段类型,字段修饰符.
(8).方法信息:方法名,方法的返回值,方法参数数量,类型和顺序,方法的修饰符。
(9).除了常量以外的所有静态变量
(10).一个到类的ClassLoader的引用:每个类型被装载的时候,虚拟机必须跟踪它是由启动类装载器还是由用户自定义的类装载器装载的。如果不是由启动类装载器进行装载的必须保存ClassLoader的引用。为的是请求同一个类装载器来装载被当前类所引用到的类。
(11).一个到Class类的引用:每一个类都对应着一个Class对象。
Class.forName("")装载指定的类,并返回一个Class对象.
obj.getClass();
类名.class;
(ClassLoader实例和Class类的对像都是在堆上面的)
Class类使得运行程序可以访问方法区中保存的有关装载的类的信息,是外部Java程序与虚拟机内部状态间的访问接口
2.
堆:Java程序在运行时创建的所有类实例和数组都放在同一个堆中。一个Java虚拟机实例中只存在一个堆空间,所有线程共享这个堆。每个Java程序独占一个Java虚拟机实例,因此每个Java程序都有自己的堆空间。
3.
Java栈:Java栈则总是存储此线程中Java方法调用的状态--包括它的局部变量,传入的参数,返回值,和一些中间结果等等。
4.
PC寄存器:PC寄存器的大小是一个字长,因此它能够持有一个本地指针,内容总是下一条将被执行指令的"地址"。
5.
本地方法栈:而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其它某些与特写实现相关的内存区中。
一个新线程被创建时,它将会得到自己的PC寄存器(程序计数器)以及一个Java栈,线程的PC寄存器和Java栈是私有的,任何其它的线程都不能访问。
每个Java虚拟机实例都有一个方法区和一个堆,它们是由此虚拟机实例中所有线程共享的。
- 大小: 29.9 KB