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

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况

1、查看进程

#jps 查看所有java进程

#top 查看cpu占用高进程

输入m  :根据内存排序

topMem:  16333644k total,  9472968k used,  6860676k free,   165616k buffers
Swap:        0k total,        0k used,        0k free,  6665292k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND     
17850 root      20   0 7588m 112m  11m S 100.7  0.7  47:53.80 java       1552 root      20   0  121m  13m 8524 S  0.7  0.1  14:37.75 AliYunDun   3581 root      20   0 9750m 2.0g  13m S  0.7 12.9 298:30.20 java        1 root      20   0 19360 1612 1308 S  0.0  0.0   0:00.81 init        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/0 

2、top -p pid 查看某一进程

首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id

  可以看到是2913,现在可以使用如下命令查看内存:

top -p 2913

  这样可以动态实时的看到CPU和内存的占用率,然后按q键回到命令行

3、ps -aux | grep xxx

直接使用ps命令查看: ps -aux | grep kafka

第一个标注的地方是CPU和内存占用率,后面的943100是物理内存使用量,单位是k,此时kafka大约占用943M内存

4、查看内存占用前10名的程序

ps aux | sort -k4,4nr | head -n 10 查看内存占用前10名的程序

5、监控全部或指定进程占用系统资源:pidstat

pidstat主要用于监控全部或指定进程占用系统资源的情况。

5.1 查看CPU使用情况

pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

# 显示所有的进程统计信息,包括idle进程。pidstat -p ALL
# 更加详细的显示了线程统计信息。pidstat -p ALL -t
# 周期采样和采样次数pidstat [option] interval [count]

除此之外还可以通过-p获取指定进程的统计信息。

pidstat还可以通过-r获取内存使用统计信息,通过-d获取IO使用统计信息。

5.2 查看内存使用情况

pidstat -p ALL -r结果如下:

15时18分21秒   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
15时18分21秒     0         1      0.02      0.00  185316    3028   0.08  systemd
15时18分21秒     0         2      0.00      0.00       0       0   0.00  kthreadd
15时18分21秒     0         4      0.00      0.00       0       0   0.00  kworker/0:0H
15时18分21秒     0         6      0.00      0.00       0       0   0.00  mm_percpu_wq
15时18分21秒     0         7      0.00      0.00       0       0   0.00  ksoftirqd/0
15时18分21秒     0         8      0.00      0.00       0       0   0.00  rcu_sched

minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数。

majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生。

VSZ: 该进程使用的虚拟内存(以kB为单位)。

RSS: 该进程使用的物理内存(以kB为单位)。

%MEM: 该进程使用内存的百分比。

Command: 拉起进程对应的命令。

5.3 查看磁盘使用情况

pidstat -p ALL -d结果如下:

15时20分40秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
15时20分40秒     0         1     -1.00     -1.00     -1.00 243523129  systemd
15时20分40秒     0         2     -1.00     -1.00     -1.00       0  kthreadd
15时20分40秒     0         4     -1.00     -1.00     -1.00       0  kworker/0:0H
15时20分40秒     0         6     -1.00     -1.00     -1.00       0  mm_percpu_wq
15时20分40秒     0         7     -1.00     -1.00     -1.00 714512328679  ksoftirqd/0
15时20分40秒     0         8     -1.00     -1.00     -1.00 417757303594  rcu_sched

kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)。

kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)。

kB_ccwr/s:每秒进程被取消向磁盘写的数据量(以kB为单位)。

Command::拉起进程对应的命令。

6、jstack查看java线程

/opt/java8/bin/jstackUsage:jstack [-l] <pid>(to connect to running process) 连接活动线程jstack -F [-m] [-l] <pid>(to connect to a hung process) 连接阻塞线程jstack [-m] [-l] <executable> <core>(to connect to a core file) 连接dump的文件jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server) 连接远程服务器Options:-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)-m  to print both java and native frames (mixed mode)-l  long listing. Prints additional information about locks-h or -help to print this help message

jstack查看输出

jstack统计线程数

/opt/java8/bin/jstack -l 28367 | grep 'java.lang.Thread.State' | wc -l

查看gc情况

1、查看某个进程的对象占用对象最大情况

pid是进程号,20表示排名前二十,instances表示实例数量,bytes表示占用内存大小(1M=1024KB,1KB=1024Bytes)

jmap -histo pid | head -n 20

2、监控jvm内存,查看full gc频率

监控jvm,每5秒打印一次,循环100次

jstat -gc pid 5000 100jstat -gcutil pid 5000 100

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

查看进程运行时间,频率=持续时间 /FGC

# ps -eo pid,tty,user,comm,lstart,etime | grep 24019
24019 ?        admin    java            Thu Dec 13 11:17:14 2018    01:29:43
进程id                  进程名            开始时间                    持续时间 

jmap 用法

概述

命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

参数:

  • option: 选项参数。
  • pid: 需要打印配置信息的进程ID。
  • executable: 产生核心dump的Java可执行文件。
  • core: 需要打印配置信息的核心文件。
  • server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
  • remote server IP or hostname 远程调试服务器的IP地址或主机名。

