Java运行时数据区域学习

来源:互联网 发布:mac 连不上appstore 编辑:程序博客网 时间:2024/06/05 17:10

Java运行时数据区域学习

可以认为,程序由数据和方法构成。数据一般由变量来存储,而方法是用来操纵数据的。为了重用代码,封装等许多好处,类用来包装变量和方法。
Java源文件.java经过编译之后,得到.class字节码文件,然后,虚拟机从加载字节码文件进入内存,执行程序。在执行程序的过程中,肯定会产生很多数据,比如,创建对象,就需要为对象分配其变量的存储区域;方法执行就需要创建一个栈帧,这些数据存储在一块区域中,叫做运行时数据区。运行时数据区是我们接下来重点关注的。

1 运行时数据区域

Java相比于C++,有虚拟机提供的内存分配和垃圾收集技术带来的方便,不必自己亲自去写delete/free去手动释放内存,清除垃圾。但是,出现内存分配相关的问题的时候,就需要自己查看内存分配和垃圾收集相关的信息。而且,了解内存分配的信息,能够让我们的程序更加符合内存分配的要求。

Java虚拟机运行时数据区如下图所示:
这里写图片描述
程序计数器(Program Counter Register, PC)是当前字节码执行到哪一行的指示器。因为,程序执行时,可能存在很多循环、跳转和函数调用等,在执行这些代码之后,都需要恢复到原来执行的地方(下一行),故需要用PC来记录。对于多线程,每个线程拥有一个PC。
虚拟机栈(Java Virtual Machine Stacks, VM Stacks),可以说,这个区域对应于类中的方法,每个方法在执行时都会在VM Stack中创建一个栈帧(Stack Frame),用于存储方法中的局部变量(表)、操作数栈[1]、方法返回地址和对当前方法所属类在常量池的引用等信息。
本地方法栈(Native Method Stack),与虚拟机栈发挥的作用相似,但是,本地方法栈为虚拟机使用的Native方法服务。所谓Native方法,大致是指由其他语言实现的方法,比如C,而不是Java。
以上三块内存区域,均由线程私有。

Java堆(Java Heap),存放对象实例,几乎所有的对象实例都存放在这里。当你用new关键字创建新对象时,都会在堆上划分一块区域。对于HotSpot虚拟机,对象在内存中的布局分为3部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头包括两部分信息,第一部分是对象自身的运行时数据,如HashCode,GC年龄,锁状态标志等,第二部分是类型指针,指向对象的类元数据,表明这个对象属于哪个类的实例。类元数据存在于方法区。
实例数据存储对象真正的数据,即程序代码中定义的各种类型的字段。Java堆只是存储了对象的字段数据,没有存储对象的方法,方法执行时在虚拟机栈上进行。
对齐填充,是因为HotSpot虚拟机要求对象的大小必须是8字节的整数倍。当对象实例数据部分没有对齐时,会填充一些对结果没有影响的数据。
可见,Java堆是最大的一块内存分配区域,因而,也是垃圾回收(GC)重点关注的区域。

方法区(Method Area),用于存储已被虚拟机加载的类信息[2]、常量、静态变量、静态方法、构造器和即时编译器(JIT)编译后的代码等。运行时常量池(Runtime Constant Pool)是方法区的一部分,存放编译期生成的各种字面量和符号引用,例如,对方法的符号引用。
方法区和Java堆均为所有线程共享的区域。

2 例子分析

如果下面简单的Java代码运行时,则各部分存储信息如图所示。
当主函数中创建实例对象时,会在常量池和Java堆中新建数据。sum方法调用时,将在虚拟机栈中执行入栈/出栈的过程。
这里写图片描述

参考:

《深入理解Java虚拟机》
《Java Virtual Machine Specification》

文中部分名词解释:

[1]操作数栈,也称为操作栈,是一个后进先出(First In Last Out,LIFO)栈,在执行方法的过程中,会有字节码指令往操作数栈中写入和提取数据。比如,执行指令 “1 + 1”,对操作数栈的操作会是

iconst_1iconst_1iaddistore_0

这里写图片描述

两条iconst_1指令把两个常量1压入栈,iadd指令将栈顶的两个值出栈、相加,把结果压入栈顶,istore_0指令将栈顶的值(此时为2)保存到局部变量表中。
这是一种基于栈的指令集。学过计算机组成原理的同学,肯定会对x86或者MIPS指令集有印象,它们都是直接对寄存器进行操作。
[2]类的生命周期,如下图所示

这里写图片描述

加载class“文件”,这里不一定是位于磁盘的文件,也可能从网络获取,从ZIP包读取,只要是二进制字节流就可以。

如有疑问,还请指出,共同进步,你好我好大家好。

0 0
原创粉丝点击