java虚拟机内存分为:栈(stack),堆(heap),方法区(method area),其实方法区也在堆里边
栈的特点如下:
- 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等)
- JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)
- 栈属于线程私有,不能实现线程间的共享!
- 栈的存储特性是“先进后出,后进先出”(比如方法的嵌套调用,A方法里边调用B方法,那么A就会先创建一个栈帧,分配内存,然后是B,执行的时候先执行B,回收B,再执行A,回收A)
- 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
- 方法执行完之后会自动删除分配的栈帧!
堆的特点如下: - 堆用于存储创建好的对象和数组(数组也是对象);
- JVM只有一个堆,被所有的线程共享
- 堆是一个不连续的内存空间,分配灵活,速度慢!
方法区的特点如下: - JVM只有一个方法区,被所有线程共享!虚拟机启动时加载类信息!
- 方法区实际也是堆,只是用于存储类,常量相关的信息!
- 用来存储程序中永远不变或唯一的内容(类信息,class对象,静态变量,字符串常量等)
主要的说明可以参考下边的图片:
this关键字为何不能用于静态方法中:
拿图纸和汽车来说,你要造成汽车肯定需要图纸,但是你有图纸,却不一定会有汽车,图纸相当于是类信息,汽车就是对象
image.png