美文网首页
JVM虚拟机学习笔记2

JVM虚拟机学习笔记2

作者: 毛利小二郎 | 来源:发表于2018-03-25 09:14 被阅读0次

JAVA虚拟机在执行JAVA程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途,以及创建销毁时间。JAVA虚拟管理的内存包括以下几个运行时数据区

运行时数据区

程序计数器

程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

JAVA虚拟机栈

线程私有,生命周期与线程相同,描述的是JAVA方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈

本地方法栈与虚拟机栈所发挥的作用相似,其区别不过是虚拟机栈为虚拟机执行JAVA方法服务,而本地方法栈则是为虚拟机使用到的NATIVE方法服务。

JAVA堆

JAVA堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内在。JAVA堆分为新生代和老年代,再细致一点的有Eden空间、from survivor空间、to survivor空间等。堆大小通过-Xmx和-Xms控制

方法区

与JAVA堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。

对象访问

reference类型在JAVA虚拟机里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到JAVA堆中的对象的具体位置,访问对象的方式有两种:使用句柄和直接指针。

句柄方式:JAVA堆中划分出一块内存作为句柄池,引用中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。

通过句柄方式访问 

直接指针访问方式:引用中直接存储的就是对象的地址。

直接指针访问对象

使用句柄最大好处就是引用中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而引用本身不需要被修改。

使用直接指针访问方式的好处就是速度快,它省掉了一次指针定位的时间开销,由于对象的访问在JAVA中非常频繁,因此这类开销积少成多也是一项非常可观的执行成本。

相关文章

网友评论

      本文标题:JVM虚拟机学习笔记2

      本文链接:https://www.haomeiwen.com/subject/vtkhcftx.html