Java的内存机制详解(2)

1 class Person { 2 String name ; 3 int age ; 4 public void tell() { 5 System.out.println("姓名:"+name+",年龄:"+age); 6 } 7 } 8 9 public class Demo3 { 10 public static void main(String[] args) { 11 Person per1 = new Person() ; 12 Person per2 = per1 ;//-------注意-------- 13 per1.name="张三" ; 14 per1.age=30 ; 15 per2.age=33 ; 16 per1.tell(); 17 per2.tell(); 18 19 } 20 }

程序运行结果为:

从程序的运行结果可以发现,两个对象输出的内容一样,实际上所谓的引用传递,就是将一个堆内存空间的使用权交给多个栈内存空间,每个栈内存空间都可以修改堆内存空间的内容,此程序的内存分配图如下所示:

Java的内存机制详解

          图1-3 对象引用的传递内存分配

Java的内存机制详解

          图1-3 对象引用的传递内存分配(续)

注意:上述实例中对象per2没有堆内存空间,这是因为对象per2只进行声明操作,也没有进行实例化操作。只是使用new关键字,实例化以后才会有堆内存空间

 代码实例Demo4:对象引用传递2

1 class Person { 2 String name ; 3 int age ; 4 public void tell() { 5 System.out.println("姓名:"+name+",年龄:"+age); 6 } 7 } 8 9 public class Demo4 { 10 public static void main(String[] args) { 11 Person per1 = new Person() ; 12 Person per2 = new Person() ; 13 per1.name="张三" ; 14 per1.age=30 ; 15 per2.name="李四" ; 16 per2.age=33 ; 17 18 per2=per1 ;//-----注意---- 19 20 per1.tell(); 21 per2.tell(); 22 23 } 24 }

上述运行程序结果为:

从程序的输出结果可以发现跟Demo3差不多。不过内存分配发生了一些变化,具体如下所示:

Java的内存机制详解

            图1-4 (垃圾对象)的产生

注意点:

  1.Java本身提供垃圾收集机制(Garbage Collection,GC),会不定期释放不用的内存空间,只要对象不用了,就会等待GC释放空间,如上面堆内存中的name="李四";age=33。

  2.一个栈内存只能指向一个堆内存空间,如果要想指向其他堆内存空间,则必须先断开已有的指向,才能分配新的指向。

Java中常见的内存区域

在Java中主要存在4块内存空间,这些内存的名称及作用如下:

  1.栈内存空间:保存所有对象的名称。

  2.堆内存空间:保存每个对象的具体属性内容。

  3.全局数据区:保存static类型的属性值。

  4.全局代码区:保存所有的方法定义。

 完结。。。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7c7220e93bcecd4281c85f2d47729169.html