对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消失。


你可能感兴趣的:(jvm,date,string,java,null,存储)