option

  • no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
  • heap: 显示Java堆详细信息
  • histo[:live]: 显示堆中对象的统计信息
  • clstats:打印类加载器信息
  • finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • dump:<dump-options>:生成堆转储快照
  • F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  • help:打印帮助信息
  • J<flag>:指定传递给运行jmap的JVM的参数

1、no option

命令:jmap pid 描述:查看进程的内存映像信息,类似 Solaris pmap 命令。

使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。

2、heap查看内存使用情况

命令:jmap -heap pid 描述:显示Java堆详细信息

打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式using thread-local object allocation.   Concurrent Mark-Sweep GC   ##同步并行垃圾回收Heap Configuration:  ##堆配置情况MinHeapFreeRatio = 40 ##最小堆使用比例MaxHeapFreeRatio = 70 ##最大堆可用比例MaxHeapSize      = 2147483648 (2048.0MB) ##最大堆空间大小NewSize          = 268435456 (256.0MB) ##新生代分配大小MaxNewSize       = 268435456 (256.0MB) ##最大可新生代分配大小OldSize          = 5439488 (5.1875MB) ##老生代大小NewRatio         = 2  ##新生代比例SurvivorRatio    = 8 ##新生代与suvivor的比例PermSize         = 134217728 (128.0MB) ##perm区大小MaxPermSize      = 134217728 (128.0MB) ##最大可分配perm区大小Heap Usage: ##堆使用情况New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区 + survior空间)capacity = 241631232 (230.4375MB)  ##伊甸区容量used     = 77776272 (74.17323303222656MB) ##已经使用大小free     = 163854960 (156.26426696777344MB) ##剩余容量32.188004570534986% used ##使用比例Eden Space:  ##伊甸区 capacity = 214827008 (204.875MB) ##伊甸区容量used     = 74442288 (70.99369812011719MB) ##伊甸区使用free     = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量34.65220164496263% used ##伊甸区使用情况From Space: ##survior1区capacity = 26804224 (25.5625MB) ##survior1区容量used     = 3333984 (3.179534912109375MB) ##surviror1区已使用情况free     = 23470240 (22.382965087890625MB) ##surviror1区剩余容量12.43827838477995% used ##survior1区使用比例To Space: ##survior2 区capacity = 26804224 (25.5625MB) ##survior2区容量used     = 0 (0.0MB) ##survior2区已使用情况free     = 26804224 (25.5625MB) ##survior2区剩余容量0.0% used ## survior2区使用比例concurrent mark-sweep generation: ##老生代使用情况capacity = 1879048192 (1792.0MB) ##老生代容量used     = 30847928 (29.41887664794922MB) ##老生代已使用容量free     = 1848200264 (1762.5811233520508MB) ##老生代剩余容量1.6416783843721663% used ##老生代使用比例Perm Generation: ##perm区使用情况capacity = 134217728 (128.0MB) ##perm区容量used     = 47303016 (45.111671447753906MB) ##perm区已使用容量free     = 86914712 (82.8883285522461MB) ##perm区剩余容量35.24349331855774% used ##perm区使用比例

3、histo查看内存中对象数量及大小  

命令:jmap -histo[:live] pid 描述:显示堆中对象的统计信息

