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 ...
随机推荐
- 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...
- 分页sql大全
一.排除Top分页法(自命名,非规范) 思想:所谓"排除Top分页",主要依靠"排除"和Top这个两大核心步骤.首先查询当前页码之前的数据,然后将该数据从总数据 ...
- 从源码中解析fabric区块数据结构(一)
从源码中解析fabric区块数据结构(一) 前言 最近打算基于fabric-sdk-go实现hyperledger fabric浏览器,其中最重要的一步就是解析fabric的上链区块.虽说fabric ...
- vim 从嫌弃到依赖(17)——查找模式
最开始介绍vim的时候,提到vim有普通模式.插入模式.可视模式和命令行模式,并且已经对这几个模式做了详细的介绍了.除了这几个模式以外,vim还有一个非常强大的模式--查找模式,为什么最开始没有将其列 ...
- 1.2 w字+!Java IO 基础知识系统总结 | JavaGuide
首发于:JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) 原文地址:https://javaguide.cn/java/io/io-basis.h ...
- 环境调试bug【二】无法加载源“<string>”: Source unavailable
1.无法加载源"<string>": Source unavailable. 网上解决方法: 总结来说就两种: debugStdLib: true 添加到 launch ...
- CE修改器入门:寻找指针基址
上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针,在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不 ...
- 捉虫日记:使用OpenGL加载模型 (2023/12/11)
前天晚上,花了一个小时解决了编译Assimp时的报错问题,顺便写了篇随笔.今天继续OpenGL的学习,不出意料地再次踩坑,好在最后都解决了. 今天主要学习使用Assimp加载模型,原理很简单: ...
- Winows11-hosts文件无法修改保存
Win11系统hosts文件无法修改保存 新近使用win11新电脑修改hosts,添加IP和主机名映射,保存时提示host无法修改. 解决办法: 1.将hosts文件的权限"只读" ...
- HWS山大专区PWN双一血 & CRYPTO-WP
2023.11.18 两天半的比赛,就打了半天(因为要赶去打香山杯决赛了),不过结果还算好,人生第一次拿了两个一血hhh.写wp的时候人在中大南校北门的酒店里:) controller 格式化字符串泄 ...