1 –verbose:gc
在虚拟机发生内存回收时在输出设备显示信息
1、程序计数器
程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。
多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。
2、栈
线程私有,声明周期和线程相同。
存放基本数据类型和对象的引用。
3、堆Heap
java堆是java虚拟机内存最大的一块。
java堆是被所有线程所共享的一块区域,在虚拟机创建时启动,存放对象实例。
java堆是垃圾回收器管理的主要区域,因此又被称为“GC堆”(Garbage Collection Heap)。
java堆还可以细分为新生代和老年代。
4、方法区
方法区,和java堆一样,是线程共享的一块区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码。
二、画内存图
分析下面的代码
1 public static void main(String[] args) { 2 AVGirl girl1 = new AVGirl(); 3 girl1.name = "苍老师"; 4 AVGirl.country = "日本"; 5 girl1.sayHi(); 6 7 8 AVGirl girl2 = new AVGirl(); 9 girl2.name = "波多老师"; 10 AVGirl.country = "日本213"; 11 girl2.sayHi(); 12 13 } 14 class AVGirl{ 15 String name; // 姓名 16 static String country; // 国籍 17 18 public void sayHi() { 19 System.out.println(name + "..." + country); 20 } 21 22 }
1、加载.class文件(字节码文件)到方法区
2、main方法入栈
3、创建AVGril的对象,先要加载AVGril.class
AVGril.class中 分为 静态区和非静态区
这时初始化静态变量conutry初值为null;
4、创建对象(堆区开辟空间)
5、把对象的地址赋给girl1变量保存
6、通过类名 修改 类变量的值
7、sayHi方法入栈 打印
8、sayHi方法出栈
9、main出栈
静态方法和非静态方法的区别?