栈内存
Java中栈是存储方法,本地变量,引用变量的内存。栈总是LIFO。本地变量在栈中创建。
堆内存
Java中堆是存储对象,可能会存储引用变量的内存。实体变量在堆中创建。
Java内存分配
JVM分配内存:
- Heap
- Stack
- Code
- Static
内存分配是为了有效管理
code存储字节码
statck存储方法,本地变量,引用变量
heap存储对象,可能也会存储引用变量
static存储静态数据、静态方法
本地变量与实体变量的区别
实体变量声明在类中,但不在方法中
class Student{
int num; // num is instance variable
public void showData{}
本地方法声明在方法中,也包含方法参数
public void sum(int a){
int x = int a + 3;
// a , x are local variables;
}
栈与堆的区别
加入你的main方法调用m1
public void m1{
int x=20
}
在Java的栈中,一个frame会被创建
在m1中的x变量也会再m1的frame中创建
方法m1调用方法m2,在Java栈中,一个新的frame创建
变量b,c也会在新的frame中创建
public void m2(int b){
boolean c;
}
方法m2调用方法m3,一个新的frame会在Java栈中创建
假如方法m3创建一个Account对象,它有两个实体变量p和q。
Account {
Int p;
Int q;
}
public void m3(){
Account ref = new Account();
// more code
}
new Account()声明会在堆中创建一个对象
一个引用变量也会在Java栈中创建
=符号将使引用变量指向堆中创建的对象
只要方法完成执行,那么控制流程会返回到调用的方法,在例子中,就会返回到m2
在Java栈中的m3方法将会清除
由于引用变量不再指向堆中的对象,垃圾回收会清除堆中的对象。
只要方法m2完成执行,也将从栈中移除,它相关的所有变量也会移除,不会再被使用。
最终方法m1也会移除,控制流程会返回到程序的起点,就是main方法。
如果对象中有对其他对象做引用。
public static void main(String args[]) {
A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
这种情况下,引用变量child会创建在堆中,它指向对象。