从内存的角度看Java引用和对象
2017-02-04 本文已影响89人
伤口不该结疤
-
0. 引言
最近在读《深入理解Java虚拟机:JVM高级特性与最佳实践》和《Java编程思想》,通过学习和了解Java内存区域的结构,可以对Java引用和对象有一个清晰的理解。
-
1. 什么是引用
-
每种编程语言都有自己操作内存中元素的方式,C和C++使用指针,而Java则使用引用
-
将引用想象为遥控器,对象想象为电视,通过遥控器(引用)可以操作电视(对象)
String s; // 只是一个引用
-
-
2. 引用和对象的关系
-
通过引用操作对象
String s = "abcd"; // 通过引用s可以操作字符串对象"abcd"
-
-
3. 引用和对象在内存中的储存位置
-
引用和基本数据类型都存放在Java 栈中的本地方法表中
-
而通过new创建的对象则是放到Java堆中
-
引用存放的是对象在Java堆的地址,通过引用可以操作对象
-
![](https://img.haomeiwen.com/i2118438/7d9fd4f466ee15ba.jpg)
-
4. 引用和对象的作用域
-
由于引用和对象的储存空间不同,导致它们的作用域也不一样
-
引用存放于栈中,当代码执行到{时,引用s入栈,执行到}时,s出栈,s生命周期结束
-
对象是储存到Java堆中,由垃圾收集器回收String对象所占内存。
-
{
String s = new String("a string")
}
/* 引用s作用域结束于}
String对象仍继续占据内存空间,最终由垃圾收集器回收String对象所占内存
*/
-
5. 基本数据类型赋值和引用赋值
-
基本数据类型进行赋值:例如,下图中b = a , 只会将a的内容复制给b,修改a的内容不会改变b的值,这是因为它们占用的是不同的物理空间
-
引用赋值:由于引用存放的是对象在Java堆中的地址,下图中str2 = str1, str1和str2指向同一个对象,因此修改str1的值会影响到str2,同理修改str2也会影响到str1。
-
![](https://img.haomeiwen.com/i2118438/f72dbffdb4691e96.jpg)
-
6. 参考
-
深入理解Java虚拟机:JVM高级特性与最佳实践
-
Java编程思想
-