面向对象的内存分析
java虚拟机的内存可以分为三个区域:
栈(stack)、堆(heap)、方法区(method area)
栈的特点如下:
1、栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
(核心作用)
2、JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3、栈属于线程私有,不能实现线程间的共享!
4、栈的存储特性是“先进后出,后进先出”
5、栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆的特点如下:
1、堆用于存储创建好的对象和数组(数组也是对象)(new的时候,是在堆里创建好了对象)
2、JVM只有一个堆,被所有线程共享
3、堆是一个不连续的内存空间,分配灵活、速度慢!
方法区(又叫静态区),特点如下:
1、JVM只有一个方法区,被所有线程共享!
2、方法区实际也是堆,只是用于存储类、常量相关的信息!
3、用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
如:
1、调用虚拟机执行这个类,程序从main方法开始执行,首先在堆中的方法区中加载类的相关信息;
类的相关信息包括:
1、代码
2、静态变量
3、静态方法
4、字符串常量
…等等
2、运行主方法,在栈中建立一个main方法的栈帧,类型为S的局部变量s,目前为空;
3、主方法运行,需要new一个对象,调用了类的构造器方法S(),因此建立了新的栈帧(构造器方法的栈帧);
4、通过执行构造器方法,在堆中创建了这个S类的对象;
5、构造器执行完毕,在堆中新创建好了对象,栈中的构造器栈帧关闭销毁;
(现在在堆中新建的对象属性为默认值,数值为0,引用的数据类型为null,还有相关的方法)
6、通过执行赋值符号,把建好的对象给变量s;
建好的每个对象都有地址,(堆中有很多内存块,建好的、每一个内存块都有一个地址),如:
S s = new S(); //创建一个对象
System.out.println(s); //可在控制台打印对象s,可知堆中内存块的地址,每次都不一样
即,把新建的内存地址通过赋值符号赋给对象s,就把栈中的类型为S的局部变量s与堆中新建的内存块相关联起来,因此对象s可根据内存地址找到属于自己的信息,我们也因此可以打点调用
注:绝大多数语言底层都类型,掌握了内存分析,对理解程序的运行和学习其他语言有很大帮助
内存执行完一个都会删除一个