当前位置: 首页 > news >正文

网站中引用字体/什么是优化设计

网站中引用字体,什么是优化设计,洛阳霞光做网站公司,学院网站开发竞争对手分析HarmonyOS开发中,如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题

  • (1)Allocation的应用
    • 调试方式
    • Memory泳道
    • Native Allocation泳道
  • (2)Snapshot
  • (3)ASan的应用
    • 使用约束
    • 配置参数
    • 使能ASan
      • 方式一
      • 方式二
    • 启用ASan
    • ASan检测异常码
  • (4)HWASan的应用
    • 功能介绍
    • 约束条件
    • 使能HWASan
      • 方式一
      • 方式二
    • 启用HWASan
  • 总结

应用在开发过程中,可能会因为API使用错误、变量未及时释放、异常频繁创建/释放内存等情况引发各种内存问题。
华为官方提供了多种方案来方便各位开发者分析解决内存相关问题,比如Allocation (获取native调用栈profiler)、SnapShot、ASan、HWASan,本文重点对这些工具的特点做些说明,同时结合实际案例对这些工具的应用做进一步讲解。

(1)Allocation的应用

Allocation是DevEco Studio 开发工具的 Profiler提供的内存场景分析工具,开发过程中可以使用Allocation来分析应用或服务在运行时的内存分配及使用情况,识别和定位内存泄漏、内存抖动以及内存溢出等问题,对应用或服务的内存使用进行优化。

调试方式

打开 DevEco Studio 找到 Profiler,DevEco Profiler提供Launch、ArkUI、Frame、Concurrency、ArkWeb、Network、Time、Allocation、Snapshot、CPU等场景化分析任务类型,在设备列表中选择设备(目前只支持真机),在进程列表中选择要调测的应用,选择Allocation并点击Create Session即可创建一次会话。右侧任务分析窗口可以选择Memory、Native Allocation具体分析。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e0298bf884148d7b3facba13ac95332.png

Memory泳道

可以看到Memory泳道包含三个标识:PSS代表进程独占内存和按比例分配共享库占用内存之和,RSS是进程独占内存和相关共享库占用内存之和,USS代表进程独占内存。

在右边录制详情区域,工具控制栏上有很多小图标,鼠标放上去会有一些功能提示,可以添加一些录制选项,各泳道区域也有下拉框选项,下拉选择不同的设置可以调整录制功能。

单击任务窗口左上角的 ,启动录制,也可以选择左侧的任务列表中的,启动录制后,等待任务状态由“initializing”变为“recording”。录制过程中整个DevEco Profiler不能再点击其他的模板进行操作,如果想录制其他模板可以结束本次录制重新选择其他模板开始录制。
在这里插入图片描述
录制过程中,右侧任务分析窗口显示未recording状态,先要结束此次录制时,点击左侧Allocation按钮的stop按钮即可,结束录制之后可以看到当前session的各个不同内存类型对应的变化情况。
默认展示其中的五个子泳道,如要显示其他子泳道,可以点击主泳道的options标签并勾选其他泳道来查看。在这里插入图片描述
选择具体的子泳道可以在details模块看到不同的时间点,对应的内存值变化情况,方便开发者进一步定位问题。
在这里插入图片描述
特别提示:

  • 由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。
  • 建议避免同时录制ArkTS Allocation及Native Allocation泳道,避免影响分析准确性。

Native Allocation泳道

Native Allocation泳道主要显示具体的Native内存分配情况,包括静态统计数据、分配栈、每层函数栈消耗的Native内存等信息。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。通过操作对应的options同样可以选择展示的类型,框选子泳道后显示具体的内存分配,包括静态统计数据、分配栈等。
在这里插入图片描述

如下图所示,为选中Native Allocation后的某种展示场景。

  • Statistics显示该段时间内的静态分配情况。包括分配方式(Malloc或Mmap)、总分配内存大小、总分配次数、尚未释放的内存大小、尚未释放次数、已释放的内存大小、已释放次数。
    点击任意对象上的跳转按钮,可跳转至此类对象的详细占用/分配信息。当前统计模式下不支持跳转。
  • Call Trees页签显示线程的内存分配栈情况。包括函数地址或符号、分配大小、占比以及函数栈帧的类别等。单击任一行栈帧,“More”区域将显示经过该栈帧的分配内存最大的调用栈。
  • Allocations List显示内存分配的详细信息。包括内存块起始地址、时间戳、当前活动状态、大小、调用的库、调用库的具体函数、事件类型(与Statistics页签的分配方式对应)等。

