论坛首页 Java企业应用论坛

JAVA class文件研究1

浏览 3030 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2014-03-06  

      JAVA 代码经过编译后,会生成class文件,具体class文件结构又对应什么。

      JAVA虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域

      1 虚拟机栈

      2 方法区

      3 堆

      4 本地方法栈

       5 程序计数器

       我们主要来讨论1-3

       虚拟机栈

       虚拟机栈是线程私有的,虚拟机栈是服务于JAVA的方法的,每个方法被执行的时候就同时创建一个栈帧。栈帧中用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

局部变量表和操作数栈的在执行前深度就已经确认,他们是用来执行方法中的操作的,局部变量表,存放的是编译器可知的基本数据类型,所以方法被编译时,系统只对方法中进行定义的对象进行统计,比如 String fengfu=new String();就对应一个局部变量表中一个变量,类型为reference 名字为fengfu;后面的new String();是堆上分配的,大小不确定,所以经编译后,并不存放于局部变量表中。

        方法被解析为jvm指令后,操作的就是局部变量表,将局部变量表中的数据取出,放入操作数栈中,进行计算或者将操作数栈的结果存放到局部变量表中。

        栈帧虽然是线程私有的,但是因为方法的jvm指令可以直接操纵堆中的变量,所以并不是线程安全的。


2 方法区

       方法区是线程共享的内存区域,用于存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。

3 JAVA 堆 

       JAVA 堆是被所有线程共享的一块内存区域,用户存放对象实例的,几乎所有的对象实例都是在这里分配内存:所有的对象实例以及数组都要在堆上分配。

 

       一个类被编译为class后,jvm指令存在于哪个地方呢,class文件各部分对应内存中哪些模块呢。

首先,先来看一下class文件结构

 

       class文件中的常量池,对应于Java内存区域中的方法区,里面存放了类中的各种字面量和符号引用。存放了类和接口的全限定名,字段的名称和描述符,方法的名称和描述符,字段的字符串常量,方法中的变量和字符常量等。

       class文件中的字段表描述了字段的作用域(private,protected,public修饰符),可变性(final修饰符),并发性(volatile描述符),是类变量还是实例变量(static 描述符),该部分也对应内存区域的方法区

方法表则对应java文件中的各种方法,构造函数,其他方法等,方法的形参,返回值等,这些信息对应于内存中的方法区。上面曾说过,每个方法对应一个栈帧,里面包含局部变量表,操作数栈等。这些信息保存于方法表中每个方法对应的属性表中,属性表包含了局部变量表,操作数栈,及方法经编译后的Jvm指令等。这些信息存放于于内存中的虚拟机栈中。

        下一章,我会根据一例子来讨论java类文件与class文件的对应和内存中的关系。

 

  • 大小: 43.6 KB
  • 大小: 33.1 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics