怎么释放退出程序占用的内存?

玩一款垃圾游戏,每次故障,退出游戏,系统监视器已经显示程序退出,进程已经退出,但还占用100-200m内存,多次占用可观,但dmesg最后有2行显示,每次占用都是2行,电脑注销不能解决,重启可以解决。
怎么样能够不重启,能够释放垃圾游戏占用的内存?
我是真的认为那是一款垃圾游戏,就不说那块垃圾游戏名称避免误导。

是不是临时文件?检查 /tmp 以及 /dev/shm 以及 df -h -t tmpfs。

这个是怎么看出来的?

2行什么?

系统监视器有使用内存显示,看数字显示,几次后就明显。
为了不便利垃圾游戏改进,我编辑最后2行:
第一行:[ 1298.771371] AAAAAAA[1988]: segfault at 15c ip ********** sp BBBBBBBBBBB error E in UnityPlayer.so[CCCCCCCCCCCC] likely on CPU 3 (core N, socket 0)
[ 1298.771383]
第二行:Code: 一长串2位代码。
搜索看好像游戏驱动段错误,内核要卸载它,没有AAAAAAA.
有系统运行时候,看物理内存程序(文件)的命令吗?

哦,它崩溃了啊。问题不大。

所以是什么让你判断它没有释放内存?

vokoscreenNG-2024-04-13_13-33-46.705
很直观,多次故障退出,占用内存就会很多。
没有清理物理内存(对应位置)的命令吗?
内核卸载模块命令我知道,卸载驱动的命令不知道。
软件崩溃,ta退出不完全释放ta使用的内存,重启可以解决。
没有命令可以不重启释放内存吗?

哦,原来是这个。看看 free -h。

怎么可能有这种命令。

和「驱动」没有关系。

我看搜索,dmesg是内核加载“驱动”,还有用错误的core N 可以找出段错误的行。那太麻烦了,搞好还是编辑游戏错误了。
早期玩windows,好像有可以看物理内存加载的程序并可以删除。
就想着debian(linux),能不能删除物理内存的程序或文件。
现在已知程序退出,物理内存有残留,不能去除吗?好郁闷啊。

什么不知所云的说法……建议立即忘记。

程序不是已经退出了吗?

所以要找出来是在哪里占用了。我给你那么多命令你一个也不看,我能怎么办啊?

你身体不舒服去医院,医生给你开了好几项检查单,你一个检查都不肯做,医生能给你打针还是开药?

你前面说的几个,我都试过了,和我阐述的问题不一样,我就没有说。
其实,你已经回答没有清理物理内存的命令。
我还不死心,就继续聊了。
嗯,这问题,我发现这问题已经几个月了,很长时间了吧?
奇异的是,昨天游戏更新,故障依旧,今天系统更新几个xserver的包,刚才玩好久,dmesg没有那2行显示了,程序退出,也没有残留了。

你试完结果呢……

xserver 相关的话,大概是 X 资源的释放逻辑有问题,可以用 xrestop 命令查看。也有可能是 DDX 驱动。

其实你这个问题就很奇怪。「清理物理内存」,从字面意义上讲,我只能建议布巾和刷子……如果说「释放内存」的话,有些内存可以通过某种指令或者操作释放,有些内存你得杀掉不配合的进程,有些你只能重启。没有信息就没法判断你遇到的是哪一种。

经过仔细慎重的阅读理解,我想你的需求只有精通周易之人才能解答,因为凡夫俗子无法理解你遇到的问题的高深之处。不要和寻常人士人一般见识,依云甚至都没法理解你遇到的问题是什么(当然我也没懂,我承认在这方面功力不足)。

尽管我没办法回答你的问题,但是我这里有一本江湖上广为流传的武功秘籍,想必对于 Linux 学习研究的功力提升大有裨益:

非常好用,据我所知几乎每个研究操作系统和 Linux 内核的武功高手都学过这个。

如果打不开链接,我很乐意帮你再找一份更容易访问的副本 :innocent:

2 个赞

啊,还是我表达的问题。现在就是问,释放内存:程序退出,还有内存残留,怎么用指令把这内存释放?
重启释放已经确认可以。

我记得,好像是你,在其它帖我们俩聊软件源,你叫我另开新帖的,为了确认,我看我的帖子和你的信息,都没有看到。
我的系统软件源没有问题,就没有另开新帖。
提问的智慧,多年前,我已经仔细,全文阅读过,并拿来回复别人帖子,没有想到,今天能被你用来回复。
说江湖,道江湖,原本我想和依云说的一句话,怕你看见,觉得不如对你要说的话重要。
你很有潜力,是一个混江湖的奇才,江湖更替,要与时俱进,“我想”,“据我所知”这样的江湖菜鸟的特征字眼,会拉低你的段位。
很高兴能在这里遇到你,高楼万丈平地起,希望能和你在这里建高楼。