针对详情面板中所展示的函数栈帧信息(如下图所示),双击栈帧结点,工具便会在编辑器中打开相关源码文件,并定位到对应行号。此功能正常使用的前提是用于抓取性能数据的应用,是在DevEco Studio所在的开发环境中编译,且相关源文件位置并未改变。
在这里插入图片描述
值得注意的是,上图对应的category列表标识调用栈的类型,从语言层面分为ArkTS、NAPI以及Native,从归属层面分为开发者代码以及系统代码(如下图所示)。从这两个方面可以将调用栈类型归类如下:

  • ArkTS:程序正在执行ArkTS代码;
  • NAPI:程序正在运行的NAPI代码;
  • Native:程序正在执行的Native代码;其中每一个类型的亮色和灰色分别代表开发者和系统的代码。
    在这里插入图片描述

Native Allocation泳道的内存状态信息可以进一步过滤和筛选。选中Native Allocation后,details底部有两个默认过滤条件All Allocations、Native Size。

  • All Allocations(默认状态):详情区域展示当前框选时间段内的所有内存分配信息

  • Created & Existing:详情区域展示当前框选时间段内分配未释放的内存。

  • Created & Released:详情区域展示当前框选时间段内分配已释放的内存。
    在这里插入图片描述

  • Native Size:详情区域按照对象的原生内存进行展示。

  • Native Library:详情区域按照对象的so库进行展示。
    在这里插入图片描述

此外,在“Native Allocation”泳道的“Allocations List”页签中还可以通过so库名称进行筛选、搜索关键词筛选、内存分配堆栈进行筛选,此处不再做过多演示。

关于Allocation的更多介绍和使用方法可以在官方文档查看,基础内存分析:Allocation分析

(2)Snapshot

Snapshot是DevEco Profiler提供的一个内存快照分析工具,通过结合Memory实时占用情况,分析不同时刻的方舟虚拟机内存对象占用情况及差异,进而进行内存优化。

关于Snapshot具体的应用技巧可以借鉴官网Snapshot模板基本操作,或者借鉴使用Snapshot Insight分析ArkTS内存问题,本文不再赘述。

(3)ASan的应用

ASan(Address-Sanitizer)是内存检测的工具,用于发现内存飞踩第一现场,DevEco Studio为开发者集成了ASan能力,可以检测C/C++的地址越界问题,解决一些踩内存导致的异常crash的补充手段,对于一些明显不可能crash的场景可以尝试开启ASan。

使用约束

  • 如果应用内的任一模块使能ASan,那么entry模块需同时使能ASan。
  • 如果entry模块未使能ASan,该应用在启动时将闪退,出现CPP Crash报错。
  • ASan、TSan、HWASan不能同时开启,三个只能开启其中一个。

配置参数

ASAN_OPTIONS:在运行时配置ASan的行为,包括设置检测级别、输出格式、内存错误报告的详细程度等。ASAN_OPTIONS支持在app.json5中配置,也支持在Run/Debug Configurations中配置。app.json5的优先级较高,即两种方式都配置后,以app.json5中的配置为准。

以在app.json5中配置环境变量为例。打开AppScope > app.json5文件,添加配置示例如下。

