Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局

目录

一、环境信息

二、声明

三、进程终止

1、情况分类

2、退出函数

3、退出实验

(1)main声明int和调用return值

(2)main声明int和不调用return

(3)main声明不int和不调用return

4、atexit

5、atexit实验

四、命令行、环境表

1、命令行

2、环境表

3、实验

五、C程序的存储空间布局

1、图示

2、名词解释

3、实验


一、环境信息

名称
CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
操作系统CentOS Linux release 7.9.2009 (Core)
内存3G
逻辑核数2

二、声明

本文部分内容参考了《Unix环境高级编程》第三版,这本书写的很好,推荐大家进行阅读。

三、进程终止

1、情况分类

程序终止一共分为八种:

编号情况正常与否
1main返回正常终止
2调用exit函数
3调用_exit或_Exit函数
4最后一个线程从其启动例程返回(后续博客讲述)
5从最后一个线程调用pthread_exit(后续博客讲述)
6调用abort(后续博客讲述)异常终止
7接到一个信号(后续博客讲述)
8最后一个线程对取消请求做出响应(后续博客讲述)

2、退出函数

退出函数有三种:

函数声明描述
void exit(int __status)对于所有打开流调用fclose函数,之后再进入内核。
void _exit(int __status)直接进入内核。
void _Exit(int __status)直接进入内核。

上面三个函数都包含参数__status(终止状态),如果调用时没带参数,或者用renturn;返回,或者main函数没有声明返回值类型为整型,那么进程的终止状态时未定义的,如果声明了整型返回值,但没有调用return或上面的三个函数,那么会隐式返回终止状态0。

main函数中exit(0)和return(0)等价。

3、退出实验

(1)main声明int和调用return值

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main()
{
    printf("Uid : %d, Gid : %d\n",getuid(),getgid());
    
    return 6;
}
[gbase@czg2 Src]$ ../Exec/MyGetUserGroupId 
Uid : 1001, Gid : 1001
[gbase@czg2 Src]$ echo $?
6

(2)main声明int和不调用return

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main()
{
    printf("Uid : %d, Gid : %d\n",getuid(),getgid());
}
[gbase@czg2 Src]$ ../Exec/MyGetUserGroupId 
Uid : 1001, Gid : 1001
[gbase@czg2 Src]$ echo $?
0

(3)main声明不int和不调用return

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

main()
{
    printf("Uid : %d, Gid : %d\n",getuid(),getgid());
}
[gbase@czg2 Src]$ gcc -Wall -Wextra -O3 MyGetUserGroupId.c -o /opt/Developer/ComputerLanguageStudy/C/Unix/Exec/MyGetUserGroupId
MyGetUserGroupId.c:5:1: 警告:返回类型默认为‘int’ [-Wreturn-type]
 main()
 ^
MyGetUserGroupId.c: 在函数‘main’中:
MyGetUserGroupId.c:8:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
 }
 ^

[gbase@czg2 Src]$ ../Exec/MyGetUserGroupId 
Uid : 1001, Gid : 1001
[gbase@czg2 Src]$ echo $?
23

不同操作系统编译该程序,可能得到不同的终止状态,这取决于main函数返回时寄存器和栈的内容。

[gbase@czg2 Src]$ gcc -Wall -Wextra -O3 -std=gnu11  MyGetUserGroupId.c -o /opt/Developer/ComputerLanguageStudy/C/Unix/Exec/MyGetUserGroupId
MyGetUserGroupId.c:5:1: 警告:返回类型默认为‘int’ [默认启用]
 main()
 ^

[gbase@czg2 Src]$ ../Exec/MyGetUserGroupId 
Uid : 1001, Gid : 1001
[gbase@czg2 Src]$ echo $?
0

-std=gnu11启用C++11标准和GNU扩展特性,可以发现终止状态变化了。

4、atexit

atexit的作用是注册终止处理程序。就是在程序执行exit后,程序里面不会立马结束会先执行终止处理程序,再关闭文件流使用fclose函数,最后调用_exit或_Exit函数。

