Java对象引用和内存管理的细节
在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对象引用和内存管理的细节的更多相关文章
- JVM内存管理------JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- JVM内存管理之JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- 高性能JAVA开发之内存管理
这几天在找一个程序的bug,主要是java虚拟机内存溢出的问题,调研了一些java内存管理的资料,现整理如下: 一.JVM中的对象生命周期 对象的生命周期一般分为7个阶段:创建阶段,应用阶段,不可视阶 ...
- Java数组的内存管理
Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...
- Java堆外内存管理
Java堆外内存管理 1.JVM可以使用的内存分外2种:堆内存和堆外内存: 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemo ...
- 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题
利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2) 启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了 ...
- 深入java虚拟机学习 -- 内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...
- Java进阶之内存管理与垃圾回收
Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个 ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
- 深入理解JAVA虚拟机 自动内存管理机制
运行时数据区域 其中右侧三个一起的部分是每个线程一份,左侧两个是所有线程共享的. 程序计数器(Program Counter Register) 英文名称叫Program Counter Regist ...
随机推荐
- linux时间和当前时间相关8小时问题
依次执行如下的代码: 1.更改时区 cp /usr/share/zoneinfo/GMT /etc/localtime ln -sf /usr/share/zoneinfo/Asia/Shanghai ...
- OpenIM Open Source Instant Messaging Project Docker Compose Deployment Guide
The deployment of OpenIM involves multiple components and supports various methods including source ...
- 从零开始配置 vim(18)——终端模式
在进入下一个配置之前,先了解一下如何在 neovim 中使用它内置的终端. 我们之前说过在命令模式中可以使用 !来执行shell命令.但是终归来说,执行和使用上不是那么方便,特别是混合使用 vim 命 ...
- 【主流技术】15 分钟掌握 Redis 的安装部署和基本特性
目录 前言 一.Redis 概述 1.1Redis 是什么? 1.2Redis 能做什么? 1.3基础知识 二.Redis 安装与基本命令 2.1Windows 安装 方式一 方式二 2.2Linux ...
- MySQL【四】---案例实战{拆分多表、外键创建等}
1.准备数据 数据准备 create database jing_dong charset = utf8mb4; 创建一个商品goods数据表: create table goods( id int ...
- svg图片引入方式
第一种直接引入: <svg t="1684280784467" class="icon" viewBox="0 0 1024 1024" ...
- ehlib 排序后 滚动条 不对问题
针对CDS的情况,作者的代码里 好像也不知道什么原因 必须写Cds.First但是,不写的话,就是不行,去掉作者的注释就可以了.
- ehlib组件包当中TDBLookupComboboxEh的小结
TDBLookupComboboxEh和TDBGridEh一样强大无比,可以做出Combobox下拉出Grid的效果.下面是一些重要属性的小结(可怜费了我半天功夫,文档太少了.......)(1)Li ...
- Python异步编程原理篇之IO多路复用模块selector
selector 简介 selector 是一个实现了IO复用模型的python包,实现了IO多路复用模型的 select.poll 和 epoll 等函数. 它允许程序同时监听多个文件描述符(例如套 ...
- STM32的时钟控制RCC和外设定时器
STM32的RCC(Reset and Clock Control)时钟控制 stm32f103c8的时钟是72MHz, stm32f401ccu6的时钟是80M, 开发板板载两个晶振, 一个高速一个 ...