是否有任何工具可以查看/编辑 Linux 上正在运行的进程的用户空间内存?
这将是一个很好的学习工具。
(Ubuntu Linux 服务器,64 位)我正在对刚刚下载的文件(~3.0 GB)进行故障排除,但是当我发现一些非常不寻常的东西时,它没有通过完整性测试。
首先这是下载后文件的MD5,与预期值不匹配:
~% md5sum media.iso
5d74facb904cc1765a468354908a8f34 media.iso
Run Code Online (Sandbox Code Playgroud)
一段时间过去了,在此期间应该没有任何更改文件,但是当我再次检查文件时:
~% md5sum media.iso
a5b97c5016afb39bd67ccfc3fa6ca59e media.iso
Run Code Online (Sandbox Code Playgroud)
这真是出乎意料。由于我有很多 RAM,我怀疑这是缓存的影响,并且出现了问题。我决定从磁盘重试整个文件,令我惊讶的是:
~% sudo sysctl -w vm.drop_caches=3 # This linux command invalidates
vm.drop_caches = 3 # everything in the memory cache.
~% md5sum media.iso
2992aa6270f6e1de9154730ed3beedc1 media.iso
Run Code Online (Sandbox Code Playgroud)
我重做了它,现在它似乎保持一致,尽管这仍然不是我期望的值。当然,内存缓存中的内容与磁盘上的内容不同。这是大问题。
为了修复下载,我在源机器上创建了一个 torrent 并在目标机器上打开它。大约 3.0GB 中的五个 1MB 块未通过完整性检查。我使用 torrent 来修复这些文件块以及文件完整性如何。
现在的问题是确定数据在何处不同步。
关于我还可以检查什么的任何想法,或者缺陷/错误到底可能在哪里?
它是 Ubuntu 10.10 64 位、Core …
不知道这是否是问这个问题的正确地方。
我一直在读 32 位操作系统(如我现在正在运行的 Ubuntu)不能处理超过 3.2gb 或 3.3gb 的 RAM 内存。
我记得在我的旧计算机体系结构课程中,内存限制是 2^32 个“指针”(不记得正确的词)。我的意思是,内存被表示为一个数组,CPU 可以直接访问它,但要达到它的限制。如果 CPU 是 32 位,那么它可以寻址 2^32 个字,如果它是 64 位 2^64,等等。
所以,如果我之前说的是对的,那么我的操作系统应该能够解决 2^32 = 4294967296 = 4Gb。
我在想,可能会为内核、缓存、缓冲或交换的特定用途保留某种空间。但是没有正确答案。
你能给我一个提示吗?
我想问一些问题:使用 nnn-3n(即 8-8-8-24、9-9-9-27 等)的 RAM 时序是否比其他没有(即 7- 8-7-21、9-9-9-24 等)?
我正在使用一台配备 8 GB RAM 的最新 MacBook Pro,在工作中使用它几个小时后,我注意到“活动”内存的数量在不断增长。
每当我重新启动 Mac 时,一切看起来都很好,而且几乎不使用任何 RAM。但几个小时后,它看起来像这样:

如您所见,在本例中大约为 4.3 GB。
作为开发人员,我知道“活动内存”是正在运行的进程当前使用的内存量。所以我做的第一件事就是退出所有应用程序并杀死所有似乎不属于 Mac OS X 的进程。
在我这样做之后,我的活动内存下降了大约 400 MB,但卡在了你在屏幕截图中看到的内容上。没有更多的进程或应用程序要退出。
现在我想知道到底是什么在保持记忆?top和活动监视器不报告任何具有高内存使用率的进程。
有任何想法吗?
谢谢!
感谢 Doug Harris 的回答,我制作了这张截图。它显示了 2.55 GB 系统范围的活动内存使用量,但该ps命令计算的内存使用量仅为 1.55 GB 。

我不确定 2.55 GB 的其余部分去了哪里或分配到哪里了。我安装了 Instruments,但由于这确实发生在几个小时的跨度内,因此很难使用 Instruments。这感觉就像操作系统中某处的内存泄漏。可能是驱动程序(尽管我没有安装任何内核扩展 - 使用 进行检查kextstat)。
我个人认为能够看到有关内存管理状态的“更多”信息会很有趣。在 Linux 下,“/proc”下有一些信息可用,afaik。
在将我兄弟的笔记本升级到 2GiB 后,我有一个 512MiB DDR2 SODIMM SDRAM。看到它没有被使用,它在市场上几乎没有任何价值,如果我能用它来放置页面文件,我会喜欢它。由于 Windows Vista/7 具有通过 USB 的 ReadyBoost,我想我可以使用它,前提是我首先有一个 DIMM 到 USB 转换器解决方案。有任何想法吗?
(因为我的 1 插槽 MicroDIMM Fujitsu 平板电脑有 1GiB,而 2GiB 晶圆至少要 100 美元,我很伤心,而且我已经破产了,而且是 NEET)
我买了一台带有 4GB 内存的新笔记本电脑,可扩展到 8GB。它有 1 个 4GB 的 DDR3 PC3-12800,频率为 1600Mhz。我似乎无法在本地找到另一个完全相同的,我找到的最接近的是 1 4GB DDR3 PC3-10600 1333Mhz。所以我的问题是,我知道它们都会以最慢的速度运行,所以即使我有更多的可用 RAM,它也会变得更慢。性能损失大到让升级不值得麻烦吗?
我遇到了服务器物理内存不足的问题,我无法辨别它是来自我的应用程序的 Java 进程还是服务器上的其他进程。让我们假设以下场景:
服务器物理内存:3747MB
Java -Xms64m
Java -Xmx512m
Java XX:MaxPermSize=512m
当我启动服务器时,操作系统 (RHEL) 使用您最喜欢的内存报告工具(top, cat /proc/meminfo | grep Mem, free -m等)报告正在使用 487MB 。当我启动我的 Java 进程(pid 123)时,它使用了大约 215MB 的物理内存(如 RES 内存报告的那样ps -f -p 123),使我使用的总内存高达 700MB 左右。
如果我让它运行一整天,我的进程的 RES 内存会稍微波动,但通常是一致的。然而,服务器总内存稳步增加约 1500MB,达到 2200MB。
如果我的 java 堆大小或 perm gen 堆在增长,它不会反映在进程的 RES 内存中吗?
此外,我似乎无法在任何地方考虑额外的 1500MB。
# ps aux | awk '{ RES+=$6 } END { printf("RES: %.2fMB\n", RES/1024) }'
RES: 722.23MB
Run Code Online (Sandbox Code Playgroud)
谁能帮我找回丢失的记忆?我基本上是想弄清楚这是我的应用程序问题,还是基础架构团队的服务器构建问题。
Cheat Engine是一种用于搜索和修改其他正在运行的进程的内存的工具。我曾经认为这非常简单:访问一个地址并简单地修改它。但我现在意识到事情并没有那么简单。每个进程都有自己的虚拟内存,两个进程不能玩彼此的内存。那么作弊引擎究竟是如何破坏进程隔离并修改其他进程的内存的呢?
我知道我可以使用 Activity Monitor(以及大量 3rd 方应用程序)来监控我的 Mac 上 RAM 和 CPU 的使用情况。但是,我想在一段时间内捕获日志,以便我可以比较进程之间的使用情况,而无需进行屏幕截图等。类似控制台的东西,如下所示:
Process A (5:22 - 5:32)
5:22:01: 2.2% CPU, 5 Threads, 111.1MB Real Mem
5:22:03: 2.1% CPU, 4 Threads, 90.4MB Real Mem
...
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?