面向对象的内存分析
为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底发生了什么变化,进行剖析,让大家做到“心中有数”,通过更加形象的方式理解程序的执行方式。
老鸟建议:
本节是为了让初学者更深入了解程序底层执行情况,为了完整的体现内存分析流程,会有些新的名词,比如:线程、Class对象。大家暂时可以不求甚解的了解,后期学了这两个概念再回头来看我们这篇内存分析,肯定收获会更大。
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。
栈的特点如下
1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3. 栈属于线程私有,不能实现线程间的共享!
4. 栈的存储特性是“先进后出,后进先出”
5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆的特点如下
1. 堆用于存储创建好的对象和数组(数组也是对象)
2. JVM只有一个堆,被所有线程共享
3. 堆是一个不连续的内存空间,分配灵活,速度慢!
方法区(又叫静态区)特点如下
1. JVM只有一个方法区,被所有线程共享!
2. 方法区实际也是堆,只是用于存储类、常量相关的信息!
3. 用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
内存分析图(4.2章节中示例2)
对象的使用及内存分析
【示例1】编写Person类
public class Person{
String name;
int age;
public void setAge(int age){
this.age=age;
}
}
【示例2】创建Person类的对象并使用
public static void main(String [] args){
//必须使用new关键字创建对象
Person person=new Person();
//使用对象(引用).成员变量来引用对象的成员变量
person.age=24;
//使用对象(引用).方法(参数列表)来调用对象的方法
person.setAge(23);
}
【示例3】创建Person类对象的提升
public static void main(String [] args){
//创建p1对象
Person p1=new Person();
p1.age=24;
p1.name="张三";
p1.show();
//创建p2对象
Person p2=new Person();
p2.age=35;
p2.name="李四";
p2.show();
}
示例3 运行效果图
示例3 内存分析图
内存分析图可以得出如下结论:
· 同一类的每个对象有不同的成员变量存储空间。
· 同一类的每个对象共享该类的方法。
「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。
笔记包含从浅入深的六大部分:
A-Java入门阶段
B-数据库从入门到精通
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
F-Linux和Hadoop