从内存的角度看Java引用和对象

  • 0. 引言

    最近在读《深入理解Java虚拟机:JVM高级特性与最佳实践》和《Java编程思想》,通过学习和了解Java内存区域的结构,可以对Java引用和对象有一个清晰的理解。

  • 1. 什么是引用

    • 每种编程语言都有自己操作内存中元素的方式,C和C++使用指针,而Java则使用引用

    • 将引用想象为遥控器,对象想象为电视,通过遥控器(引用)可以操作电视(对象)

         String s; // 只是一个引用
      
  • 2. 引用和对象的关系

    • 通过引用操作对象

         String s = "abcd"; // 通过引用s可以操作字符串对象"abcd"
      
  • 3. 引用和对象在内存中的储存位置

    • 引用和基本数据类型都存放在Java 栈中的本地方法表中

    • 而通过new创建的对象则是放到Java堆中

    • 引用存放的是对象在Java堆的地址,通过引用可以操作对象

从内存的角度看Java引用和对象_第1张图片
引用和对象在内存中的储存位置
  • 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。

从内存的角度看Java引用和对象_第2张图片
基本数据类型赋值和引用赋值
  • 6. 参考

    • 深入理解Java虚拟机:JVM高级特性与最佳实践

    • Java编程思想

你可能感兴趣的:(从内存的角度看Java引用和对象)