JAVA内存模型(一)JVM规范

JVM运行时数据

JAVA内存模型(一)JVM规范_第1张图片
1958298-94fef5834e5f47ac.png

分类

线程私有

1.虚拟机栈(stack):是对传统语言方法调用栈的一种模拟。JVM栈存放Frame用于方法调用和返回,存储局部变量以及计算中间结果。
2.程序计数器:类似于cpu中的pc,永远存放下一条字节码指令的地址。当执行native方法,pc为空。
3.本地方法栈:用于支持本地方法调用。

线程共享

1.堆(heap):所有进程共享,所有对象和数组都在堆上进行分配。GC的主要区域。
2.方法区(non heap):主要存已被虚拟机加载的类信息(比如类的方法,构造)、常量、静态变量、即时编译器编译后的代码等数据。

堆和栈的联系

栈中变量存放的是数组或对象的首地址,当没有引用变量指向该对象时,这个数组或对象就会变成垃圾,在随后不确定的时间被GC。


JAVA内存模型(一)JVM规范_第2张图片
20170908154039200.png

栈和堆的比较

堆主要用来存储对象,栈用来执行程序。

一个例子

以下代码的执行流程
Foo foo = new Foo();
foo.f();
1.Foo类首先被装在到JVM的方法区,包括类的构造和方法。
2.栈中分配引用变量foo
3.堆中按Foo类型分配实例变量内存空间,然后foo指向foo堆内存首地址。
3.使用引用foo调用方法,根据foo的引用Foo调用f方法。

你可能感兴趣的