这个函数个人还觉得非常有用的,虽然还没有想到怎么使用。

5、atexit实验

#include <stdio.h>
#include <stdlib.h>

void MyExit1(void)
{
    printf("MyExit1\n");
}

void MyExit2(void)
{
    printf("MyExit2\n");
}

int main()
{
    if (atexit(MyExit1) != 0)
    {
        printf("Can't Register MyExit1.\n");
    }
    if (atexit(MyExit1) != 0)
    {
        printf("Can't Register MyExit1.\n");
    }
    if (atexit(MyExit2) != 0)
    {
        printf("Can't Register MyExit2.\n");
    }
    printf("main Finish.\n");
    return 0;
}
[gbase@czg2 Src]$ ../Exec/MyAtexit 
main Finish.
MyExit2
MyExit1
MyExit1

注意一点我们注册的顺序和调用的顺序是反的,应该是一个函数栈的方式实现。

四、命令行、环境表

为什么一起讲呢因为我把实现放一块了。

1、命令行

我们常常看到操作系统命令如ls可以后面带很多的参数,来实现不同的功能,通过main的传入参数int argc, char* argv[],我们也可以实现相同的功能。argc表示参数个数。argv表示参数值集合。

2、环境表

每个程序都会接收到一张环境表。也就是操作系统环境变量例如:LD_LIBRAYR_PATH,PATH之类等。

只需要在main函数的传入参数加上一个定义char* envp[]即可。

envp和argv不同没有给出参数个数argc,但envp数组的最后一个元素字符串是NULL,我们可以此为结束标志。

3、实验

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[],char* envp[])
{
    int i;
    for ( i = 0; i < argc; i++)
    {
        printf("argv[%d] : %s\n",i,argv[i]);
    }
    i = 0;
    while (envp[i] != NULL)
    {
        printf("envp[%d] : %s\n",i,envp[i]);
        i++;
    }
    
    return 1;
}
[gbase@czg2 Src]$ ../Exec/MyEchoArg Parameter1 Parameter2
argv[0] : ../Exec/MyEchoArg
argv[1] : Parameter1
argv[2] : Parameter2
envp[0] : XDG_SESSION_ID=2
envp[1] : HOSTNAME=czg2
envp[2] : GCLUSTER_SID=gcluster
envp[3] : SHELL=/bin/bash
envp[4] : TERM=xterm-256color
envp[5] : HISTSIZE=1000
envp[6] : GBASE_BASE=/opt/gnode
envp[7] : SSH_GBASE_PASSWD=6762617365
envp[8] : QTDIR=/usr/lib64/qt-3.3
envp[9] : OLDPWD=/opt/Developer/ComputerLanguageStudy/C/Unix
envp[10] : QTINC=/usr/lib64/qt-3.3/include
envp[11] : QT_GRAPHICSSYSTEM_CHECKED=1
envp[12] : USER=gbase
envp[13] : LD_LIBRARY_PATH=:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Make/Libs/:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Gbase8a/libs/Gbase8a/x86_64_linux/:/lib64:/opt/gcluster/server/lib/gbase/:/opt/gnode/server/lib/gbase/:/opt/gnode/server/lib/gbase/plugin/gbfti/lib:/opt/gnode/server/lib/gbase/plugin/gbfti:/opt/gcluster/server/lib/gbase/plugin:/opt/gcluster/server/lib/gbase/plugin/gbfti:/opt/gcluster/server/lib/gbase/plugin/gbfti/lib:/lib64:/opt/gcluster/server/lib/gbase/:/opt/gnode/server/lib/gbase/:/opt/gnode/server/lib/gbase/plugin/gbfti/lib:/opt/gnode/server/lib/gbase/plugin/gbfti:/opt/gcluster/server/lib/gbase/plugin:/opt/gcluster/server/lib/gbase/plugin/gbfti:/opt/gcluster/server/lib/gbase/plugin/gbfti/lib
envp[14] : LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
envp[15] : GCLUSTER_GROUP=gbase
envp[16] : GCLUSTER_BASE=/opt/gcluster
envp[17] : TERMINFO_DIRS=/opt/gcluster/server/share/terminfo:/opt/gnode/server/share/terminfo:/usr/share/terminfo
envp[18] : MAIL=/var/spool/mail/gbase
envp[19] : PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/gcluster/server/bin:/opt/gnode/server/bin:/home/gbase/.local/bin:/home/gbase/bin:/opt/gcluster/server/bin:/opt/gnode/server/bin
envp[20] : PWD=/opt/Developer/ComputerLanguageStudy/C/Unix/Src
envp[21] : GCLUSTER_HOME=/opt/gcluster/server
envp[22] : LANG=zh_CN.UTF-8
envp[23] : HISTCONTROL=ignoredups
envp[24] : SHLVL=1
envp[25] : HOME=/home/gbase
envp[26] : PYTHONPATH=:/usr/lib64/python_gcware:/usr/lib64/python_gcware
envp[27] : GCLUSTER_USER=gbase
envp[28] : LOGNAME=gbase
envp[29] : QTLIB=/usr/lib64/qt-3.3/lib
envp[30] : GBASE_SID=gbase
envp[31] : XDG_DATA_DIRS=/home/gbase/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
envp[32] : LESSOPEN=||/usr/bin/lesspipe.sh %s
envp[33] : HAPPY_SUNSHINE_HOME=/home/gbase/HappySunshineTool
envp[34] : GBASE_HOME=/opt/gnode/server
envp[35] : TCMALLOC_AGGRESSIVE_DECOMMIT=1
envp[36] : _=../Exec/MyEchoArg

