• 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.只能使用静态方法
  • 相关阅读:
    socket的一个错误的解释SocketException以及其他几个常见异常
    lambda表达式和ef的语句转化
    多线程的异步委托初识
    跨线程访问控件的方法
    P1337 [JSOI2004]平衡点 / 吊打XXX
    P4099 [HEOI2013]SAO
    UVA10529 Dumb Bones
    P1291 [SHOI2002]百事世界杯之旅
    P2675 《瞿葩的数字游戏》T3-三角圣地
    P4363 [九省联考2018]一双木棋chess
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10260615.html
Copyright © 2020-2023  润新知