您现在的位置是:首页 > 文章详情

jvm 运行时数据区域(读书笔记)

日期:2019-02-01点击:368

java虚拟机运行是区域主要分为五个

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 方法区

1.程序计数器

 程序计数器是一块比较小的内存空间。可以看作是当前现场所执行的字节码的行号指示器。每条线程都有一个独立的程序计数器,在各线程之间是独立存储的,这类内存区域为“线程私有”内存。如果是一个Native方法这个计数器值为空(Undefined)。

2.java虚拟机栈

 虚拟机栈也是线程私有的,它的生命周期和线程相同。每个java方法在执行的时候都会创建一个栈帧。用于储存局部变量表,操作数栈,动态链接,方法出口信息等。 局部变量表存放了编译期可预知的各种基本数据类型,对象引用,returnAddress类型。 局部变量表所需要的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部空间是完全确定的,在方法运行期间不会改变局部变量的大小。

3.本地方法栈

 本地方法栈和虚拟机栈功能基本相同,只是针对的对象不同。它针对的是虚拟机使用到的Native方法服务。在虚拟机规范中对它没有强制规定,可以把它合并到虚拟机栈中。

4.堆

 堆是java虚拟机所管理的最大的一块内存区域。java堆是本所有的线程共享的一块内存区域,在虚拟机启动时创建。这块内存区域唯一目的就是存放对象实例,几乎所有的对象实例都创建在这里。 java堆是垃圾收集器的主要管理区域,从垃圾收集器基本采用分代收集算法来区分堆区域,堆区域还可以细分为:新生代和老年代;再细致一点有分Eden空间、From Survivor空间、To Survivor空间等。从内存分配的角度来看,线程共享的java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)

5.方法区

 方法区也是各个线程共享的区域,它用于储存已经被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码数据等。很多人也把这个区域叫永久代。

6.运行时常量

 运行时常量池是方法区的一部分。clas文件中除了有类似的版本、字段、方法、接口等信息描述外,还有一项信息是常量池,用于存放编译期产生的各种字面量和符号引用,这部分在类加载后进入方法区的运行时常量池中存放,还会把翻译出来的直接引用也存储在运行时常量池中。

7.直接内存

 直接内存不是虚拟机运行时数据的一部分,也不在java虚拟机规范中定义的内存区域。在JDK1.4中加入了NIO类,引入了基于通道与缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java中的DirectByteBuffer对象作为这块内容的引用操作。
原文链接:https://yq.aliyun.com/articles/689683
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章