如果大家不想要所有的环境变量可以使用getenv,去获取指定的环境变量。

Status MyGetOsEnv(const char * OsEnvName, MyStrType RetVal)
{
    JudgeAllNullPointer(OsEnvName);
    JudgeAllNullPointer(RetVal);

    RetVal = getenv(OsEnvName);
    if (RetVal == NULL)
    {
        LogFormat(Error,"Get Os Env         : Fail, OsEnvName : %s, RetVal : NULL.\n",OsEnvName);
        return FailFlag;
    }
    LogFormat(Debug,"Get Os Env         : OK, OsEnvName : %s, RetVal : %s.\n",OsEnvName,RetVal);
    return SuccessFlag;
}

这里给大家简单封装了一下,供参考。

五、C程序的存储空间布局

1、图示

7942b9cc60e74b91b4ed8cd5f0ad9930.png

纯手工画图,想来想去还是需要来一张。

2、名词解释

名称描述
正文段

1、存放CPU执行的机器指令部分。

2、正文段是可共享的,所以即使频繁的执行程序,在存储器中也只需要一个副本。

3、正文段是只读的,防止被恶意修改。

初始化数据段

1、也称为数据段,包含了程序中需明确赋初值的变量。

2、我通过实验理解就是初始化的全局变量。

未初始化数据段

1、也称为bss段。

2、我通过实验理解就是未初始化的全局变量。

3、在程序启动后,内核会将此段中的数据初始化为0或空指针。

1、自动变量已经每次函数调用时所需保存的信息都存放在此段中。
2、例如:调用函数时的返回地址和调用者的环境信息、函数内定义的变量等。

3、栈从高地址向低地址方向增长。

1、动态分配的内存,由malloc、calloc申请的内存等。

2、堆从低地址向高地址方向增长。

注意:只有正文和初始化段存放在磁盘的程序文件中。

3、实验

#include <stdio.h>
#include <stdlib.h>

char GlobalNoInitArray[100];

int  GlobalIinitVal = 0;