进行一次有效的交流的前提是双方能对基础概念达成共识,我不确定你对于此帖子中提到的若干概念是否能和我达成共识。视认知差异的程度,这会影响占卜的难度和准确性。因此,我认为澄清其中一些概念对于交流的展开是有益的。


操作系统分配和调度资源的单位叫“进程”,进程启动后,当它存活时,它可以向系统申请内存和各种资源;进程结束时会释放进程自身持有的资源

同时,进程也可以和其它进程进行通信,协作完成所需的功能:比如绘制窗口,使用显卡进行 3D 图形加速,或者使用其它进程间通信手段请求守护进程分配资源进行计算。

一般的,进程结束以后会正确释放其自身持有的资源,但是当某些边缘情况、程序错误或者程序设计错误发生时,某些资源可能没有被正确释放(这些资源并没有被已经结束掉的进程所持有),这种现象一般被称之为“泄露”。

例如:

或者:

由于操作系统及其上运行的软件非常复杂,所以如果不进行系统的详尽的分析是很难得出为什么游戏进程结束但是内存存在增长的原因的。

还有一个容易被忽略的误区是,统计操作系统当前可用内存不是一件显而易见的事。一方面,进程地址空间的资源分配有很多种不同类型(如进程独有的匿名内存页,可以在进程间共享的动态链接库,进程间通信的手段共享内存等),准确统计可用内存情况是几乎做不到的;另一方面,有些程序为了提高性能会使用缓存技术,有些时候不容易确定是否是缓存导致的内存占用升高(典型的例子比如文件系统的目录项缓存)。


关于内存管理,操作系统和用户代码设计了多个层级进行管理:

最底层有个概念叫做“虚拟内存”,这是一种管理内存资源和隔离进程的手段。现代计算机硬件支持被称为“内存管理单元(MMU)”的硬件,并且支持分级的特权管理功能。

MMU 的功能是 CPU 访问内存地址时并不会直接访问物理内存地址,而是通过操作系统维护的被称之为“页表”的查找表,该查找表将“虚拟内存地址”映射到实际的物理内存地址,CPU 会自动把被访问的虚拟内存地址转换成实际的物理内存地址后向内存发送数据读写指令。

与此同时,利用特权管理功能,只有操作系统内核才能在高特权级别运行管理 MMU 的指令,运行用户进程时处理器会进入低特权级别执行用户代码,操作系统通过这种方式就可以实现进程间隔离自己内核模式和用户模式的隔离。这样做的好处是当用户进程错误访问内存时不会破坏其它进程的环境,而且操作系统可以通过控制页表实现一些高级功能,如文件内存映射。

在虚拟内存这一硬件功能的基础上,操作系统提供了许多系统调用,进程可以通过执行这些系统调用进入内核态,由操作系统检查并分配请求的虚拟内存。当进程代码访问到相应的虚拟内存地址时,如果对应的物理地址还没有分配,就会触发“缺页中断”,此时操作系统才会实际分配物理内存。

在实际的应用中,程序往往不会直接使用系统调用,而是借助 C 运行库(一般是 glibc)对系统调用的封装进行内存申请,这样做简化了内存申请的细节,提高了代码的可移植性,还有助于提高内存申请和释放的性能。


因此对于你的问题,

没有这样的魔法。

首先需要确定是否真的存在内存泄露,然后需要定位是谁在泄露内存,最后才能知道怎么解决这一问题。如果你拒绝提供相关信息,别人也只能拿出水晶球,看看今天信号好不好了。

1 个赞

所以我的回复你是一个字也没看是吧?既然如此,我今后将不再阅读你的任何消息。再也不见。

哦,好走!

很高兴看到了你说到物理内存和虚拟内存,不像那谁要我拿布巾和刷子解决。
说到布巾,我就不好说,我其实说的“一长串2位代码”是内存代码,而错误,应该是unity的锅,unity好像上游已经没有支持,我也不想研究一长溜问题,搞成业余专家,为玩个游戏,不值得。
发个帖,还把那谁给气着了,我很惊讶,很意外,不过,觉得正常。
不是我不说内存位置代码,实在是游戏垃圾,不想有ta点滴信息影响帮助者,这是善意。
我是外行,但我相信,不重启释放占用内存肯定可以实现,所以就跑来这里问了。
楼好像盖歪了,又好像你说的更接近了。

