深入理解JAVA虚拟机--运行时数据区域

来源:互联网 发布:蓝凌软件下载 编辑:程序博客网 时间:2024/06/01 10:23

1.程序计数器是较小的内存空间,可看作当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变计数器值选择下一条需要执行的字节码指令。另外,为了保证多线程过程中线程切换后可以恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,之间互不影响,称线程私有的内存。

2.虚拟机栈同上,也是线程私有的,它的生命周期与线程相同。每个方法在执行 同时创建一个栈帧,每一个方法从调用直至执行完成的过程对应着一个栈帧在虚拟机栈中入栈到出栈的过程。java内存粗糙分类中的堆内存和栈内存--栈即虚拟机栈。

3.本地方法栈同2发挥作用相似,区别在于2为虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务。

4.java堆是虚拟机管理的内存中最大的一块。它是被所有线程共享的一块内存区域,在虚拟机启动时创建。可以存放对象实例,几乎所有的对象实例都在这里分配内存。可以处于物理上不连续的内存空间中,只要逻辑上连续即可,可以选择固定大小或者可扩展。

5.方法区同4一样是线程共享的内存区域,用于存储一倍虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。别名Non-Heap,不需要连续的内存,可以选择固定大小或者可扩展,还可以选择不实现垃圾收集。其中的运行时常量池用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

其他:直接内存--不是虚拟机运行时数据区的一部分也不是JAVA虚拟机规范中定义的内存区域。JDK1.4加入的NIO类引入一种基于通道与缓冲区的I/O方式,使用Native函数库直接分配对外内存,然后通过一个存储在JAVA堆中的DirectByteBuffer对象作为这块内存的引用进行操作。直接内存收到本机总内存大小以及处理器寻址空间的限制。

原创粉丝点击