int main(int argc, char* argv[])
{
    int   SysStackInit = 1;
    char  SysStackNoInit;
    long* Heap = (long*)malloc(sizeof(long));

    printf("argv              : %p\n",argv);
    printf("SysStackInit      : %p\n",&SysStackInit);
    printf("SysStackNoInit    : %p\n",&SysStackNoInit);
    printf("Heap              : %p\n",Heap);
    printf("GlobalNoInitArray : %p\n",GlobalNoInitArray);
    printf("GlobalIinitVal    : %p\n",&GlobalIinitVal);

    free(Heap);
    Heap = NULL;
    return 1;
}
[gbase@czg2 Src]$ ../Exec/MyStorageSpaceDistribution 
argv              : 0x7fff4c7ae6c8
SysStackInit      : 0x7fff4c7ae5c0
SysStackNoInit    : 0x7fff4c7ae5bf
Heap              : 0x980010
GlobalNoInitArray : 0x601080
GlobalIinitVal    : 0x601064

从中可以看出确实是按照图中进行排序的。再次点赞一下这本书,不错的,值得大家读。

[gbase@czg2 Src]$ size ../Exec/MyStorageSpaceDistribution 
   text    data     bss     dec     hex filename
   1624     564     136    2324     914 ../Exec/MyStorageSpaceDistribution

从左到右分别是正文段、数据段、bss段、十进制总长度、十六进制总长度。(单位:字节)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/121744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot加载测试类属性和配置说明

一、项目准备 1.创建项目 2.配置yml文件 test:name: FOREVERlove: sing二、测试类属性 1.Value 说明&#xff1a;读取yml中的数据。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.spr…

Linux中固定ip端口和修改ip地址

一&#xff0c;更改虚拟网络编辑器 1&#xff0c;首先启动VMware&#xff0c;选择自己要更改ip或固定ip的虚拟机&#xff0c;并找到虚拟网络配编辑器&#xff0c;点击进入 2&#xff0c;进入之后需要点击右下角获取管理员权限后才能修改&#xff0c;有管理员权限之后图片如下 …

TSINGSEE青犀车辆违停AI算法在园区道路管控场景中的应用方案

一、背景与需求 园区作为企业办公、生产制造的重要场所&#xff0c;主要道路车辆违停等违规行为会对园区的安全造成隐患&#xff0c;并且在上下班高峰期内&#xff0c;由于发现不及时&#xff0c;车辆违停行为会造成出入口拥堵现象&#xff0c;这也成为园区管理的棘手问题。 …

C++入门(二)

前言 我们上一期介绍了什么是C&#xff0c;命名空间、输入输出、以及缺省参数。本期我们来继续介绍C的入门知识&#xff01; 本期内容介绍 函数重载 引用 内联函数 auto关键字 范围for 指针空值nullptr 目录 前言 本期内容介绍 一、函数重载 什么是函数重载&#xff1f; …

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出

本心、输入输出、结果 文章目录 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出 编辑&#xff1a;简简单…

Java关于由子类构造器生成的父类对象的反射问题

Java关于由子类构造器生成的父类对象的反射问题 问题概括一、案例准备二、问题描述 问题概括 提示&#xff1a;这里我就不绕圈子直接描述&#xff1a; Java中由子类构造器生成的父类的getclass.getName不是父类的类名而是子类的类名&#xff0c;因此不可以用子类构造器生成的…

2023年【安全员-B证】新版试题及安全员-B证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证新版试题参考答案及安全员-B证考试试题解析是安全生产模拟考试一点通题库老师及安全员-B证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-B证免费试题学员顺利通过考试。 1、【多选题】下列哪些属…

HTML表格学习

HTML学习笔记二 HTML表格&#xff1a; HTML 表格由 标签来定义。 HTML 表格是一种用于展示结构化数据的标记语言元素。 tr&#xff1a;表示表格的一行。td&#xff1a;表示表格的数据单元格。th&#xff1a;表示表格的表头单元格。 数据单元格可以包含文本、图片、列表、段…

Scala爬虫实战:采集网易云音乐热门歌单数据

