面向对象的内存分析

为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底发生了什么变化,进行剖析,让大家做到“心中有数”,通过更加形象的方式理解程序的执行方式。

老鸟建议:        

本节是为了让初学者更深入了解程序底层执行情况,为了完整的体现内存分析流程,会有些新的名词,比如:线程、Class对象。大家暂时可以不求甚解的了解,后期学了这两个概念再回头来看我们这篇内存分析,肯定收获会更大。

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

栈的特点如下

1.  栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)

2.  JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)

3.  栈属于线程私有,不能实现线程间的共享!

4.  栈的存储特性是“先进后出,后进先出”

5.  栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆的特点如下

1.  堆用于存储创建好的对象和数组(数组也是对象)

2.  JVM只有一个堆,被所有线程共享

3.  堆是一个不连续的内存空间,分配灵活,速度慢!

方法区(又叫静态区)特点如下

1.  JVM只有一个方法区,被所有线程共享!

2.  方法区实际也是堆,只是用于存储类、常量相关的信息!

3.  用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)


java全栈分为 java全栈包括什么_Java

内存分析图(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();
}

java全栈分为 java全栈包括什么_Java_02

示例3 运行效果图

java全栈分为 java全栈包括什么_方法区_03

示例3 内存分析图


内存分析图可以得出如下结论:

 ·同一类的每个对象有不同的成员变量存储空间。

· 同一类的每个对象共享该类的方法。





「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。


笔记包含从浅入深的六大部分:

A-Java入门阶段

B-数据库从入门到精通

C-手刃移动前端和Web前端

D-J2EE从了解到实战

E-Java高级框架精解

F-Linux和Hadoop