我无法确定你是否具有相关的知识背景,暂且假设你不明白什么是“物理内存”,理由是如果你早已理解我上面写的回复在说什么,就不会有这样的荒谬提问:

至于

没有人有义务回答你的问题,更何况是在提问者完全不配合解决问题的情况下。如果你真的读过《提问的智慧》,我想这是显而易见的事。


当然,我写这么多回复并不是闲得无聊和你灌水,而是想提醒你既然不懂也不想懂技术细节(这是完全可以的,要求用户理解所有实现细节才能使用软件是不合理的),那请你至少稍微对技术细节有一点敬畏之心,不要盲目自信。

看看你之前发的帖子:

debian版本很多。 以前有双显卡切换包,现在新版本不知道还有没有。 amd核显是ati的,用开源驱动。nvidia现在版本系统仓库已经没有闭源驱动,要下载nvidia的run驱动安装。 bios设置不能选nvidia显卡吗?能选的话,不能直接说明吗? 你以最难配置练手linux,我很佩服你。

系统仓库真的没有闭源驱动吗?

https://packages.debian.org/search?keywords=nvidia-driver

https://packages.debian.org/search?keywords=nvidia-detect

这几个软件包都属于 non-free。如果你的配置里没写,当然无法安装。

敢不敢去看看debian维基?

建议你也看看 Debian wiki 学习一下什么叫 non-free。

至于你的显卡需要哪些包支持,我已经解释过了,不再赘述。

楼主说的不详细。 睡眠唤醒,用键盘的enter键,或者机箱电源键(像开机一样),等硬盘灯灭后,屏幕就亮,睡眠前屏幕。 主要的,现在多数是usb输入设备,如果楼主 bios设置没有启用iommu,输入设备又插在主板彩色usb口,键盘能唤醒才怪。

你是如何得出不启用 IOMMU 就无法使用键盘唤醒系统这一结论的?暂且不说内核参数的 iommu 和 BIOS 的 IOMMU 到底是用来干什么的(太复杂我不想说,自行搜索),该帖的楼主遇到的问题可能性有很多,如此自信地确定问题来源是 iommu 显然是不合理的,更何况问题并不是出在这。

说到这里我想引出一个概念:

最为知名的货物崇拜,是瓦努阿图塔纳岛的“约翰·弗鲁姆教”(John Frum Movement)。第二次世界大战太平洋战争时,美军于塔纳岛建立一临时基地。当时岛上的原住民看见美军于“大铁船”(军舰)内出来,皆觉得十分惊讶;他们也看到,有一些“大铁鸟”(军用飞机)运送穿着美军军服的人及许多物资。这些原住民看见这种情况均感到很惊讶,并觉得这些“大铁船”及“大铁鸟”十分厉害。加上美军也提供部分物资给原住民,而这些物资对原住民来说十分有用,结果这些原住民将美军当作神。

二次世界大战结束后,美军离开塔纳岛,只留下一些美军军服及一些货物。塔纳岛原住民便认为这些货物具有神奇力量,又相信“神”(美军)他日会回来并带来更多货物,使他们展开一个幸福新时代[5][6]。但是美军当然再也没有回来塔纳岛,因此这些原住民便自己发展出一套敬拜仪式,崇拜美军军服及货物[7];表现形式是原住民会穿着美军军服、升起美国国旗,图腾则是木刻的飞机。一般把这个新兴宗教称为“约翰·弗鲁姆教最为知名的货物崇拜,是瓦努阿图塔纳岛的“约翰·弗鲁姆教”。

最后我还想提一句,你的大多数回帖中汉语语法和句子结构都有待改善,比如:

我完全无法理解你在说什么。希望你下次发帖前能重新回忆一下语法基础,提高一下基本写作能力。

现在,楼是不是盖歪了?你的回复已经跑题,没有上一个帖子那么接近。
至于说,中文语法,下面一句话,不知道你理解不理解:
我好像离你很近,又好像很远。
如果不理解的话,是你要加强中文学习哦。不是我。
楼歪了,你怎么接?
另外,无论我软件源单有non-free,还是没有non-free,都没有nvidia-driver包。
原本“无论我软件源单有non-free,还是没有non-free”可以简单说“无论我软件源单是否有non-free",为了你好理解,多写一点。

不用再回复我了,时间宝贵,我不想把时间浪费在和你讨论这种毫无意义的事情上面。