jvm的内存结构
1.jvm中的三块内存空间
方法区内存空间:存放代码块,存放常量和被static修饰的数据。而且我们编写出的.java文件编译生成的.class文件的内容必须放在内存中,jvm中对应的程序才能运行。
栈内存空间:栈是一种数据类型,在程序执行时,栈会分配一片空间让方法进栈,同时,方法中的局部变量也会随方法进栈。栈中方法遵循先进后出的规则,当方法被调用时,方法会压栈,而最先压栈的方法(main方法)最后弹栈,最后压栈的方法最先弹栈。弹栈后方法占用的内存空会被释放。
堆内存空间:堆也是一种数据类型,它存放所有new出来的对象,并通过this建立起与栈的联系,栈可以通过this来访问堆。
2.栈的内存图
class BirthDate {
private int day;
private int month;
private int year;
public BirthDate1(int d, int m, int y) {
day = d;
month = m;
year = y;
}
}
public class Test{
public static void main(String args[]){
int date = 9;
Test test = new Test();
test.change(date);
BirthDate d1= new BirthDate1(7,7,1970);
}
public void change(int i){
i = 1234;
}
}
注意:关于递归,能用for或者while解决尽量不要递归,因为栈空间有限,而递归会不断进栈,导致栈溢出,就算是有出口的递归也会占用大量栈空间,也可能导致危险。
3.关于堆空间的GC回收机制
1.没有引用指向的对象会被回收,finallast()方法会在对象在销毁之前最后确认一遍。引用计数法,确定是否回收的算法
2.当堆中的对象太多的话,GC仍然在工作,GC会先移除弱引用和虚引用,且GC只在堆中出现。