java内存执行过程。
我们先编写java源代码源文件(.java),经过java编译器(java compiler)后变成java字节码文件(.class),最后交个jvm(java vitual machine:java虚拟机)运行。图片说明
jvm(runtime date area:运行数据区)主要分为五个部分:堆、方法区、虚拟机栈、本地方法栈、程序计数器。图片说明
1、堆:线程共享,主要用于分配对象实例和数组
-Xms设置最小值
-Xmx设置最大值
如果xms=xmx则可以避免对自动扩展
2、方法区:线程共享
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
也被称为永久代。
-xx:maxpermsize设置上限
-xx:permsize设置最小值
class文件中除了有类的版本、字段、接口、方法等信息,还有一项常量池,用于存放编译器生成的各种字面两和符号引用,这部分内容将在类加载后进入方法区的运行常量池中存放。
3、虚拟机栈:线程私有,他的生命周期和线程相同。
描述的是java方法执行的内存结构模型:每个方法在执行的同时多会创建一个栈帧用于存放局部变量表、操作数栈、动态链表、方法出口等信息。
每一个方法从挑用直至完成的过程就对应这一个栈帧在虚拟机中入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据类型和对象引用,所需内存空间在编译期确定。
4、程序计数器
线程私有,即每个线程都会有一个,线程之间互不影响,独立存储。
代表着当前线程所执行字节码的行号指示器。
5、本地方法栈
Nativemethodstack(本地方法栈):保存native方法进入区域的地址