现在的位置: 首页 > 综合 > 正文

java JVM 运行时数据区

2017年10月22日 ⁄ 综合 ⁄ 共 1065字 ⁄ 字号 评论关闭

原文链接: JVM
Run-Time Data Areas

参考地址: JVM运行时是什么样子?

这是阅读JVM规范时的笔记, 我画了一幅图来帮助自己加深理解:

图1 JVM运行时数据区

1. 单线程数据区(非共享)
从上图可以看出,每个线程都有自己独立的数据区,包括 PC(程序计数器),JVM(方法)栈,以及本地方法栈. 当创建新线程时,这些数据区域将会一并创建.

程序计数器: 英文名字是 Program Counter Register,简称PC,
用于记录每个线程执行到哪个地方了(可以认为程序是指令的序列,PC记录着下一条(或本条)应该执行的指令的地址).

JVM方法栈:  包含如下面的图所示的一些栈帧(frame).
本地方法栈: 英文为 Native Method Stack,顾名思义,适用于供
native方法使用的内存空间,本地方法(native method)指不用Java语言开发的方法,如 C,C++,PB等编译型语言所开发的动态链接库(中的方法).


2. 所有线程共享数据区
堆内存 和 方法区 是所有线程共享的数据区.

堆内存: 英文名称 Heap,是Java编程最频繁使用的内存区域.
其中存储着 数组和对象,当 JVM启动时即创建此内存区域, 垃圾回收主要是指堆内存的回收。

方法区: Method Area,存储了 运行时常量池,类结构信息(field and method data)
以及 方法,构造器的代码.

运行时常量池: Runtime Constant Pool, 每一个类或者接口,在其编译后生成的 .class文件中,有一个部分叫做
常量表(constant_pool_table),JVM将class文件加载以后,就解析常量表的内容到运行时常量池. 包括编译时方法中就明确可知的数字值,String值, 以及必须在运行时解析的属性域引用(field reference).


图2 JVM栈

JVM栈(Stack)由一个个的 栈帧(Frame)组成,当一个方法被调用时会自动压入一个栈帧到Stack中. 每个栈帧(frame)由局部变量区,操作数栈,以及对常量(池)的引用组成.

想要了解更详细的信息,建议访问: JVM官方文档.

相关文章:

  1. JVM运行时是什么样子?
  2. What
    does a Java array look like in memory?
  3. What
    can we learn from Java HelloWorld?
  1. A
    simple Swing GUI example for Observer Design Pattern

抱歉!评论已关闭.