图解Java单例模式内存分配

STM32 FDCAN热插拔恢复机制与自动重发功能优化 本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。 阅读详情


1:虚拟机加载StaticDemo类,保存类型信息到方法区。

2:通过保存在方法区的字节码,虚拟机开始main方法,main方法入栈。

3:进入main方法第一条指令, Person.getInstance(); 首先虚拟机加载Person类到方法区,然后完成对Person类的初始化操作。
疑问来了,类变量不是保存在方法区吗?图中的私有实例对象为什么保存在堆区呢?那就要来了解一下类的初始化过程了,过程如下:
1:装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。
2:链接,
	分为检测(确保被导入类型的正确性。),
	准备(为类变量分配内存,并将其初始化为默认值),
	解析(把类型中的符号引用转换成直接引用)三步。
3:初始化,把类变量(static)初始化为正确初始值。
	类变量的初始化(有赋值操作),无论是基本数据类型还是引用数据类型,类变量的初始化都会被提取到clinit方法中。
	常量的初始化,对于基本数据类型来说,会直接被编译器生成constant值。而对于引用数据类型常量的初始化会被提取到clinit方法中。
步骤3初始化是把类变量初始化为正确初始值,我们现在初始化的是实例对象,只要是new操作,都会在堆区分配空间。

4:调用getInstance()方法,方法返回实例对象的引用,getInstance()方法执行完毕出栈,程序回到main方法。

5:调用say()方法,根据引用变量p持有的引用,在堆中找到实例对象,根据实例对象持有的本来在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈,开始执行其中的字节码。

6:say()方法执行完毕出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡。虚拟机实例消亡。程序结束。

总结:单例模式的实现,new操作依旧是在堆中为实例对象分配空间,然后在方法区保存共享实例引用。为什么说静态变量(类变量)的生命周期跟类一样呢?
这是因为实例对象的引用在方法区保存,除非类被卸载了,该实例对象才不会被引用了,然后被GC回收。否则,一直都在。
引用类型变量是静态的,对象不是静态的,我们在程序传递的都是引用,永远不会直接操作对象。

原创文章,转载请注明出处: http://blog.youkuaiyun.com/thinking_in_android
工业缺陷检测的新范式:2025-2026年零样本检测技术全景扫描 摘要: 工业视觉领域面临缺陷样本稀缺、标注成本高等痛点,零样本缺陷检测(Zero-Shot Defect Detection)成为研究热点。2025-2026年的技术进展主要分为三类:1)视觉-语言模型(VLM)路线,如CLIP适配器跨域对齐热成像数据;2)数字孪生路线,通过CAD模型生成理想状态对比检测缺陷;3)基于CLIP的提示学习,如Crane模型通过上下文提示提升泛化能力。尽管实验室效果显著(如IoU达70%),但在真实工业场景(如MIRAD数据集)中性能平均下降29.78%,凸显跨域泛化仍是挑战。 阅读详情

相关推荐

电涡流位移测量技术深度解密

电涡流位移传感器凭借非接触测量、高精度(可达纳米级)、强环境适应性(耐高温高压油污)等优势,成为工业精密位移检测的核心技术。其工作原理基于电磁感应:高频磁场在金属靶面感应涡流,通过检测线圈阻抗变化转化为位移信号。应用需注意靶材依赖性(需按实际材料标定)、安装精度及抗干扰措施。广泛应用于磁悬浮轴承、航空发动机、精密制造等领域,实现对微米级位移的可靠监测。

技术工作者 1752

单例对象与单例模式

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

qq_33358062的博客 842

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 365

Java的内存分配

首先,main方法会先进入栈里面,然后再执行student的这个实例化,student这个对象就被创建,创建后会被加载到栈里面,在栈里面student这个对象就会去找堆中new的Student类型,然后堆会给student的属性一个默认的值,name是null,不同的类型默认值不同,然后用户自定义再给name赋值,name的值就可以输出了,执行完这个程序,这个student就会出栈,然后main方法也出栈了。注意:每一个new出来的东西都有一个地址值,使用完毕,会在垃圾站回收器空间时被回收。

m0_71461928的博客 3335

PCB测试点

PCB测试点

qq_31444421的博客 1万+

B站DRM视频解密流程实战解析:从密钥获取到播放全流程

本文详细解析了B站DRM视频的解密全流程,从识别加密视频、捕获关键网络请求(如playurl接口的widevine_pssh数据),到逆向分析DRM SDK的JavaScript执行逻辑,最终手动模拟EME流程获取解密密钥,并使用mp4decrypt和ffmpeg工具完成视频文件的解密与合并。文章为开发者提供了从密钥获取到播放的完整实战指南。

weixin_29290379的博客 838

字节面试杂谈——JVM

一、JVM的主要组成部分及其作用 二、运行时数据区/运行时内存区域 三、堆、栈 四、JAVA对象大小的计算 五、对象的访问定位的两种方式 六、判断垃圾可以回收的方法/如何判断对象是否死亡 七、垃圾回收从哪里开始 八、被标记为垃圾的对象一定会被回收吗 九、JAVA中四种引用类型 十、内存泄漏、内存溢出 十一、常用的垃圾收集算法 十二、分代收集算法 十三、浮动垃圾 十四、内存碎片 十五、常用的垃圾收集器 十六、CMS

