单例模式内存分析

Java内存分析图解(内存分类、结合代码的内存分析、内存泄露) (一)JVM的内存分类 首先JVM的内存分为栈内存、堆内存及方法区: 栈内存: 连续的存储空间,遵循后进先出的原则 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象) 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令) 堆内存: 不连续的空间,用于存放new出的... 阅读详情

简单说明下:

当在main方法中调用test方法时,test方法会创建一个A类的实例a,同时把实例a的堆区地址放在实例a的成员变量_a中,也就是在模拟成员变量持有指向自身对象引用。

当以上步骤执行完成后,test方法结束,由于a是局部变量,保存在方法栈中,会被立即释放,不再指向A类的实例,但是我们刚刚完成了“自引用”,根据上边的理论,有引用指向A类的实例,实例便不会释放,因此上边程序的输出结果是“main方法指向完毕。。”

遗憾的是,结果并不是这样,真实的输出结果为:“main方法执行完毕。。。A被回收。。。”

为什么会这样?

单例模式创建的对象能够一直存在于内存中不被释放,并不只是由于持有一个自身的引用,本质是因为这个引用是静态,也就是说,如果成员变量是非静态的,它持有一个自身的引用,那么这个对象还是被回收。

"系统内至少保持一个对象的引用",这个引用指的是从栈区或方法区中发出的引用,也就是安全的引用

类被实例化之后,是放在堆区中的,而我们是无法直接操作堆内存的,因此需要一个引用,指向堆区的某个区域,而这个引用,必须是从栈中(或方法区中)发出的,因为我们可以直接访问栈内存,如果是从堆中发出的引用,是无意义的引用,我们根本访问不到,因此会被回收。

类的成员变量恰恰是放在堆内存中,因此由类的成员变量持有一个对象引用,这个引用是不安全的

再举个例子:如果栈区的a局部变量指向堆中的b对象,b对象的某个成员变量指向堆中的c对象。我们可以通过a访问b,再由b访问c,假如一旦a不再指向b,那么再也访问不到b,c也不可能被访问到,即便b此时仍然指向c,但都成了无法访问的对象,b、c均会被jvm自动收回。


单例模式中成员变量是静态的,它并不保存在内存中,而是在方法区中,是一块持久的内存空间,不会被自动回收,因此指向自身的引用是安全的,自身不会被回收。

到此,如果我们把第一个例子中的成员变量改成静态的,那么test方法执行结束后,A类的对象不会被回收,程序输出结果为“main方法执行完毕。。。”


Android Monitor内存泄露分析 Android Monitor是Android Studio自带的一个强大的性能分析工具,里面一共包含5个模块:Logcat、Memory、CPU、Network、GPU本文将针对Memory Monitor内存分析工具做简单的讲解使用步骤1,捕获hprof文件 首先点击initiate GC,手动调去GC。接下来点击Dump Java Heap,稍等片刻,正在生成hprof文件,该文件存放在项目里面的captures文件夹,每Dump一次将会获取一个hprof文件,该文件可以直接使用Android Stu 阅读详情

相关推荐

图解Java单例模式内存分配

1:虚拟机加载StaticDemo类,保存类型信息到方法区。   2:通过保存在方法区的字节码,虚拟机开始main方法,main方法入栈。   3:进入main方法第一条指令,Person.getInstance();首先虚拟机加载Person类到方法区,然后完成对Person类的初始化操作。   疑问来了,类变量不是保存在方法区吗?图中的私有实例对象为什么保存在堆区呢?那要来了解一下类的初始化过程了,过程如下:   (1)装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。   (2)链

如何解决单例数量太多占用内存的问题

当单例数量太多导致占用过多内存时,可以考虑以下几种方式来解决这个问题:

qq_40537587的博客 721

误区纠正:关于单例模式的内存分析

小菜近在读《Java与模式》一书时,发现关于单例模式的章节中有这样一段话:   作者想表达的大意为:为了实现某个对象能够持久在内存中,以供程序在整个运行周期都可以访问,可以让对象的某个成员变量持有一个指向自身的引用,来避免被回收。   成员变量想要被清空,需要等待对象被释放,而对象被释放需要没有引用指向它,此时成员变量恰恰指向了对象本身,这看起来很不错,形成了一个循环。   但实际上,这种说法是不准确的,容易让读者产生误解。   请看下边这段代码: package com.cnblogs.test;    public class SingletonTest {

单例对象与单例模式

1. 单例。单:唯⼀性。例:实例对象。即使⽤某个类创建的对象是程序中唯⼀的实例对象。注:通常每次使⽤alloc创建的是不同的对象。 2. 如果⼀个类只能创建⼀个对象,称为单例类。单例类可以是⼯具类, 视图类,控制器类。 3. 注意: 操作单例对象的变量存储在静态区,程序关闭后由系统⾃动回收。 单例对象存储在堆区,不释放,程序关闭后由系统⾃动回收。 变量和单例对象的⽣命周期

qq_33358062的博客 843

机器人示教器方案昆仑通态脚本实现( 三菱FX3U+昆仑通态3轴联动))

