Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
什么是Java NIO?
Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java.io包)更加高效,尤其在网络编程中,例如需要处理大量连接的服务器(如WebSocket、HTTP或TCP服务器)。
Java NIO的核心组件
-
Channel(通道):类似传统IO中的流,但支持非阻塞操作,例如SocketChannel和ServerSocketChannel。
-
Buffer(缓冲区):高效的数据容器,如ByteBuffer,用于读写数据。
-
Selector(选择器):实现多路复用,允许一个线程监控多个通道的事件(如连接建立、数据可读、可写)。
-
Asynchronous Channel(异步通道)(Java 7+):如AsynchronousSocketChannel,提供真正的异步I/O支持。
Java NIO的优势
-
非阻塞I/O:一个线程可以处理多个连接,不必为每个连接分配独立线程。
-
多路复用:通过Selector,一个线程可以管理成千上万的连接,减少线程开销。
-
高效性:Buffer优化了数据传输,减少了内存拷贝。
-
适用场景:特别适合WebSocket这种需要维持大量长连接的协议。
简单来说,Java NIO通过非阻塞和多路复用技术,为高并发网络应用提供了强大的支持。
在没有NIO之前,Java如何处理类似WebSocket协议下的10万连接?
背景说明:WebSocket协议是2011年才标准化(RFC 6455),而Java NIO早在2002年就已推出。因此,在没有NIO之前(即Java 1.4之前),并不存在WebSocket协议。但我们可以假设问题是指“类似WebSocket的高并发长连接场景”,例如基于TCP的自定义协议或HTTP长轮询。
在没有NIO的情况下,Java使用的是 传统Java IO(java.io包)和 线程-per-连接(thread-per-connection) 模型来处理网络连接。
传统Java IO的特点
-
阻塞式I/O:每个连接的读写操作都是阻塞的,线程在I/O完成前无法处理其他任务。
-
线程-per-连接模型:为每个客户端连接分配一个独立线程,线程负责该连接的所有I/O操作和业务逻辑。
处理10万连接的挑战
如果要支持10万并发连接,每个连接一个线程,会遇到以下问题:
-
内存开销:每个Java线程默认栈内存约1MB(可通过-Xss调至256KB)。10万线程需要约100,000 * 256KB = 25GB的栈内存,加上JVM堆内存和缓冲区,总内存需求可能达到35-45GB。
-
CPU负担:10万线程会导致频繁的上下文切换,CPU利用率下降,延迟增加。
-
系统限制:操作系统对线程数和文件描述符有限制(如Linux默认线程数上限几千到几万,文件描述符默认1024),需要大幅调整配置。
-
性能瓶颈:线程调度和资源竞争使服务器性能随连接数增加而快速下降。
当时的解决方案
在没有NIO的情况下,开发者可能会尝试以下方法,但效果有限:
-
线程池:用固定大小的线程池处理连接,但并发数受限于线程池大小,超出的连接只能排队或被拒绝。
-
多进程:启动多个进程分担连接,但进程间通信复杂,资源利用率低。
-
手动异步:通过复杂逻辑实现伪异步,但开发难度高且不稳定。
总之,在传统Java IO下,处理10万连接极其困难,几乎不可行。
在没有NIO之前,支持10万连接需要多少硬件支持?
在传统线程-per-连接模型下,支持10万连接对硬件要求极高,以下是估算:
硬件需求分析
-
内存:
-
每个线程栈内存:假设-Xss256k,即256KB。
-
10万线程:100,000 * 256KB ≈ 25GB。
-
额外开销:JVM堆内存、连接缓冲区等,约10-20GB。
-
总内存:35-45GB。
-
-
CPU:
-
10万线程的上下文切换需要大量CPU资源。
-
假设连接活性较低,CPU利用率可能在50-80%。
-
建议配置:8-16核CPU,甚至更高。
-
-
网络带宽:
-
假设每个连接平均1KB/s(低活性),总带宽为100,000 * 1KB/s = 100MB/s ≈ 800Mbps。
-
网卡:至少1Gbps。
-
-
操作系统调整:
-
文件描述符:每个连接占用一个,需设置ulimit -n为100,000+。
-
线程上限:调整Linux的/proc/sys/kernel/threads-max。
-
具体硬件配置
-
单机:高配服务器,例如32-64核CPU,64GB+内存,1Gbps网卡。
-
多机集群:单机难以承受10万线程,需10台服务器,每台处理1万连接(每台约16GB内存、8核CPU)。
-
成本:硬件和运维成本极高,且性能不佳(延迟高、稳定性差)。
可行性
即使硬件能支持,10万线程的调度开销和内存压力会导致系统效率低下。在没有NIO的时代,Java并不适合这种超高并发场景,开发者可能会转向其他语言(如C的epoll)。
NIO的改进(补充说明)
相比之下,Java NIO通过非阻塞I/O和Selector多路复用,极大降低了资源需求:
-
线程数:只需少量线程(例如8-16个),内存降至几GB。
-
硬件:普通服务器(4-8核CPU、8-16GB内存)即可支持10万连接。
-
效率:性能提升数倍,成本大幅降低。
阿里巴巴的NIO使用
证据显示,阿里巴巴使用Netty框架(基于Java NIO)来管理数十亿连接,适合双11近1亿人同时发起请求的场景。
具体实现细节未公开,但NIO的多路复用和非阻塞特性似乎是关键。
阿里巴巴的电商平台如淘宝和天猫在双11期间需要处理数十亿请求,这需要高度可扩展的架构。Java NIO通过非阻塞I/O和选择器(Selectors)允许多个连接由少量线程管理,非常适合这种高并发场景。
技术使用
-
Java NIO的作用:NIO通过选择器监控多个通道(连接),一个线程可以处理成千上万的连接,减少线程开销。
-
Netty框架:阿里巴巴使用Netty(基于NIO)来构建高性能网络服务器,Netty支持多线程事件循环和高效内存管理,适合双11的高并发需求。
Go 协程和Netty的事件循环差异
Netty 的事件循环
Netty 是一个基于 Java NIO 的网络框架,其事件循环(Event Loop)采用 Reactor 模式。一个 EventLoop 由一个线程管理,通过选择器(Selector)监控多个连接(Channel),处理 I/O 事件(如数据可读、可写)。它特别适合高并发场景,如 WebSocket 服务器,一个线程能处理成千上万的连接。
Go 协程的事件循环
Go 的 goroutine 是轻量级并发单元,由 Go 运行时管理,事件循环是隐式的。当 goroutine 执行 I/O 操作时,如果阻塞,运行时会自动挂起该 goroutine,调度其他 goroutine 运行。Go 适合 CPU 和 I/O 混合任务,易于开发高并发网络服务。
主要区别
-
线程模型:Netty 用单线程 EventLoop 处理多个 Channel,Go 用多个 OS 线程调度 goroutine。
-
I/O 处理:Netty 使用非阻塞 I/O,Go goroutine 可阻塞,运行时自动管理。
-
适用场景:Netty 优化高并发网络,Go 适合通用并发任务。
Netty和Java虚拟线程之间的关系
研究表明,Netty 和 Java 虚拟线程在高并发网络应用中有潜在的互补关系,但目前 Netty 尚未完全支持虚拟线程。
Netty 的作用:Netty 是一个基于 Java NIO 的高性能网络框架,适合处理大量连接。
虚拟线程的优势:Java 虚拟线程(从 Java 21 开始正式支持)是轻量级线程,能简化高并发编程,减少资源消耗。
两者结合:虚拟线程可以与 Netty 一起使用,可能简化开发,但需要社区进一步支持。
Netty 是一个异步事件驱动的网络框架,擅长处理高并发场景,如 WebSocket 服务器。它使用少量线程通过事件循环管理大量连接,适合需要高性能的网络应用。
Java 虚拟线程允许创建数百万个轻量级线程,特别适合 I/O 密集型任务。当线程阻塞时,JVM 会自动挂起它,释放资源,适合高吞吐量应用。
Netty 是虚拟线程出现前的过渡产品?
研究表明,Netty 在 Java 虚拟线程出现前确实是一种过渡性解决方案,主要解决平台线程在高并发场景下的问题。
Netty 基于 Java NIO,提供非阻塞 I/O 和事件驱动模型,适合处理大量连接。
虚拟线程(从 Java 21 开始)简化了高并发编程,可能是未来更直接的解决方案,但 Netty 仍具价值。
Netty 是一个高性能网络框架,设计用于处理高并发网络任务,如 WebSocket 服务器。它通过少量线程管理大量连接,解决了平台线程资源开销大的问题。
Java 虚拟线程允许创建轻量级线程,适合高并发场景,减少了资源消耗。它们让开发者可以用阻塞式代码处理高并发,简化了开发。
在虚拟线程出现前,Netty 是处理高并发的关键工具。现在,虚拟线程可能减少对 Netty 的依赖,但 Netty 在特定场景(如复杂网络协议)仍很重要。
虚拟线程与Go协程在低配机器上处理10万连接的区别
研究表明,Go协程在低配机器上处理10万连接更具优势,主要是内存开销低和运行时高效。
Java虚拟线程也适合高并发,但JVM的开销可能在低配机器上成为瓶颈。
两者的区别在于内存使用、CPU效率和生态系统,Go更适合资源有限的场景。
内存使用
Go协程每个约2KB内存,10万连接需200MB,适合低配机器(如2GB内存)。Java虚拟线程内存开销低,但JVM可能需1.5GB以上,资源紧张时表现不如Go。
CPU和调度效率
Go的调度器用户态实现,效率高,适合低配CPU。Java虚拟线程依赖JVM,调度开销稍高,低配CPU可能受GC影响。
实际表现
测试显示Go在低配机器上处理10万连接更高效,Java虚拟线程在高端硬件上更强,但低配场景可能受限。
为什么在高端硬件上虚拟线程表现会比Go好?
CPU密集型任务:Java的即时编译器(JIT)能针对高端硬件生成高度优化的机器代码,利用多核和高级指令集(如AVX-512),提升性能。例如,科学计算中的矩阵运算可能受益于此。
复杂计算和生态系统整合:Java有成熟的库(如Apache Spark、TensorFlow),虚拟线程能高效并发执行这些库的任务,同时利用JVM的优化。
高内存分配场景:Java的高级垃圾回收(如G1、ZGC)在高端硬件上能高效处理高内存分配,适合长运行应用。
例如,在一个需要复杂计算和大量并发的科学计算应用中,虚拟线程可能比Go协程更快,因为JVM能更好地利用高端硬件的资源。
Go协程的优势
但需要注意的是,Go协程在高并发I/O任务中通常表现更优,特别是在需要快速创建大量任务时(如Web服务器)。Go的运行时更简单,内存开销低(每个Goroutine约2KB),在某些基准测试中(如处理100万任务),Go比Java虚拟线程快(4.911秒 vs. 10.73秒)。
总结
总体来说,虚拟线程在高端硬件上可能在特定CPU密集型或生态系统依赖的场景下表现更好,但Go协程在一般高并发任务中更高效。选择哪种技术取决于具体应用需求和开发者的熟悉程度。
相关文章:
Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java…...
C# 对列表中的元素的多个属性进行排序
目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中,我们经常需要 根据列表中的元素的某个属性进行排序,下面我们将简单介绍常用的排序函数。 例如此处有一个类,拥有的元素为编号和值 public …...
OpenCV颜色变换cvtColor
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV(六角锥体模型,这个模型中颜色的…...
java IO/NIO/AIO
(✪▽✪)曼波~~~~!让曼波用最可爱的赛马娘方式给你讲解吧!(⁄ ⁄•⁄ω⁄•⁄ ⁄) 🎠曼波思维导图大冲刺(先看框架再看细节哦): 📚 解释 Java 中 IO、NIO、AIO 的区别和适用场景: …...
如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系
一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…...
宜搭与金蝶互通——连接器建立
一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…...
中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是…...
1.1 设置电脑开机自动用户登录exe开机自动启动
本文介绍两个事情: 1.Windows如何开机自动登录系统(不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下: 一、Windows如何开机自动登录系统(不用输密码) 设备上的工控机,如果开机后都需要操作人员输入密码&…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
动态规划与记忆化搜索的区别与联系
记忆化搜索(Memoization)和动态规划(Dynamic Programming, DP)都是解决重叠子问题的高效算法技术,但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索(自顶向下) 本质:带有…...
html+js+clickhouse环境搭建
实验背景: 我目前有一台服务器A,和一台主机B,两台设备属于同一局域网,相互之间可以通讯。服务器A中部署着clickhouse,我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...
生命护航行动再启航!
温州好人陈飞携防溺水课堂,为乡村少年宫筑起安全防线 图文作者:华夏之音/李望 随着夏日热浪的滚滚而来,楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上,一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...
Android Compose Activity 页面跳转动画详解
下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法,包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法,适用于所有 Android 版本。 实现步骤…...
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识 在 JavaScript 开发中,**深拷贝(Deep Copy)**是一个常见需求,尤其是在处理复杂对象和嵌套数据结构时。JSON.parse(JSON.stringify(o…...
搭建用友U9Cloud ERP及UAP IDE环境
应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...
Linux 系统新磁盘分区XFS挂载
以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南: 一、确认硬盘识别 查看已识别硬盘 执行 lsblk 或 fdisk -l 命令,确认新硬盘设备标识(如 /dev/sdb)。 二、硬盘分区(可选) …...
Oracle测试题目及笔记(单选)
所有题目来自于互联网搜索 当 Oracle 服务器启动时,下列哪种文件不是必须的(D)。 A.数据文件 B.控制文件 C.日志文件 D.归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...
C语言链接数据库
目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
引言:Redis 为何如此之快?数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库,凭借其闪电般的速度和丰富的功能,在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...
告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...
前沿要塞:Vue组件安全工程的防御体系重构与技术突围
总章数字世界的钢铁长城 在某个凌晨3点的红蓝对抗演练中,某电商平台因组件级XSS漏洞导致千万级用户数据泄露。这不是虚构的灾难场景,而是2023年某A轮企业的真实遭遇。当传统安全方案在新型攻击面前节节败退时,我们需要为Vue组件铸造全新的数字…...
吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树
XGBoost 多年来,机器学习研究人员提出了许多构建决策树的方法,目前最常用的方法是对样本或决策树的实现收费。其中,XGBoost 是一种非常快速且易于使用的开源实现,已成功用于赢得许多机器学习竞赛和商业应用。 算法原理 基本思想…...
Docker部署禅道21.6开源版本
将数据库相关环境变量分开,增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化,应该确保这些信息是安全的,并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …...
《MySQL:MySQL表结构的基本操作》
创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据…...
C++解析操作mat文件方法-基于vs2019
前言 工作中需要将C#脚本转为C++,所转脚本主要功能是进行mat数据文件的解析和矩阵运算。 1.C#版本 原C#脚本主要是基于 MathNet.Numerics.data.Matlab、MathNet.Numerics.LineAlgebra.Double、 MathNet.Numerics.LineAlgebra 中的MatlabReader、DenseMatrix、Matrix进行mat文…...
OpenCV 模板匹配方法详解
文章目录 1. 什么是模板匹配?2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配? 模板匹配(Template Matching)是计算机视觉中的一种基础技术,用于在目…...
自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
常规通过小程序或APP在外出时控制本地电脑实现打印功能,可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。 但这里我们采用自已的实现方案来解决 服务器端实现 搭建一个后端socket服务,监听来自手机的打印请求。监听到打印任务后向本…...
Oracle_00000
contents 基本使用 基本使用 Oracle安装后会自动创建sys和system这两个用户。 sys用户:具有最高权限。具有sysdba角色,有create database的权限。该用户默认密码是:manager system用户:管理员用户,具有sysoper角色。没…...
深入剖析 ORM:原理、优缺点、场景及多语言框架示例
ORM 即对象关系映射(Object Relational Mapping),它是一种编程技术,其作用是在面向对象编程语言里,把对象模型和关系型数据库的数据结构之间创建起映射,这样开发者就能够使用面向对象的方式来操作数据库&am…...
ARINC818协议-持续
一、帧头帧尾 SOF 和 EOF 分别代表视频帧传输的开始与结束,它们在封装过程有多种状态,SOF 分为 SOFi 和 SOFn,EOF 分为 EOFt 和 EOFn。传输系统中的视频信息包括像素数据信 息和辅助数据信息,分别存储在有效数据中的对象 0 和对象…...
【uniapp】uni.setClipboardData 方法失效 bug 解决方案
写了一个 copy 方法,但是怎么也没有弹窗复制成功 <text click"toCopy(myInfo.id)">复制 </text> 逐步打印发现 1 正常打印,2 没有打印,说明问题出现在 setClipboardData 方法执行中 toCopy(n) {// console.log(1,ty…...
智能sc一面
智能sc一面-2025/4/17 更多完善:真实面经 Java 的异常分类 异常分为两类,一类Error,一类Execption。这两个类都是Throwable的子类,只有继承Throwable 的类才可以被throw或者catch Error: 表示严重的系统问题,通常与代码无关&am…...
SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用…...
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比 一 基本概述对比 特性DBMS_JOB (旧版)DBMS_SCHEDULER (新版)引入版本Oracle 7 (1992年)Oracle 10g R1 (2003年)当前状态已过时但仍支持推荐使用的标准设计目的基础作业调度企业级作业调度系统 二 功能特性对比 2.1 作业定义能力 …...
【音视频】音视频FLV合成实战
FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…...
10.(vue3.x+vite)div实现tooltip功能(css实现)
1:效果截图 2:代码实现 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;...
代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)
[TOC](代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版) ) 入营第三十七天 难度:难 计划任务 完成任务 52. 携带研究材料 动态规划五部曲: 1.确定dp数组以及下标含义 dp[i][j]表示从下标[0-i]的…...
数智化招标采购系统分类及功能亮点
数智化招标采购系统是郑州信源公司运用“互联网”、大数据、人工智能、区块链、物联网等新兴技术,结合供应链管理理念,以招标采购为核心,提供交易、管理、数据、服务、监管为一体的高标准采购管理平台,赋能政企用户实现采购业务全…...
CSS appearance 属性:掌握UI元素的原生外观
在现代网页设计中,为了达到一致的用户体验,我们有时需要让HTML元素模仿操作系统的默认控件样式。CSS中的appearance属性提供了一种简便的方式来控制这些元素是否以及如何显示其默认外观。本文将详细介绍appearance属性,并通过实际代码示例来展…...
【JavaScript】二十四、JS的执行机制事件循环 + location + navigator + history
文章目录 1、JS执行机制(事件循环eventloop)2、BOM的window3、location对象3.1 href属性3.2 search属性3.3 hash属性3.4 reload方法 4、navigator对象5、history对象 1、JS执行机制(事件循环eventloop) 以下,两段代码…...
CSS核心笔记002
margin塌陷问题 第一个子元素的上margin会作用在父元素上, 最后一个子元素的下margin会作用在父元素上解决 1. 给父元素设置 不为0的pandding 2. 给父元素设置宽度不为0 的border 3. 给父元素设置样式 overflow:hiddenmargin合并问题 兄弟元素的下外margin和会下面兄弟的上…...
前端路由缓存实现
场景:以一体化为例:目前页面涉及页签和大量菜单路由,用户想要实现页面缓存,即列表页、详情页甚至是编辑弹框页都要实现数据缓存。 方案:使用router-view的keep-alive实现 。 一、实现思路 1.需求梳理 需要缓存模块&…...