{"app": {"appEnvironments": [{"name": "ASAN_OPTIONS","value": "log_exe_name=true abort_on_error=0 print_cmdline=true" // 示例仅供参考,具体以实际为准},],...}
}

在Run/Debug Configurations中配置环境变量,具体可查看配置环境变量

使能ASan

可通过以下两种方式使能ASan。

方式一

  1. 在运行调试窗口(entry --> Edit Configurations),点击Diagnostics,勾选Address Sanitizer。
    在这里插入图片描述
    在这里插入图片描述
  2. 如果有引用本地library,需在library模块的build-profile.json5文件中,配置arguments字段值为“-DOHOS_ENABLE_ASAN=ON”,表示以ASan模式编译so文件。
    在这里插入图片描述

方式二

  1. 修改工程目录下AppScope/app.json5,添加ASan配置开关。
 "asanEnabled": true

在这里插入图片描述

  1. 设置模块级构建ASan插桩。
    在需要使能ASan的模块中,通过添加构建参数开启ASan检测插桩,在对应模块的模块级build-profile.json5中添加命令参数:
"arguments": "-DOHOS_ENABLE_ASAN=ON"

在这里插入图片描述

启用ASan

运行或调试当前应用。
当程序出现内存错误时,弹出ASan log信息,点击信息中的链接即可跳转至引起内存错误的代码处。

举例说明:
编写一段数组越界的C++代码,对外暴露接口,在ArkTs侧调用该方法。
在这里插入图片描述

Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));hilog.info(0x0000, 'testTag', 'HeapBufferOverflow() ', testNapi.HeapBufferOverflow());// this.memoryLeak()})

运行当前项目,触发Button的onClick事件调用之后,应用崩溃,弹出FaultLog信息。
在这里插入图片描述
点击 Jump to Log跳转到FaultLog模块。
在这里插入图片描述

可以看到log信息有明确的log信息,报错原因为“AddressSanitizer: heap-buffer-overflow”,同样的还有多个链接地址。“appspawn30149==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x005b7fe7153b at pc 0x007c24fc309c bp 0x007eba84b160 sp 0x007eba84b158
”可以直接跳转到官网关于“heap-buffer-overflow”的报错解释以及解决方案。另外多个包含“/data/storage/el1/…”的地址能精确定位到C/C++层代码出错的具体位置。
在这里插入图片描述
然后我们就发现这是数组越界造成的,所以解决方案就是“对于已知大小的集合,注意访问不要越界,位置大小的集合访问前先判断大小。”

ASan检测异常码

ASan不仅能检测出“heap-buffer-overflow”异常,还能检测很多其他类型的内存异常,关于这些异常问题及解决方案,如下所示。

  • heap-buffer-overflow

    • 背景/原理:访问越界。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:AddressSanitizer:heap-buffer-overflow
    • 修改方法:注意数组容量不要访问越界。
    • 推荐建议:已知大小的集合注意访问不要越界,位置大小的集合访问前先判断大小。
  • stack-buffer-underflow

    • 背景/原理:访问越下界。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:AddressSanitizer:stack-buffer-underflow
    • 修改方法:访问索引不应小于下界。
    • 推荐建议:访问索引不应小于下界。
  • stack-use-after-scope

    • 背景/原理:栈变量在作用域之外被使用。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:AddressSanitizer:stack-use-after-scope
    • 修改方法:在作用域内使用该变量。
    • 推荐建议:注意变量作用域。
  • attempt-free-nonallocated-memory

    • 背景/原理:尝试释放了非堆对象(non-heap object)或未分配内存。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:
      AddressSanitizer: attempting free on address which was not malloc()-ed
    • 修改方法:不要对非堆对象或未分配的内存使用free函数。
    • 推荐建议:不要对非堆对象或未分配的内存使用free函数。
  • double-free

    • 背景/原理:重复释放内存。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:
      AddressSanitizer: double-free
    • 修改方法:已经释放一次的指针,不要再重复释放。
    • 推荐建议:变量定义声明时初始化为NULL,释放内存后也应立即将变量重置为NULL,这样每次释放之前都可以通过判断变量是否为NULL来判断是否可以释放。
  • heap-use-after-free

    • 背景/原理:当指针指向的内存被释放后,仍然通过该指针访问已经被释放的内存,就会触发heap-use-after-free。
    • 影响/报错:导致程序存在安全漏洞,并有崩溃风险。
      开启ASan检测后,触发demo中的函数,应用闪退报ASan,包含字段:
      AddressSanitizer: heap-use-after-free
    • 修改方法:已经释放的指针不要再使用,将指针设置为NULL/nullptr。
    • 推荐建议:实现一个free()的替代版本或者 delete析构器来保证指针的重置。
  • Other categories
    未知的错误类型,持续更新中。

(4)HWASan的应用

HWASan(Hardware-Assisted Address Sanitizer)是一款类似于ASan的内存错误检测工具,目前仅适用于。 与ASan相比,HWASan使用的内存减少很多,因而更适合用于整个系统的清理。

功能介绍

与ASan相比,HWASan具有如下特征:

  • CPU开销约为2倍。
  • 代码大小开销为40% - 50%。
  • RAM开销为10% - 35%。

HWASan能检测到ASan所能检测到的同一系列错误:

  • 堆栈和堆缓冲区上溢/下溢。
  • 释放之后的堆使用情况。
  • 重复释放/错误释放。

和ASan相比,HWASan具有以下优点:

  • HWASan不需要安全区来检测buffer overflow,既极大地降低了工具对于内存的消耗,也不会出现ASan中某些overflow检测不到的情况。
  • HWASan不需要隔离区来检测UseAfterFree,因此不会出现ASan中某些UseAfterFree检测不到的情况。
  • 此外,HWASan还可以检测返回之后的堆栈使用情况。

约束条件

  • HWASan检测仅适用于AArch64架构的硬件。
  • ASan、TSan、HWASan不能同时开启,三个只能开启其中一个。

使能HWASan

方式一

在运行调试窗口(例如entry --> Edit Configurations),点击Diagnostics,勾选Hardware-Assisted Address Sanitizer开启检测。

在这里插入图片描述

方式二

修改工程目录下的AppScope/app.json5文件,添加HWASan配置开关。

"hwasanEnabled": true

在这里插入图片描述
在需要使能HWASan的模块中,通过添加构建参数开启HWASan检测插桩,在对应模块的模块级build-profile.json5中添加命令参数:

"arguments": "-DOHOS_ENABLE_HWASAN=ON"

在这里插入图片描述

启用HWASan

运行或调试当前应用。当程序出现内存错误时,弹出HWASan log信息,点击信息中的链接即可跳转至引起内存错误的代码处。

关于HWAan的代码实例和应用场景基本和ASan一致,此处就不做重复是说明了。

总结

  • 根据Allocation分析的结果,可以方便开发者优化应用的服务和组件的内存使用。例如,减少不必要的内存分配和释放,优化数据结构的使用等。

  • 通过ASan或HWASan分析问题时,精准定位内存出错原因和具体位置,开发者应修复这些内存管理的问题,如确保所有分配的内存都被正确释放。

  • 开发过程中,使用合适的内存管理和回收机制 :确保应用在不需要内存资源时能够有效地回收和管理这些资源,避免过度使用内存。

相关文章:

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…...

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍: 基于RAG(Retrieval-Augmented Generation)技术,可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档(例如Word格式文件)导入系统,通过数据清洗、向量化处理…...

2023年第十四届蓝桥杯Scratch国赛真题—推箱子

推箱子 程序演示及其源码解析,可前往: https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程,在线测评模考,助力赛事可自行前往题库中心,按需查找: https://www.hixinao.com/ 题库涵盖…...

银河麒麟V10-SP1设置redis开机自启

前言: redis安装请看:银河麒麟V10-SP1离线安装redis5.0.1_银河麒麟v10 redis5.0-CSDN博客 一、编辑自启文件 vim /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecS…...

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…...

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可…...

106.【C语言】数据结构之二叉树的三种递归遍历方式

目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…...

qt QToolButton详解

1、概述 QToolButton是Qt框架中的一个控件,它继承自QAbstractButton。QToolButton通常用于工具栏(QToolBar)中,提供了一种快速访问命令或选项的方式。与普通的QPushButton按钮相比,QToolButton通常只显示一个图标而不…...

2024年大热,Access平替升级方案,也适合Excel用户

欢迎各位看官,您来了,就对了! 您多半是Access忠实粉丝,至少是excel用户,亦或是WPS用户吧。那就对了,今天的分享肯定对您有用。 本文1100字,阅读时长2分50秒! 现实总是不尽人意&am…...

探索Scala的模式匹配:身份证识别与等级判定!!! #Scala # scala #匹配模式

在Scala编程语言中,模式匹配是一个强大且表达力丰富的特性,它允许我们以声明式的方式处理多种情况。今天,我们将通过两个有趣的例子来展示Scala模式匹配的魅力:身份证号识别和等级判定。 1. 身份证号识别:定位你的家乡…...

python数据分析之爬虫基础:爬虫介绍以及urllib详解

前言 在数据分析中,爬虫有着很大作用,可以自动爬取网页中提取的大量的数据,比如从电商网站手机商品信息,为市场分析提供数据基础。也可以补充数据集、检测动态变化等一系列作用。可以说在数据分析中有着相当大的作用!…...

【星海随笔】syslinux

Ubuntu相关资料 https://www.pugetsystems.com/labs/hpc/ubuntu-22-04-server-autoinstall-iso/#Step_2_Unpack_files_and_partition_images_from_the_Ubuntu_2204_live_server_ISO https://launchpad.net/ubuntu/source/squashfs-tools/1:4.6.1-1build1 sudo tar -xf my_compu…...

力扣C语言刷题记录 (二)移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...

【Vue3】【Naive UI】<NAutoComplete>标签

【Vue3】【Naive UI】标签 <NAutoComplete> 是 Naive UI 库中的一个组件&#xff0c;用于实现自动完成或联想输入功能。 它允许用户在输入时看到与当前输入匹配的建议列表&#xff0c;从而帮助用户更快地填写表单字段。 这个组件通常用于搜索框、地址输入等场景&#xff…...

【Halcon】使用均值滤波出现假边怎么办?

在图像处理过程中,均值滤波是一种常见的平滑技术,用于减少图像中的噪声。然而,当应用于具有显著边缘或对比度变化的图像时,均值滤波可能会导致“假边”现象,即原本不存在的边缘在滤波后变得明显。以下是如何在Halcon中处理这一问题,并提供一个完整的示例代码。 示例背景…...

Flask+Minio实现断点续传技术教程

什么是MinIO MinIO是一个高性能的分布式对象存储服务&#xff0c;与Amazon S3 API兼容。它允许用户存储和检索任意规模的数据&#xff0c;非常适合于使用S3 API的应用程序。MinIO支持多租户存储&#xff0c;提供高可用性、高扩展性、强一致性和数据持久性。它还可以作为软件定义…...

JAVA设计模式,动态代理模式

动态代理&#xff08;Dynamic Proxy&#xff09;是Java中一种非常有用的设计模式。它允许在运行时创建一个实现了一组给定接口的新类。这种模式主要用于当需要为某个对象提供一个代理以控制对该对象的访问时。通过这种方式&#xff0c;可以添加额外的功能&#xff0c;如事务管理…...

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…...

【计算机视觉算法与应用】模板匹配、图像配准

目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…...

详解Rust多线程编程

文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全&#xff0c;同时避免运行时的开销&…...

el-upload上传多个文件,一次请求,Django接收

1、:file-list"fileList" :on-change"handleChange" 将文件赋值到fileList 2、 :auto-upload"false" 手动触发上传 写个按钮点击执行这个 this.$refs.upload.submit(); 3、自己写上传&#xff0c;不会再触发上传成功或失败回调 4、 request.FI…...

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…...

《JavaScript高级程序设计》读书笔记 20

感谢点赞、关注和收藏&#xff01; 原始值包装类型 为了方便操作原始值&#xff0c;ECMAScript 提供了 3 种特殊的引用类型&#xff1a;Boolean、Number 和 String。每当用到某个原始值的方法或属性时&#xff0c;后台都会创建一个相应原始包装类型的对象&#xff0c;从而暴露…...

ASP.NET Core项目中使用SqlSugar连接多个数据库的方式

之前学习ASP.NETCore及SqlSugar时都是只连接单个数据库处理数据&#xff0c;仅需在Program文件中添加ISqlSugarClient的单例即可&#xff08;如下代码所示&#xff09;。 builder.Services.AddSingleton<ISqlSugarClient>(s > {SqlSugarScope sqlSugar new SqlSugar…...

Java面试八股文(精选、纯手打)

全国内大厂Java面试高频题库 本小册内容涵盖&#xff1a;Java基础&#xff0c;JVM&#xff0c;多线程&#xff0c;数据库&#xff08;MySQL/Redis&#xff09;SSM&#xff0c;Dubbo&#xff0c;网络&#xff0c;MQ&#xff0c;Zookeeper&#xff0c;Netty&#xff0c;微服务&a…...

工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作

在工程设计行业&#xff0c;文件交换和信息共享是项目顺利推进的关键。尤其是涉及复杂的设计图纸、技术方案、合同文件等重要资料时&#xff0c;如何确保文件在内外网之间的高效、安全传输&#xff0c;直接影响到项目的进度和质量。FileLink正是为此而生&#xff0c;它为工程设…...

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…...

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持&#xff0c;如果服务需要使用apns推送等需要http2.0的访问就会失败&#xff0c;所以重新编译php让其支持http2.0 编译方法&#xff1a; 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…...

Redis服务配置文件 redis.conf 更新修改配置参数说明

场景&#xff1a; 在安装redis服务中&#xff0c;默认的配置项通常不能实际使用&#xff0c;需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件&#xff0c;此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容&#xff0c;主要修改项如下 protect…...