项目应用场景:最终客户需要自由的修改程序流程,如检测什么信号,多少时间,再进入下一步,轴定位轨迹可以自由修改,方便最终可以在不修改PLC程序的情况下,自由示教程序。3.指令数量可以自行添加,在内存足够的情况下,无限制,只需要在PLC框架里面写好每个指令执行的内容就可以了,不需要在程序里面重复写相同类容;4.模板有延时指令,输入指令,输出指令,伺服定位指令,焊钳控制指令,自动修磨指令,转矩模式指令,结束指令等(可自行添加);1.有类似示教器编程功能,可以任意位置插入指令,可以任意位置删除指令;

huanyuecuiyu的博客 970

海康安防平台接口调试指南:从签名生成到Vue项目集成

本文详细解析了海康安防平台接口认证规则,从签名生成到Vue项目集成的完整流程。通过核心机制解析、签名工具使用技巧及Vue项目中的优雅集成方案,帮助开发者高效完成接口调试,避免常见问题。特别适合需要将海康安防平台接口集成到Vue项目中的开发者参考。

weixin_42533120的博客 438

静态变量与单例模式对于内存的影响

静态变量与单例模式对于内存的影响   涉及到的Java内存划分知识 栈内存Stack: 存放方法中的局部变量,局部变量一旦超出作用域,会立刻从栈内存中消失。 堆内存Heap: 初始化的对象存放在堆内存当中,堆内存中的对象都有一个16进制的地址值,其中的数据都有默认值。 方法区Method Area: 存储.class相关信息,包含方法的信息。(但具体方法的执行,在栈内存中进行) 静态方法区Stat...

weixin_41429728的博客 924

省三医院新门诊大楼网络安全建设项目实施方案

为了响应国家建设数字医疗,构建医联网、医共体的号召,新门诊大楼现有计算机网络,实现各门诊室、药房、医学影像科室及后勤科室的终端数据互通。在互联网出口以三层模式部署两台防火墙,作为连接公网的出口设备;出于等保合规和自身业务安全的考虑,现需要该网络上通过网络安全设备实现安全建设。公网出口防火墙,配置攻击防御策略,防御互联网上的病毒进入内网。公网出口防火墙配置攻击防御策略,防御外网对内网的入侵行为。服务器取得边界防火墙,配置攻击防御策略,入侵防御策略。公网出口防火墙配置入侵防御策略,防御外网对内网发起的D。

m0_63645854的博客 2014

分析内存溢出问题和简单的单例模式

分析内存溢出: 线程池是长生命周期, 问:Hashmap和ThreadLocalMap处理哈希冲突的区别? 答:Hashmap使用的链表发,而ThreadLocalMap使用的是开放寻址法。 为什么要这样实现? 答:开放寻址法它的特点和使用场景是数据量比较少的情况下性能更好;而HashMap里面存储的数据通常情况下是比较多的,这个时候使用开放寻址法效率就比较低了,这个时候最好使用链式法 ...

weixin_50860928的博客 222

LSTM模型股价波动率预测(含Python代码)

源代码文件可在gzh’finance褪黑素'回复【24012203】获取。

celiaweiwei的博客 3775

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 887

知识点小结——版本调试——内存分析工具——设备调试流程——打包ipa文件——单例模式

一.版本调试 1.Debug:调试版本——程序员用——会启动更多的服务来监控错误,速度比较慢,比较耗内存 2.Release:发布版本——用户用——去掉监控服务,速度快,省内存 二.内存分析工具 1.静态分析:(Analyze)——不用运行程序都能分析 2.动态分析:(Profile)——运行程序时分析——红色代表内存泄露 三.设备调试流程 1.创建开发这证书 2.

Hyman_YH的专栏 716

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5004

减小内存的占用问题——享元模式和单例模式的对比分析