可以使用管道 | more来一段一段地输出信息。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

  #查看所有对象  jmap ‐histo <pid> | more#查看活跃(存活?)对象  jmap ‐histo:live <pid> | more

  对象说明:

    B byte

    C char

    D double

    F float

    I int

    J long

    Z boolean

    [ 数组,如[I表示int[]

    [L+类名 其他对象

  • 注意事项:jmap -dump:live 以及 jmap -histo:live都会触发Full GC
  • https://www.iteye.com/blog/langzi-xl-798905

4、clstats打印类加载器信息

命令:jmap -clstats pid 描述:打印类加载器信息。-clstats是-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据 打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

5、finalizerinfo打印等待终结的对象信息

命令:jmap -finalizerinfo pid 描述:打印等待终结的对象信息。Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行final

6、将内存使用情况dump到文件中

命令:#用法: jmap -dump:format=b,file=dumpFileName <pid> 描述:生成堆转储快照dump文件。可以用 memory analyse 查看

以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

jmap -dump:format=b,file=../tmp/dump.dat 29720

在线查看dump网站: 

1、HeapHero

https://heaphero.io/index.jsp

2、Gceasy

Universal JVM GC analyzer - Java Garbage collection log analysis made easy

相关文章:

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况 1、查看进程 #jps 查看所有java进程 #top 查看cpu占用高进程 输入m &#xff1a;根据内存排序 topMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffers Swap: 0k total, 0k used, 0k free, 6…...

nginx安装letsencrypt证书

1.安装推荐安装letsencrypt证书的客户端工具 官方推荐通过cerbot客户端安装letsencrypt 官方推荐使用snap客户端安装cerbot客户端 apt install snapd snap install --classic certbot 建立certbot软链接&#xff1a;ln -s /snap/bin/certbot /usr/bin/certbot 2.开始安装letse…...

docker笔记1-安装与基础命令

docker的用途&#xff1a; 可以把应用程序代码及运行依赖环境打包成镜像&#xff0c;作为交付介质&#xff0c;在各种环境部署。可以将镜像&#xff08;image&#xff09;启动成容器&#xff08;container&#xff09;&#xff0c;并提供多容器的生命周期进行管理&#xff08;…...

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC&#xff0c;是Visual studio code的缩写&#xff0c;是由微软开发的跨平台的轻量级编辑器&#xff0c;支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…...

Opencv中的滤波器

一副图像通过滤波器得到另一张图像&#xff0c;其中滤波器又称为卷积核&#xff0c;滤波的过程称之为卷积。 这就是一个卷积的过程&#xff0c;通过一个卷积核得到另一张图片&#xff0c;明显发现新的到的图片边缘部分更加清晰了&#xff08;锐化&#xff09;。 上图就是一个卷…...

<JavaEE> 基于 TCP 的 Socket 通信模型

目录 一、认识相关API 1&#xff09;ServerSocket 2&#xff09;Socket 二、TCP字节流套接字通信模型概述 三、回显客户端-服务器 1&#xff09;服务器代码 2&#xff09;客户端代码 一、认识相关API 1&#xff09;ServerSocket ServerSocket 常用构造方法ServerSocke…...

[THUPC 2024 初赛] 二进制 (树状数组单点删除+单点查询)(双堆模拟set)

题解 题目本身不难想 首先注意到所有查询的序列长度都是小于logn级别的 我们可以枚举序列长度len&#xff0c;然后用类似滑动窗口的方法&#xff0c;一次性预处理出每种字串的所有出现位置&#xff0c;也就是开N个set去维护所有的位置。预处理会进行O(logn)轮&#xff0c;每…...

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…...

使用GBASE南大通用负载均衡连接池

若要使用负载均衡连接池功能&#xff0c;需要在连接串中配置相关的关键字。有关更详细的关键字信息在 GBASE南大通用 连接参数表‛中介绍。假设存在如下场景&#xff1a;  现有集群中存在 4 个节点&#xff1a; 192.168.9.173, 192.168.9.174, 192.168.9.175, 192.168.9.17…...

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火&#xff0c;大多数技术组件都是运行在JVM上的&#xff0c;Flink也是运行在JVM上&#xff0c;基于JVM的数据分析引擎都需要将大量的数据存储在内存中&#xff0c;这就不得不面临JVM的一些问题&#xff0c;比如Ja…...

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中&#xff0c;抽象出了23种设计模式&#xff0c;用以解决对象的创建、组合、使用三种场景。在并发编程中&#xff0c;针对线程的操作&#xff0c;也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…...

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例2 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非对称式密…...

simulinkveristandlabview联合仿真——模型导入搭建人机界面

目录 1.软件版本 2.搭建simulink仿真模型 编译错误 3.导入veristand并建立工程 4.veristand导入labview labview显示veristand工程数据 labview设置veristand工程数据 运行labview工程 1.软件版本 matlab2020a&#xff0c;veristand2020 R4&#xff0c;labview2020 SP…...

k8s中Helm工具实践

k8s中Helm工具实践 1&#xff09;安装redis-cluster 先搭建一个NFS的SC&#xff08;只需要SC&#xff0c;不需要pvc&#xff09;&#xff0c;具体步骤此文档不再提供&#xff0c;请参考前面相关章节。 下载redis-cluster的chart包 helm pull bitnami/redis-cluster --untar…...

推荐算法架构7:特征工程(吊打面试官,史上最全!)

系列文章&#xff0c;请多关注 推荐算法架构1&#xff1a;召回 推荐算法架构2&#xff1a;粗排 推荐算法架构3&#xff1a;精排 推荐算法架构4&#xff1a;重排 推荐算法架构5&#xff1a;全链路专项优化 推荐算法架构6&#xff1a;数据样本 推荐算法架构7&#xff1a;特…...

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…...

uniapp点击tabbar之前做判断

在UniApp中&#xff0c;可以通过监听 tabBar 的 click 事件来在点击 tabBar 前做判断。具体步骤如下&#xff1a; 在 pages.json 文件中配置 tabBar&#xff0c;例如&#xff1a; {"pages":[{"path":"pages/home/home","name":"h…...

DLLNotFoundException:xxx tolua... 错误打印

DLLNotFoundException:xxx tolua... 错误打印 一、DLLNotFoundException介绍二、Plugins文件夹文件目录结构如下&#xff1a; 三、Plugins中的Android文件夹四、Plugins中的IOS文件夹这里不说了没测试过不过原理应该也是选择对应的平台即可五、Plugins中的x86和X86_64文件夹 一…...

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…...

【投稿】北海 - Rust与面向对象(二)

模板方法 Rust提供了trait&#xff0c;类似于面向对象的接口&#xff0c;不同的是&#xff0c;将传统面向对象的虚函数表从对象中分离出来&#xff0c;trait仍然是一个函数表&#xff0c;只不过是独立的&#xff0c;它的参数self指针可以指向任何实现了该trait的结构。 从对象中…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...