创建对象内存分析应用
小结的不是很到位,还有很多地方也迷迷糊糊的,有大神发现错误的可以私发我,谢谢!
-
栈(stack):栈中主要寄放一些基本变量(8大基本类型)、对象引用。对象是不会放置里面的。
-
堆(heap):用于存放new出来的对象(类的实例)与数组。
-
方法区(method):方法区在堆空间内,用于存放:
-
类的代码信息
-
方法和静态变量
-
常量池:字符串常量等,具有共享机制
-
-
下面通过代码和内存分析图进行分析:
public class Application {
public static void main(String[] args) {
//new 实例化一个对象
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
cat.name = "灰灰";
cat.age = 4;
cat.shout();
System.out.println(cat.name);
System.out.println(cat.age);
}
}
public class Pet {
String name;
int age;
//默认会创建一个无参构造
public void shout(){
System.out.println(this.name+"叫了一声");
}
}
- 内存分析图(简):
1.加载Application类,Application里有main()方法和常量池(里面存储着:旺财)。
2.执行main()方法,main()方法它是在栈中的。
3. new Pet(),会在方法区中加载一个Pet类,它会有自己的属性、字段和方法。通过这个模板生成对象(dog),会在栈中生成一个dog的引用变量名。new出来的对象会在堆中生成。它里面会带有些默认的参数比如name=null;age=o;它还有自己的shout()方法(它是调用Pet类中的方法)。
4. 对dog.name(常量池进行赋值)和dog.age(从栈中赋值)。