内存
1. 堆
-
堆中保存的内容:包含对象内的局部变量;
当没有变量引用时,GC就会自动回收对象
2.栈
-
栈帧:
每调用一个方法,jvm就会在栈中为方法创建一个空间,这个空间叫做栈帧;参数/局部变量等数据变量;
方法执行完后栈帧消失
-
成员变量在对象中,对象被回收,成员变量失效;
局部变量在方法中,方法执行完毕,局部变量失效;
3.方法区
在产生栈堆关系之前,会通过类加载器载入类文件的字节码信息,经过解析后类的信息装入方法区.类的信息包括成员变量和方法定义;
类名.class{
成员变量1;成员变量2;
方法名(){
}
}
类中的成员变量和方法定义信息只保存一份;
4.事例
-
方法调用后栈帧就会消失
public static void main(String[] args) { Double price= 12.5; test1("数学", price);//调用完test1方法之后,此栈帧消失 System.out.println(price); } public static void test(String aname,Double price) { price = price+10; }
-
此时card为同一对象
public static void main(String[] args) { Integer age = 20; Father father = new Father(age); test2("代维",father); System.out.println(father.age); } public static void test(String name,Father father) { father.age+=20; }
-
图片
5.内存溢出
-
原因:
栈堆中数据过多
-
解决方法:
建议GC加快回收(建议:不能提醒jvm不是强制)
System.gc();
-
查看内存占用情况
-
获取Runtime对象
Runtime runtime = Runtime.getRuntime();
-
获取jvm所占最大内存
runtime.maxMemory()/1024/1024+"M"
-
当前jvm所占最大内存
runtime.totalMemory()/1024/1024+"M"
-
剩余内存
runtime.freeMemory()/1024/1024+"M"
-