程序执行过程的内存分析(简单篇)
2018-02-24 16:34
295 查看
1.默认值问题:
引用类型-null,String-null,int-0,float-0.0,boolean-false,char-\u0000;全局变量会默认初始化,但局部变量则不会默认初始化(编译出错);0
2.源码逻辑:
public class StudentJVM { private int age; private String name; public void say(){ System.out.println("age:"+age+",name:"+name); } public void sayHello(String param){ System.out.println("sayHello:"+param); } //1.找到main入口: public static void main(String[] args) { //2.StudentJVM:Class loader加载StudentJVM类,装载相关的类信息在方法区; //3.建立局部变量stu1,在栈区; //4.new StudentJVM(),划出一块连续的内存区域,并完成初始化,在堆区; //5.将4中的首地址赋值给3中的变量stu1; StudentJVM stu1 = new StudentJVM(); //6.通过stu1地址找到对应的age,赋值为18(基本数据类型) stu1.age = 10; //7.通过stu1地址找到对应的name,赋值为常量池中的"大大"的地址 stu1.name = "大大"; //8.通过stu1找到在方法区存储的say()方法信息,并在栈中开辟栈帧,执行相关代码,执行完成后,栈帧关闭; stu1.say(); //9.在方法区发现该class信息已加载完成,执行2,3,4,5的相关逻辑 StudentJVM stu2 = new StudentJVM(); //10.通过stu1地址找到对应的name,并在堆区划出一块区域存储"小小",并将其地址赋值给name stu2.name = new String("小小"); //11.在栈中开辟一个栈帧区域,用来执行stu2.sayHello("哈哈")方法 stu2.sayHello("哈哈"); } }
3.jvm内存图讲解:
常量池共享每个class都含有类信息,static变量,常量池三部分
4.String的栈区和堆区的存储讲解:
String s1 = "23"; String s2 = "23"; //测试其使用的是静态常量,在栈区: System.out.println(s1==s2);//true; String s3 = new String ("23"); String s4 = new String ("23"); //测试new方式生成的在堆区: System.out.println(s1==s3);//false; System.out.println(s3==s4);//false;
5.成员变量,局部变量的存储位置:
a.在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈(栈帧),其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因 (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中 (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆内存中的。b.在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。 (1)当声明的是基本类型的变量其变量名及其值放在堆内存中的 (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中6.栈帧结构:
局部变量表:保存函数的参数以及局部变量用的,局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。操作数栈:主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。只支持出栈入栈操作。7.成员变量为引用数据类型的分析
8.static变量方法:
static变量在 类的static变量区;方法地址在static变量区,而方法的具体代码在 类的代码信息中;
new出来的内存区域,含有成员变量,不含static变量;
如图,静态方法不能调用非静态变量/方法,非静态方法可调用静态变量/方法
相关文章推荐
- QT最简单的程序执行过程分析(内含C++基础知识)
- JAVA 程序执行过程中的内存分析。
- 面向对象编程(三)——程序执行过程中内存分析
- 一个简单程序的汇编执行过程分析
- java——程序执行过程的内存分析
- 面向对象编程(三)——程序执行过程中内存分析
- Python源码分析2 - 一个简单的Python程序的执行
- 《Linux内核分析》(一)——反汇编一个简单的C程序并分析其汇编代码的执行
- Java程序开发中的简单内存分析
- Python源码分析2 - 一个简单的Python程序的执行
- C/C++程序从编译到最终生成可执行文件的过程分析
- Java程序执行过程分析
- 计算机是如何执行程序的(以汇编一个简单的C程序,分析汇编代码为例)
- java程序执行内存处理过程
- 程序执行过程内存模型
- 【J2SE】分析程序的内存分配过程
- Android OTA升级原理和流程分析(八)---升级程序update_binary的执行过程
- C/C++程序从编译到最终生成可执行文件的过程分析
- 反编译C程序为汇编代码,汇编代码执行过程的分析与思考
- 0002_程序执行过程内存图