引言:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。该篇就是初始JVM运行时数据区域
首先运行时数据区域由以下几个模块组成:
1.程序计数器
2.Java虚拟机栈
3.本地方法栈
4.java堆
5.方法区
6.运行时常量池
那瞅瞅每份内存储存的是什么?作用又是什么呢?
----------------------------------------------------------手动分割线~---------------------------------------------------------------------------
1.程序计数器
它可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码执行,并执行。
那么像分支,循环,跳转,异常处理线程恢复等基础功能都需要依赖这个计数器完成。(因为在这些情况下,没有计数器,你让系统执行哪段代码呢,它不晓得的啊~)
多线程的情况也是这样的,为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器。这样我们也就不难理解这类内存区域为“线程私有”内存~
2.Java虚拟机栈
java虚拟机栈是java方法执行的内存模式。每个方法在执行时都会创建一个栈帧,那么想象一下,每个线程上都会执行相应的方法,所以方法是依赖于线程的,那么我们就不难理解,这块内存也是线程私有的~
这块内存存储的是啥呢? 存储局部变量表,操作数栈,动态链接,方法出口等信息。
每次方法从调用到执行完,对应着一个栈帧在虚拟机栈中入栈到出栈的过程!(画重点,要考的啊)
3.本地方法栈
本地方法栈与虚拟机栈的作用非常相似,他们之间的区别:
java虚拟机栈是为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务!就辣么简单
4.java堆
这块内存的唯一目的就是存放对象实例,由于java堆是java虚拟机所管理的最大的一块内存,那么它很显然要被垃圾收集管理重点照顾啦,因此很多时候也被称为“GC堆”(Garbage Collected Heap)
java堆其实还能细分:新生代和老年代
新生代再细分:Eden 空间,From Survivor空间,To Survivor空间
为啥分这么多呢,为啥这么分呢,我们之后再另起一篇博客针对java堆再细说~
5.方法区
方法区存放的啥呢?它存放的是已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
该内存是线程共享的内存区域!
6.运行时常量池
运行时常量池是方法区的一部分,存储的是编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入运行时常量池~
java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行时也可能将新的常量放入池中; String类的intern()方法就利用了这种特性。
到这JVM内存分配应该就大体有一个朦胧而又美丽的印象了~~