前言 接口的常用用法都有什么?策略模式复习总结的话题提起了:如何解决策略类膨胀的问题,说到 “有时候可以通过把依赖于环境Context类的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。” 换言之,可以使用享元模式来减少对象的数量,享元模式它的英文名字叫 Flyweigh 模式,翻译为羽量级(搏击比赛的术语,也就是轻量级的体现)模式,它...

diaoyanqin5061的博客 244

28-Halcon-- union_object_model_3d函数功能(用于3D模型融合)

Halcon算子union_object_model_3d是专业的3D模型融合工具,主要用于多视图拼接、部件组装和多源数据融合。该算子支持点云、网格和参数化模型输入,提供多种融合算法选择,包括基础点云拼接('points_cloud')、网格融合('mesh')和精确CAD布尔运算('cad')。工业应用涵盖逆向工程扫描拼接、汽车部件虚拟装配等场景,支持性能优化如空间分区和流式处理。算子还解决颜色属性融合、法向量保留等特殊需求,并提供拼接误差分析、拓扑验证等质量评估手段。最佳实践包含动态场景重建工作流和CA

weixin_45590420的博客 1055

从码农到生态建造者:我的一人公司运作方案

华哥·OPC 运营方案 v1.0 - 第一次迭代 🚀,搭建闭环生态系统,赋能 AI 时代的超级个体,更好的做自己,同时照亮别人。

AaronZZH 的博客 995

单例模式的设计分析(自动释放实例内存)

-----Edit by ZhuSenlin HDU 方法一:利用私有静态成员变量static Singleton m_Instance实现 1) 因为只有一个实例,所以我们不能把构造函数借口暴露给用户(否则用户可以创建很多个)。所以采用一个静态成员函数static Singleton* GetInstance();来获取实例。 2) 因为只有一个实例,我们不想让用户随便删除,所以我们需要把

wumuzi520的专栏 4705

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java设计模式精讲 Debug 方式+内存分析 第8章 单例模式

单例模式8-1 单例模式讲解8-2 单例设计模式-懒汉式及多线程Debug实战 8-1 单例模式讲解 8-2 单例设计模式-懒汉式及多线程Debug实战 懒汉式单例: public class LazySingleton { /** 懒汉模式的话,开始没有进行初始化 */ private static LazySingleton lazySi...

越努力越幸运的博客 993

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java面试题:使用单例模式与双重检查锁定实现一个线程安全的单例类;分析Java中的内存模型及内存溢出问题;利用Java并发工具包实现一个线程安全的计数器

通过以上三道面试题,我们可以全面考察候选人在Java设计模式、内存管理、多线程以及并发工具包等方面的知识和应用能力。在Java编程领域,掌握设计模式、内存管理、多线程以及并发工具包等知识点,对于应对复杂的软件开发任务至关重要。Java并发工具包提供了丰富的并发编程工具,如原子变量、锁、信号量等。本题要求分析Java内存模型,包括堆、栈、方法区等,并探讨内存溢出问题的原因和解决策略。内存溢出的原因(如堆溢出、栈溢出、方法区溢出等)。对Java内存模型的理解不深入,混淆堆和栈的概念。

码农超哥的博客 715

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

内存泄漏分析框架LeakCanary的使用与原理解析

文章目录1. 常见内存泄漏1.1 “单例模式” 造成的内存泄漏1.2 “静态实例” 造成内存泄漏1.3 “Handler” 造成的内存泄漏1.4 “线程” 造成的内存泄漏1.5 “使用WebView” 造成的内存泄漏2. LeakCanary使用与原理解析2.1 LeakCanary使用方法2.2 LeakCanary原理解析  在《Android性能优化(1):常见内存泄漏与优化(一)》和《An...

老蒋也疯狂 1万+

Android内存抖动(主要原因分析+6个优化小技巧)

循环或者频繁调用的地方!! 因为内存抖动就是 内存在被不断地回收及分配, 这种情况的话经常是 出现在 循环或者频繁调用的地方

m0_64420071的博客 1871

Android 单例模式引起的内存泄漏

一、有关内存泄漏   首先什么是内存泄漏呢?所有的对象在内存中都应该善始善终,在不需要使用的时候被回收掉,但是当回收的时候有一个正在使用的对象持有了它的引用,使得该对象留在堆内存中从而引起了内存泄漏。 二、单例模式   单例模式是在实际开发中非常常用的一个设计模式,

sinat_33150417的博客 1505
上一篇: Spring MVC 简介
下一篇: spring常见问题
M_Sugar
博客等级 码龄11年 1粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值