首页 > 系统相关 >Java对象引用和内存管理的细节

Java对象引用和内存管理的细节

时间:2024-02-19 10:44:40浏览次数:25  
标签:Java 对象 config init servletConfig 细节 内存 ServletConfig 引用

在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁。对象的销毁是由Java的垃圾回收器(Garbage Collector, GC)来管理的。在Java中,局部变量(如方法参数)通常存储在栈内存(Stack Memory)中,而对象实例(如ServletConfig对象)则存储在堆内存(Heap Memory)中。

init(ServletConfig config)方法中,config是一个局部变量,它持有一个对ServletConfig对象的引用。当init方法执行完毕后,config这个引用确实不再存在,但是ServletConfig对象本身并不会被销毁,除非它不再被任何引用所指向,并且垃圾回收器决定回收它所占用的内存。

当我们在init方法中将config赋值给类的成员变量this.servletConfig时,ServletConfig对象的引用被复制到了成员变量中。即使init方法结束,this.servletConfig仍然持有对同一个ServletConfig对象的引用,因此该对象不会被垃圾回收器回收。

这里是一个简化的内存管理示例:

public class MyServlet extends HttpServlet {
    private ServletConfig servletConfig;

    public void init(ServletConfig config) {
        // 此时,config是一个局部变量,它持有一个对ServletConfig对象的引用
        // 这个ServletConfig对象是由Servlet容器创建的
        this.servletConfig = config; // 将config的引用复制给成员变量servletConfig
        // init方法结束,config这个引用不再存在,但是servletConfig仍然持有对ServletConfig对象的引用
    }

    public void doSomething() {
        // 在这里,我们仍然可以通过servletConfig成员变量访问ServletConfig对象
        // 即使init方法已经执行完毕,并且config引用已经不存在
    }
}

在这个例子中,即使init方法执行完毕,ServletConfig对象也不会被销毁,因为servletConfig成员变量仍然持有对它的引用。只有当servletConfig也被设为null,并且没有其他引用指向ServletConfig对象时,该对象才会变得可回收,最终由Java的垃圾回收器处理。

因此,将config参数赋值给成员变量servletConfig确实是有意义的,这样我们就可以在Servlet的整个生命周期中通过servletConfig来访问ServletConfig对象,而不用担心它会被垃圾回收器回收。

标签:Java,对象,config,init,servletConfig,细节,内存,ServletConfig,引用
From: https://www.cnblogs.com/XiaYu-Ye/p/18020581

相关文章

  • 关于java代码Runtime.getRuntime().exec()执行shell脚本中的坑
    java操作shell脚本执行docker命令  Runtime.getRuntime().exec()是不能执行特殊符号如">"、"|"等必须通过"/bin/sh""-c"处理。另外java操作docker 不能分配  dockerexec-i(不要t).另外如果不确定脚本是否执行成功,可以通过waitFor返回的int结果,如果为0脚本执行......
  • 提高Java开发生产力,我选Stream API,真香啊
    Java8引入的StreamAPI提供了一种新的数据处理方式,它以声明式、函数式的编程模型,极大地简化了对集合、数组或其他支持数据源的操作。Stream可以被看作是一系列元素的流水线。允许你高效地对大量数据执行复杂的过滤、映射、排序、聚合等操作,而无需显式地使用循环或者临时变量。St......
  • Java注解篇之@SuppressWarnings注解详解 代码编译通过且可以运行,但每行前面的“感叹号
    Java注解篇之@SuppressWarnings注解详解@SuppressWarnings作用:用于抑制编译器产生警告信息。它的注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量,但是建议注解声明在最接近警告发生的位置。去感叹号?我们经常遇到代码编译通过且可以运行,但每行前面的“感叹号”就......
  • Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
    正月初九,开工大吉!2024年,更上一层楼!写在开头其实在List的继承关系中,除了ArrayList和LinkedList之外,还有另外一个集合类stack(栈),它继承自vector,线程安全,先进后出,随着Java并发编程的发展,它在很多应用场景下被逐渐替代,成为了Java的遗落之类。不过,stack在数据结构中仍有一席之地,因此,......
  • 对于计算机内存的运行原理的认识(《程序是怎样跑起来的第4章》)
    在这一章节中,我了解到了计算机的重要组成部分“内存”的奥妙所在,书中说计算机的内存与CPU一样,都是IC电子原件的一种,在阅读过CPU和内存知识后,我认为CPU等同于一个能够处理数据的“智能内存”,因为CPU和内存都是通过引脚来传递信号,使数据写入/读出。与CPU相似,内存中的数据也是由数组......
  • 熟练使用有棱有角的内存
    内存IC中邮电源,地址信号,数据信号,控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。现在大家使用的计算机至少有512M的内存。这就相当于512000个(512MB÷1KB=512K)1KB的内存IC。当然一台计算机中不大可能放入如此多的内存IC。通常情况下计算机......
  • 熟练使用有棱有角的内存
       内存是一种名为内存IC的电子元件,它有多种形式,从外部来看基本机制都一样,其中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚,通过其指定地址进行数据读写。下图的例子是内存IC的一种——RAM:其中VCC和GND是电源,A0~A9是地址信号的引脚,D0~D7是数据信号的引脚,R......
  • 《程序是怎样跑起来的》第四章:熟练使用有棱有角的内存
    第四章深入探讨了计算机内存的奥秘。在此之前,我对内存的理解仅限于其作为数据存储的媒介,而这一章却让我看到了内存的多面性。内存,如同计算机的仓库,负责存储程序运行所需的数据和指令。但这个仓库并非毫无规则,而是有着严格的组织和结构。矢泽久雄以其独特的见解和深入浅出的方式,揭......
  • 第4章熟练使用有棱有角的内存
    内存:一种IC电子元件,常见DRAM(需要经常刷新保存数据)、SRAM(不需要刷新电路既可以保存数据),可以读取与写入,ROM(只能用来读取的内存)等形式内存物理组成:电源、地址信号、数据信号、控制信号,用来输入输出的IC引脚地址信号引脚数决定了内存能够表示的地址范围:表示地址范围=2^地址信号引脚......
  • 第四章 熟练使用有棱有角的内存 笔记
    在第四章中,我深入理解了内存的工作原理和优化使用的技巧。内存作为计算机的临时存储设备,对程序运行的效率和稳定性具有重要影响。书中详细解释了内存的管理机制,包括操作系统如何分配和回收内存空间,以及如何防止内存泄漏和溢出等问题。这些内容让我意识到,合理使用内存是提高程序性......