zoukankan      html  css  js  c++  java
  • jvm内存分析法(马士兵)

    1.  局部变量和成员变量的重要区别
    局部变量没有初始化就打印时,会报错。
    而成员变量,我们不用初始化,java会自动对它初始化。
    当变量是引用的时候,java会赋给它null。

    2.  基本类型:在栈中占一块内存。
    引用类型:占两块内存,一块在栈,一块在堆。
    在栈中的key是这个变量的名字,value值就是它在堆中的地址。

    3.  类是静态的概念,它放在代码区。
    对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量),
    而方法只有一份,执行的时候才占内存(其余它就是放在代码区中)。
    堆内存:是在程序运行时动态分配的。
    同一类的每个对象有不同的成员变量存储空间。
    同一类的每个对象共享该类的方法。 4.  code,data,stack,heap
    局部变量分配在stack.
    代码都是放在code segment里面。一旦找到main方法开始执行,其他开始起作用。

    5.  写new的时候,就是调用的构造方法。
    在写Pserson tom = new Pserson(1,25);的时候:
    在栈中开辟了一块新内存,名字是tom,值是一个地址。
    同时在堆中开辟了一块内存,里面有1和25两个数据。
    但注意:在栈中的内存里的值不是堆中的地址,而是另一个地址。jvm通过这个地址可以找到堆中的相应对象。

    当方法调用结束时,栈内存中的局部变量就没有了。而堆中的,是等垃圾回收机制将其回收。
    系统添加构造方法,只是在自己没有写任何构造方法时才会加。

    6.  基础类型变量:就一处内存。
    int date = 9;  //则在栈中有一块内存,叫date,值是9.

    7.  public static void main(String[] args){
      int date = 9;
      Test test = new Test();
      test.change1(date);
     }

      public void change1(int i){
        i = 1234;
      }

    在内存中,先开辟一个局部变量,名字是date,值是9.
    当执行到test.change1(date)的时候,在栈中开辟另一块内存。
    名字是i,然后把date的值赋给i.当执行完change1之后,i所在内存消失。

    8.  public static void main(String[] args){
      Test test = new Test();
      BirthDate d1 = new BirthDate(1,1,2000);
      test.change2(d1);
      test.change3(d1);
       }

    public void change2(BithdayDate b){
      b = new BirthDate(22,2,2004);
    }

    public void change3(BithdayDate b){
      b.setDay(22);
    }

    执行change2的时候,在栈中新建个变量b,它里面的值就是栈中d1的值的复制。
    然后执行b = new BithDate(22,2,2004)的时候,在堆中新开辟一块给BirthDate的内存。
    然后在栈中,把b的值改成新的对应的地址。方法结束时,栈中的b被清除。堆中的BirthDate的对象等待垃圾回收机制把它收回去。

    执行change3的时候,在栈中新建个变量b,它里面的值就是栈中d1的值的复制。
    然后执行b.setDay(22)的时候,在栈中开辟个新内存,名字是d,值是22。然后,由于setDay(d){day = d; },则把d的值,复制给test对象的day属性当中。方法结束,栈中的d被回收。

    9. double getDistance(Point p){
      return p.x + p.y + p.z;
       }

    public static void main(String[] args){
         Point p = new Point(1,2,3);
         Point p1= new Point(0,0,0);
         System.out.println(p.getDistance(p1));
         p.sexX(5.0);
         System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));

    }

    主要是对最后一句话的内存分析:
    首先,实例了一个Point对象,三个属性都是1.0.则它会在堆中开辟出这样一块内存。调用了getDistance方法,有个参数p,则会在栈中开辟个新的内存,name是p,而value就指向了堆中新开辟的内存。

    将结果输出之后,栈中的p消失。

     
  • 相关阅读:
    弹出框位置设置
    Spring Boot 发布 jar 包转为 war 包秘籍
    Oracle 动态sql小例子
    [转]ORACLE EXECUTE IMMEDIATE 小结
    [转]Java web 开发 获取用户ip
    SQLServer2008 使用sql语句访问excel数据
    Oracle 循环调用存储过程
    JavaScript 判断手机端操作系统(Andorid/IOS)
    Oracle 当输入参数允许为空时
    Oracle 生成数据字典
  • 原文地址:https://www.cnblogs.com/min-yu/p/13410575.html
Copyright © 2011-2022 走看看