JVM内存

  java程序的执行流程

java源代码(.java文件)由Java编译器编译为class文件,

JVM虚拟机类加载器加载编译后的文件,交给JVM执行引擎去执行

在整个程序执行的过程中,JVM会使用一个名字叫做 Runtime Data Area 运行时数据区来存放程序运行所用到的数据与相关信息

运行时数据区就是我们俗称的JVM内存

  根据Java虚拟机规范,运行时数据区分为 程序计数器 本地方法栈 java栈 堆 方法区

  程序计数器

用来指示执行那一条指令,每一个线程都有独立的程序计数器,在JVM中多线程是通过线程切换来获取CPU执行时间的.

本地方法栈

:  执行本地方法

  java栈(每一个线程都有一个独立的java栈,互不干扰:)

java栈,里边存放的是一个一个的栈帧,每一个栈帧对应一个被调用的方法

在栈帧里包括局部变量表,操作数栈,指向当前方法所在类的运行时常量池的引用,方法的返回地址

局部变量表:就是存放方法中的局部变量(包括在方法声明中的非静态变量以及函数形参).对于基本数据的变量,直接存储的是它的值,对于引用类型变量,存储的是指向对象的引用

局部变量表在编译期就确定大小,程序执行期间,局部变量表大小不改变

指向运行时常量池的引用:在方法执行的过程中,有可能用到类中的常量,所以,需要有一个引用指向运行时常量

方法返回地址:当一个方法执行完,要返回之前调用它的地方

  堆:(堆是被所有线程所共享)

java中的堆用来存储对象实例本身以及数组(引用时存放在java栈里边的)

  方法区(方法区被所有线程共享):

存放class文件,方法区里存储每个类的信息,包括类的名称,方法信息,字段信息,静态变量,常量以及编译后的代码

常量池是用来存储编译期间生成的字面量和符号引用

运行时常量池,它是每一个类或接口运行时常量池的表示形式,在类和接口被加载到JVM中后,对应的运行时常量池就被创建出来了,

运行时常量池的数据不仅来自于class文件常量池

在运行期间,还可以把新的常量放入运行时常量池

 

posted @ 2018-12-06 14:15  1314520jinxuexia  阅读(99)  评论(0编辑  收藏  举报