导言 网易云音乐是一个备受欢迎的音乐平台&#xff0c;汇集了丰富的音乐资源和热门歌单。这些歌单涵盖了各种音乐风格和主题&#xff0c;为音乐爱好者提供了一个探索和分享音乐的平台。然而&#xff0c;有时我们可能需要从网易云音乐上获取歌单数据&#xff0c;以进行音乐推荐…

8086读取键盘-磁盘输入

文章目录 前言1.从键盘读数据2.磁盘读数据 前言 想过一个问题没有&#xff0c; 8086是如何从键盘中接受输入的&#xff1f; 8086如何将字符在显示器上显示的&#xff1f; 8086如何从磁盘中读取数据的&#xff1f; 上面的问题都是没有操作系统的时候&#xff0c;比如bios的那段…

Hive 知识点八股文记录 ——(一)特性

Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差&#xff08;应用于海量数据&#xff09;存储、计算能力容易拓展&#xff08;源于Hadoop&#xff09; 支持这些特性的架构 CLI&…

python解析xmind统计测试用例/测试点 个数及执行情况

前言&#xff1a;统计的是每个分支最后一个节点的状态 xmind版本 23.0911172 标记打开位置 标记规则如下 解释&#xff1a; res {"total": 0, "pass": 0, "fail": 0, "no_result": 0, "unfinished": 0, "now_fail…

SUSE 12双网卡绑定

原创作者&#xff1a;运维工程师 谢晋 SUSE 12双网卡绑定 客户环境及需求网卡绑定 客户环境及需求 客户一台物理机安装了SUSE 12的操作系统&#xff0c;需要将ETH5和ETH7双网卡聚合为一块虚拟网卡&#xff0c;以保证一块网卡故障不会影响系统正常运行。 网卡绑定 输入命令c…

C++冒号的作用域

当同时定义了一个全局变量a和局部变量a&#xff1a; 结果输出了局部变量的10&#xff0c;因为程序遵循就近原则。 :: 代表全局作用域 如果想无视就近原则&#xff0c;打印全局变量的a&#xff0c;就在输出时把a的前面加两个冒号。 ::

机器视觉目标检测 - opencv 深度学习 计算机竞赛

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

推荐能用ios端磁力下载工具

关于ios端磁力下载工具&#xff0c;之前的文章给大家介绍过2个&#xff0c;分别是雷电下载和闪电下载。但是如今因为不可抗力和苹果商店对于磁力下载和云盘功能的限制&#xff0c;目前这两款工具已经不能够使用了。也就是说免费的下载工具已经没有了&#xff0c;毕竟实现ios端这…

Ubuntu 20.04源码安装git 2.35.1

《如何在 Ubuntu 20.04 上从源代码安装 Git [快速入门]》和《如何在 Ubuntu 20.04 上安装 Git》是我参考的博客。 https://git-scm.com/是git官网。 lsb_release -r看到操作系统版本是20.04。 uname -r看到内核版本是5.4.0-156-generic。 sudo apt update更新一下源。 完…

STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能

项目描述&#xff1a;该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程&#xff1b;硬件环境&#xff1a;单片机为STM32G030C8T6&#xff1b;物联网模块为EMW3080V2-P&#xff1b;网联网模块的开发板为MXKit开发套件&#xff0c;具体型号为XCH…

【RPC】前传

前传 本地程序用的go语言&#xff0c;想把main.go程序当中一些计算工作放到服务器上进行&#xff0c;而只需要把结果给我即可。由于平台上暂时不能运行Go代码&#xff0c;所以写的是python文件。 1、主要是使用ssh依赖进行连接&#xff0c;但是大概率是需要手动添加的&#xf…

JVM Native内存泄露的排查分析(64M 问题)

我们有一个线上的项目&#xff0c;刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G&#xff0c;这明显不合理&#xff0c;于是进行了一些分析找到了根本的原因&#xff0c;下面是完整的分析过程&#xff0c;希望对你有所帮助。 会涉及到下面这些内容 Linux 经典的 64M…