Java中堆栈
文章目录
- Java中堆栈
- 1. 栈(Stack)
- 特点
- 示例
- 2. 堆(Heap)
- 特点
- 示例
- 3. 核心区别
- 4. 常见问题
- 5. 内存可视化示例
- 内存布局示意图:
- 总结
Java中堆栈
在 Java 中,“堆栈” 通常指的是堆(Heap)**和**栈(Stack),它们是内存中的两个重要区域,用于存储不同类型的数据。以下是它们的核心概念和区别:
1. 栈(Stack)
特点
- 线程私有:每个线程都有自己的栈,随线程创建而分配,线程结束时销毁。
- 后进先出(LIFO):方法调用时,会在栈中创建栈帧(Stack Frame),方法执行完毕后栈帧弹出。
- 存储内容:
- 局部变量:方法内定义的基本数据类型(如
int
、boolean
)和引用变量(对象的内存地址)。 - 方法调用信息:包括返回地址、参数值等。
- 局部变量:方法内定义的基本数据类型(如
- 内存管理:由 JVM 自动管理,速度快,空间连续。
- 异常:如果栈深度超过限制(如递归过深),会抛出
StackOverflowError
。
示例
public class StackExample {public static void main(String[] args) {int a = 10; // 基本类型变量a存储在栈中Object obj = new Object(); // 引用变量obj存储在栈中,指向堆中的Object实例method(obj, a); // 方法调用时,参数值压入栈}private static void method(Object param, int value) {String str = "hello"; // 局部变量str存储在栈中// ...}
}
2. 堆(Heap)
特点
- 全局共享:所有线程共享同一个堆,用于存储对象实例和数组。
- 动态分配:对象创建时在堆中分配内存,由垃圾回收器(GC)自动回收不再使用的对象。
- 存储内容:
- 对象实例:通过
new
创建的对象(如new Object()
)。 - 数组:无论基本类型数组还是对象数组。
- 对象实例:通过
- 内存管理:由 GC 负责回收垃圾对象,可能导致内存碎片和性能开销。
- 异常:如果堆空间不足,会抛出
OutOfMemoryError
。
示例
public class HeapExample {public static void main(String[] args) {// 以下对象实例存储在堆中Person person = new Person("Alice", 25);int[] array = new int[10];// person和array的引用变量存储在栈中,指向堆中的对象}
}class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}
}
3. 核心区别
对比项 | 栈(Stack) | 堆(Heap) |
---|---|---|
内存分配 | 线程私有,空间连续 | 全局共享,空间不连续 |
存储内容 | 局部变量、方法调用信息 | 对象实例、数组 |
生命周期 | 随线程创建和销毁 | 随应用启动和关闭 |
访问效率 | 快 | 慢(需通过引用间接访问) |
内存管理 | 自动分配和回收(栈帧弹出) | 由 GC 动态回收 |
异常类型 | StackOverflowError | OutOfMemoryError |
4. 常见问题
-
栈溢出(StackOverflowError):递归过深、方法调用链过长。
public void recursiveMethod() {recursiveMethod(); // 无限递归导致栈溢出 }
-
堆溢出(OutOfMemoryError):创建过多对象,GC 无法及时回收。
List<Object> list = new ArrayList<>(); while (true) {list.add(new Object()); // 不断创建对象导致堆溢出 }
5. 内存可视化示例
假设执行以下代码:
public class MemoryExample {public static void main(String[] args) {int x = 10;User user = new User("Bob");process(user);}public static void process(User u) {u.setName("Alice");}
}class User {private String name;public User(String name) { this.name = name; }public void setName(String name) { this.name = name; }
}
内存布局示意图:
栈内存(Stack) 堆内存(Heap)
┌───────────────────┐ ┌───────────────────┐
│ main() 栈帧 │ │ │
│ x: 10 │ │ User对象 │
│ user → heap@0x123│ ────────────→ │ ┌─────────────┐ │
├───────────────────┤ │ │ name: "Bob" │ │
│ process() 栈帧 │ │ └─────────────┘ │
│ u → heap@0x123 │ │ │
└───────────────────┘ └───────────────────┘
总结
- 栈负责方法执行的上下文管理,存储局部变量和调用信息。
- 堆负责存储对象实例,是垃圾回收的主要区域。
- 理解堆栈的区别有助于排查内存相关的错误(如 OOM、SOE)和优化程序性能。
相关文章:
Java中堆栈
文章目录 Java中堆栈1. 栈(Stack)特点示例 2. 堆(Heap)特点示例 3. 核心区别4. 常见问题5. 内存可视化示例内存布局示意图: 总结 Java中堆栈 在 Java 中,“堆栈” 通常指的是堆(Heap࿰…...
模块化PCB设计中联排半孔的应用
随着电子产品的快速发展,高密度、多功能和小型化已成为未来的趋势。电路板上的元件几何指数在增加,而PCB尺寸却越来越小,因此需要与支撑板做配合。如果用助焊剂将圆孔焊接到母板上,由于圆孔体积较大,会产生冷焊&#x…...
xss-lab靶场4-7关基础详解
前言: 仅作为练习,复盘 推荐html在线运行平台,弹窗标签可以在平台运行,看语句是否能正常弹窗 HTML/CSS/Javascript在线代码运行工具 | 菜鸟教程 内容: 第四关 打开一看,输入<script>alert(1)&l…...
【Linux】进程状态、优先级、切换和调度
目录 一、传统操作系统进程状态 (一)什么是状态 (二)运行状态 (三)阻塞状态 (四)挂起状态 二、Linux进程状态 (一)进程状态 (二ÿ…...
软件测试基础知识详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试 又叫 功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需…...
【WordPress博客AI内容辅助生成/优化工具箱插件下载无标题】
主要功能 AI内容生成/优化 使用AI模型生成或优化段落内容 支持撤销和模型切换 AI自动评论 智能分析文章内容生成相关评论 可配置的评论数量和随机调度 生成评论回复的概率(评论数>10时) 可能以特定概率包含表情符号 AI标签提取 从文章内容自动提取相关标签 新标签可自动生…...
js 画立方体软件开发日记2
我不懂但我大为震惊 重开几次又回去了 这说明之前的操作无效 搞了个调试当前文件 导出模块有问题,跑显示没事 启动太慢,重构吧 ----------------------------------------------- 把那些鬼相机投影代码删了就有4s了 按钮全删了,还是卡&…...
element plus el-table多选框跨页多选保留
一、基础多选配置 通过 type“selection” 开启多选列,并绑定 selection-change 事件获取选中数据 <template><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type"selection&qu…...
智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态
在智能家居设备出货量突破10亿台的2023年,家庭网关正经历着前所未有的技术革新。作为连接云端与终端设备的中枢神经,智能网关的存储芯片选择直接决定着整个智能生态系统的运行效率。在这场技术升级浪潮中,兆易创新GD25Q127CSIG串行闪存芯片主…...
智能枪弹柜管理系统|智能枪弹柜管理系统LK-QDG-Q20型
是一种用于存放枪支弹药的智能化设备,主要应用于涉枪单位,以下将从其功能特点、系统组成、优势等维度展开介绍: 功能特点 身份识别功能:采用多种生物识别技术,如指纹识别、指静脉识别、虹膜识别、人脸识别、声纹识别等…...
bootstrap table 添加跳转到指定页的功能(仅自己可见)
Table回调方法中,添加input和button至Table下方(Table页渲染结束后执行) (input用来输入页码,button执行跳转) function ajaxRequestExtends(data){$(".page-list").append("<input idp…...
rufus+Ubuntu 18.04 镜像
参考:https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网: https://rufus.ie/zh/ 步骤 安装U盘做好后插在主板io的USB口上,启动阶段用F2或DEL打断进bios,bios里面指定从安装U盘来启动,里面的B…...
基于事件驱动和策略模式的差异化处理方案
一、支付成功后事件驱动 1、支付成功事件 /*** 支付成功事件** author ronshi* date 2025/5/12 14:40*/ Getter Setter public class PaymentSuccessEvent extends ApplicationEvent {private static final long serialVersionUID 1L;private ProductOrderDO productOrderDO;…...
【运维】MacOS蓝牙故障排查与修复指南
在日常使用macOS系统过程中,蓝牙连接问题时有发生。无论是无法连接设备、连接不稳定还是蓝牙功能完全失效,这些问题都会严重影响我们的工作效率。本文将分享一些实用的排查方法和修复技巧,帮助你解决macOS系统上的蓝牙故障。 问题症状 常见…...
linux小主机搭建自己的nas(三)docker安装nextcloud
小主机用的TF卡,不可能把nas的数据放在卡上,所以我买了个2T的移动硬盘 1.挂载移动硬盘 查找硬盘 lsblk # 或 fdisk -l 创建挂载点 sudo mkdir -p alon_ssd 查看硬盘文件系统,文件系统类型一会儿设置挂载用 sudo blkid /dev/sda1 开机自动挂载&…...
Go语言:json 作用和语法
在 Go 语言中,JSON 字段(也称为 JSON Tag)是附加在结构体字段上的元数据,用于控制该字段在 JSON 编码(序列化)和解码(反序列化) 时的行为。它的语法是: type StructName…...
mageia系统详解
Mageia 是一个由社区驱动的 Linux 发行版,源自 Mandriva Linux(原 Mandrake Linux),以用户友好性和强大的系统工具著称。它继承了 Mandriva 的易用性传统,同时专注于稳定性和社区协作。以下从历史背景、技术架构、系统…...
六、STM32 HAL库回调机制详解:从设计原理到实战应用
STM32 HAL库回调机制详解:从设计原理到实战应用 一、回调机制的本质与设计目标 在STM32 HAL库中,回调机制是实现异步事件处理的核心设计模式。它通过弱定义函数用户重写的方式,将硬件事件(如数据传输完成、定时器溢出等…...
USB传输模式
USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...
lenis滑动插件的笔记
官网 lenis - npm 方法一:基础判断(推荐) 通过 Lenis 自带的 scroll 和 limit 属性直接判断: const lenis new Lenis()// 滚动事件监听 lenis.on(scroll, ({ scroll, limit }) > {const distanceToBottom limit - scroll…...
【网络安全】SQL注入
如果文章不足还请各位师傅批评指正! 想象一下,你经营着一家咖啡店,顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入,向后厨发送指令,比如“为顾客A准备一杯拿铁”。 然而,如果有个不怀好意的顾客…...
window server 2012安装sql server2008 r2
执行sql server2008 r2安装目录下的setup 选择运行程序而不获取帮助 然后就是让人绝望的 只能先搞这个了,F*微软,自家软件不让正常安装 打开服务器管理器->添加角色和功能->选择Web 服务(IIS)->添加.NET Framework3.5 然…...
uni-app学习笔记五--vue3插值表达式的使用
vue3快速上手导航:简介 | Vue.js 模板语法 插值表达式 最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法 (即双大括号): <span>Message: {{ msg }}</span> 双大括号标签会被替换为相应组件实例中 msg 属性的值。同…...
RuoYi 中使用 PageUtils.startPage() 实现分页查询的完整解析
文章目录 一、PageHelper 简介与基本用法使用方式如下: 二、Mapper 接口返回类型对分页的影响1. 返回 Page<T> 类型(推荐)2. 返回 List<T> 类型(不推荐) 三、解析RuoYi 是如何使用 PageUtils.startPage()1…...
【番外】02:Windows 编译带 DNN_CUDA 功能的 OpenCV 动态链接库
文章目录 1. 环境准备2. 兼容性说明3. 算力查询4. 编译步骤5. 网盘资料 提示: 如果读者因网络环境受限,无法正常下载与本文相关的软件安装包、压缩包,以及编译时的依赖文件,可以从文章最后提供的网盘链接下载资源。 1. 环境准备 …...
Java详解LeetCode 热题 100(14):LeetCode 56. 合并区间(Merge Intervals)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序 一次遍历法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:双指针法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 与解法一的比较 5. 解法三:TreeMa…...
回答 | 图形数据库neo4j社区版可以应用小型企业嘛?
刚在知乎上看到了一个提问,挺有意思,于是乎,贴到这里再简聊一二。 转自知乎提问 当然可以,不过成本问题不容小觑。另外还有性能上的考量。 就在最近,米国国家航空航天局——NASA因为人力成本问题,摒弃了使…...
2024年北理工Python123第六章测验题整理
测验题一般不会太难,但是这次的题目,未免太多了,有的还很难 一、选择题 二、编程题 1-10 列表和字符串 1-10都是和列表、字符串有关的题目,都很简单,我直接给出代码了 1.列表排序输出 import random random.seed(int(input()…...
常用的设计模式详解
常用的设计模式详解 在后端开发中,设计模式是提升代码可维护性、扩展性和灵活性的关键工具。通过合理应用设计模式,开发者能够高效解决复杂问题并优化系统架构。本文将结合实际案例,深入探讨后端开发中常用的设计模式及其核心应用场景。 一、…...
OFCMS代码审计-freemaker注入sql注入xxexss文件上传
环境搭建 下载地址:https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入(freemaker) FreeMarker模板注入实现远程命令执行 - Eleven_Liu - 博客园 在admin中找到这个 发现请求的是这个 找到他 <#assign value"f…...
python与nodejs哪个性能高
在一般的Web开发和高并发场景中,Node.js的性能通常优于Python,特别是在处理大量异步任务和实时应用时更具优势;而在数据分析、机器学习及计算密集型任务中,Python则表现出更高的性能优势。 Node.js以事件驱动的非阻塞I/O模型著称&…...
云平台管理部署知识点——问题+答案
1、在k8s 中定义副本数量的关键字是那个?处于那个模块下? 关键字:replicas 模块:spec下 2、在k8s中,有状态应用和无状态应用的区别?创建有状态和无状态应用分别使用哪种资源对象类型? &#…...
数据结构(六)——树和二叉树
一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合 树具有以下特点: (1)每个结点具有0个或多个子结点 (2)每个子结点只有一个父结点 ÿ…...
基于构件的开发方法与传统开发方法的区别
在软件开发领域,基于构件的开发方法和传统开发方法有着截然不同的特点与应用效果,这些差异显著影响着项目的实施过程与最终成果。下面,我们将从多个关键维度展开对比分析。 一、开发模式:线性搭建与模块组装 传统开发方法遵循线性的、自顶向下的流程,就像搭建一座高楼…...
cursor对话关键词技巧
提示词基本结构与原则 一个好的 Cursor 提示词通常包含三个部分:目标说明 上下文信息 具体要求。 例如: 创建一个React登录组件,使用Tailwind CSS样式,需要包含邮箱验证功能和记住密码选项。 效果演示: 提示词的的…...
克隆虚拟机组成集群
一、克隆虚拟机 1. 准备基础虚拟机 确保基础虚拟机已安装好操作系统(如 Ubuntu)、Java 和 Hadoop。关闭防火墙并禁用 SELinux(如适用): bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…...
添加购物车-02.代码开发
一.代码开发 购物车属于用户端功能,因此要在user下创建controller代码。 Controller层 package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO; import com.sky.entity.ShoppingCart; import com.sky.result.Result; import com.sky.service.Shopp…...
2094. 找出 3 位偶数
from typing import Listclass Solution:def findEvenNumbers(self, digits: List[int]) -> List[int]:# 统计 digits 中每个数字(0-9)的出现次数。cnt [0] * 10for d in digits:cnt[d] 1ans []# i0 百位,i1 十位,i2 个位&a…...
外出充电不发愁,倍思便携式移动电源成出行新宠
电子设备已深度融入现代快节奏生活,成为出行必备。但随之而来的电量焦虑,却始终困扰着人们。无论是出差远行、户外探索,还是每日通勤,如何随时为设备充电,成了亟待解决的难题。倍思极客充伸缩数据线充电宝应运而生&…...
防火墙安全策略基础配置
拓朴图 设备基础配置 # AR1 路由器配置 [Huawei]interface GigabitEthernet0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 1.1.1.2 255.255.255.0 [Huawei]ip route-static 192.168.1.0 255.255.255.0 1.1.1.1# FW1 防火墙配置 [USG6000V1]sysname FW1 [FW1]interface Gigab…...
系统架构-通信系统架构设计
通信网络系统架构 局域网 单一机构所拥有的专用计算机网络 局域网从早期只提供二层交换功能的简单网络发展到现在,还提供三层路由功能的复杂网络 局域网的典型架构风格: 单核心架构:由一台核心二层或三层交换设备充当网络的核心设备&…...
2.3 定积分
一、数学定义与核心公式 核心思想: 定积分是通过无限细分区间、累加微小矩形面积来逼近曲边图形面积的数学工具。其本质是极限过程下的误差控制与动态平衡。 公式与符号解析: 表达式:定积分写作 ∫ₐᵇ f(x)dx,表示在区间 [a, …...
TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
8.1——ICMPv4和ICMPv6 Internet控制报文协议 IP 协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包。此外,IP 没有提供直接的方式来获取诊断信息(例如,哪些路由器在沿途中被使用了或使用一种方法来估计往返时间…...
ik 分词器 设置自定义词典
进入 ES 的安装目录,进入 /elasticsearch-8.10.0/plugins/ik/config/ 文件夹目录,打开 IKAnalyzer.cfg.xml 文件进行配置。 一、添加 自定义扩展词典 扩展词:就是不想哪些词分开,让他们成为一个词,比如“蒙的全是对…...
RabbitMQ 工作模式
RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…...
sqlmap使用入门
sqlmap加速了sql注入的发展,需要掌握6点,其一是--dbs获得数据库名称,其二是-D 数据库名称 --tables 获得数据库中的所有表名,其三是-D 数据库名 -T 表名 -C 字段1,字段2 --dump 获得数据库中的表中的字段的值,其四是-r…...
C++23 中的 views::stride:让范围操作更灵活
文章目录 什么是 views::stride语法与用法参数与返回值实现细节适用场景编译器支持总结 什么是 views::stride views::stride 是 C23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素,从而生成一个新的范围视图。具体来说,给定一个范围…...
OSI 7层模型
OSI 7层模型: 1、物理层(光纤等把电脑连接起来的物理手段) 2、数据链路层(以太网,确认0和1电信号的分组方式,负责MAC地址,MAC地址用于在网络中唯一标示一个网卡,相当于网卡的身份证…...
向量组的维度是单个向量中元素的个数
在线性代数中,向量组的维数通常指的是单个向量中元素的个数,即每个向量的维度(dimension)。例如,一个由三维几何向量(如 ( x , y , z ) (x, y, z) (x,y,z))组成的向量组,其维数是3&…...
VM中 ubuntu 网卡不显示
1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…...