shintyan的博客 799

WPF数据可视化:LiveCharts自定义X轴与Y轴的5个实战技巧(附完整代码)

本文详细介绍了在WPF应用中使用LiveCharts进行数据可视化时,自定义X轴与Y轴的5个核心实战技巧。内容涵盖精确控制刻度步距、深度定制视觉样式、实现多轴布局对比、优化显示空间以及构建响应式动态轴,并提供了完整的C#和XAML代码示例,帮助开发者创建专业且用户体验出色的图表。

moss5的博客 690

JVM--Java对象到底存在哪?

Java对象存放在堆中,但堆又分为新生代和老年代,新生代又细分为 Eden、From Survivor、To Survivor。?堆分为新生代和老年代,新生代用于存放使用后就要被回收的对象(朝生夕死),老年代用于存放生命周期比较长的对象。我们创建的大部分对象,都属于生命周期较短的对象,所以会存放在新生代。新生代又细分 Eden、From Survivor、To Survivor,那我们创建的对象会优先在 Eden 区分配,见下图。

m0_73173239的博客 1462

从零到一:Bioconductor新手入门与R包安装实战

本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。

weixin_29061041的博客 418

8、水力压裂引起的地质材料力学性质变化的可视化研究

本研究探讨了水力压裂引起的地质材料力学性质变化的可视化方法。利用超声剪切波形数据,通过短时傅里叶变换(STFT)和主成分分析(PCA)进行特征提取和降维,并应用K-means聚类、凝聚聚类和DBSCAN等无监督学习方法对地质力学变化进行非侵入式可视化分析。研究比较了不同特征工程、聚类方法和降维策略对可视化效果的影响,并结合位移不连续性理论为聚类结果分配地质力学变化指数,以提高结果的物理解释性。最终,该方法成功实现了对水力压裂引起的岩石力学性质变化的高效、可靠可视化。

emacs5lisp的博客 109

最全面的单例模式

总结:线程安全、懒加载、效率低。 是否推荐:可以使用,但不推荐。 注:该模式还有另一种常见写法,就是把getInstance方法上的synchronized去掉,这种方法有线程安全问题,不能使用。

qq_40675750的博客 247

Python实战项目2:b站评论采集

本文不对数据采集的过程做探讨,直接上代码。

lyccomcn的博客 3198

图解Java继承内存分配

图解Java继承内存分配 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员

Thinking_IN_Java 7669

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java内存分配(堆,栈,方法区,常量池)图解

初学内存空间的分配,不足的地方还请大佬们多担待与指点

m0_57816620的博客 8857

pscad IEEE标准系统搭建说明

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

Java之内存分配(图解)

Java之内存分配(图解)

qq_63179750的博客 2505

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java内存分配图解

JAVA内存分配图解: 一个数组的内存分配图解 两个数组的内存分配图解 两个数组指向同一个地址。 package com.zws; public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; arr[0...

BullZeng的博客 1508

图解Arraylist内存分配,以及底层实现,扩容性能分析

图解Arraylist内存分配,以及底层实现,扩容性能分析 1:集合内存分配以及初始化过程图解 2:源码解读ArrayList内部实现(数组结构) 构造ArrayList的时候,默认初始化容量为10,保存容器为 Object[] elementData。 向集合添加元素的时候,调用add方法,比如list.add("a"); add方法做的操作是:elementData[

Thinking_IN_Java 7659

图解Java多态内存分配以及多态中成员方法的特点

图解Java多态内存分配以及多态中成员方法的特点 Person worker = new Worker(); 子类实例对象地址赋值给父类类型引用变量。多态的体现。 多态中成员方法的特点分析: 【子类有,父类没有】编译失败!!! worker.startWork(); 为什么编译不通过呢?提示:找不到符号。 因为引用变量worker是Person类型,在Person

XiaoChuHe_lx的专栏 7637

Java 中数组的内存分配

Java 中数组的内存分配 1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。 2、数组基本概念 数组是存储同一种数据类型多个元素的容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 格式:数据类型[] 数组名 ; int[] arr; ...

weixin_30485379的博客 521

java 数组 内存_Java 中数组的内存分配

Java 中数组的内存分配1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。2、数组基本概念数组是存储同一种数据类型多个元素的容器。数组既可以存储基本数据类型,也可以存储引用数据类型。格式:数据类型[] 数组名 ;int[] arr;数组的初始化方式:动态初始化 : 初始化时只指定数组长度,由系统为数组...

weixin_31833039的博客 2250

Java中数组的内存分配

一、JVM内存划分 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 栈: 存储局部变量 堆:...

hewenqing 885

Java中的内存分配图解

zhengzhongz的博客 223
上一篇: 类和对象的初始化
下一篇: 图解Java继承内存分配
flowciyu
博客等级 码龄15年 65粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值