java虚拟机内存

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出栈

 

静态方法和非静态方法的区别?

非静态方法:

1.可以使用静态变量 和 非静态变量
2.可以使用静态方法 和 非静态方法

静态方法:

1.只能使用静态变量
2.只能使用静态方法

 

posted @ 2019-01-12 18:33  林木声  阅读(232)  评论(0编辑  收藏  举报