在此借用网上的一张图来说明内存加载过程:
首先说一下这几个内存区的意思:
栈:是存放局部变量的
堆:是存放对象的
方法区:是存放类的字节码的
当你敲下java StaticDemo2的时候,StaticDemo2字节码已经进入了内存,放置在方法区中,方法区中分为静态区和非静态区,非静态区都有一个this所属,而静态区没有,都是被共享的其中有静态main方法和非静态方法即构造方法,其中静态方法有专门的位置,这个时候虚拟机便会自动调用StaticDemo2的main方法,main方法便进栈了,此时在栈中的main方法什么都没有,当执行Person.method()时,Person类便被加载,如上图我们便可以看到Person中的非静态方法和静态方法存放在方法区中,其中静态变量country也被存放到了静态方法区,当执行Person.method的时候,method方法会进栈,但是里面并没有任何变量,因为他里面都是静态的,他直接在方法区中找到类Person,再去找他的成员变量country,最后输出。然后method便会弹栈,(每一个方法都会有return,除了构造方法),接着出现一个局部变量p,放在了main方法中,接着new Person,便会在堆中开辟一个空间,name=null,age=0,然后起相对应的构造函数就进栈了,person(String name ,int age),里面会有一个this,name和age变量,执行他的构造方法,赋完值之后构造方法就会弹栈,然后执行P.show(),show方法进栈,里面有this,其值为在堆开辟的地址,拿着this去找相应的name 和 age,随后show方法弹栈,最后main方法弹栈,而堆里面的东西是靠垃圾回收机制来回收