内存占用问题

3

我只是好奇,我在Unix系统中有一个大小约为9MB的二进制可执行文件。这是否被认为是大的内存占用?客户端将调用此文件以生成一些值,并随后在其他地方排队消息。我只是好奇,如何知道程序的内存占用过大,并且需要提供静态库而不是可执行文件呢?


每当我为Linux编译SDL MAME时,通常会得到一个30或40 MB的二进制文件。 - dreamlax
1
我们销售一个Delphi dll,其大小可达80MB。 - sum1stolemyname
因此,这里的共识是9MB的可执行文件并不是什么大问题。这将在Solaris服务器上运行,我100%确定他们有足够的空间。我只是感觉以这种格式获取它对他们来说可能不太方便,而静态库则更好。尽管如此,由于他们是一个小客户,相比我们最初要求它成为可执行文件的非常大的客户,我提供给他们的可能性较小。 - djones2010
愚蠢的问题...你是在发布模式下编译(开启优化,没有调试信息)并从可执行文件中剥离符号吗?我正在开发一个控制台程序,在调试模式下超过10MB,在发布模式下缩小到1MB。 - Emile Cormier
这是在Unix系统下完成的,而不是Windows系统。但我有Windows版本,请问您能否在Visual Studios 08中发布优化版本的说明?我认为那会很有用。谢谢。 - djones2010
我本人是个gcc的人,已经很久没用Visual Studio了。如果要进行编译时优化,请查看此MSDN页面:http://msdn.microsoft.com/en-us/library/8f8h5cxt%28v=VS.90%29.aspx。如果要剥离符号,则此MSDN页面可能有所帮助:http://msdn.microsoft.com/en-us/library/y87kw2fd%28VS.90%29.aspx。 - Emile Cormier
5个回答

5

一切都是相对的。如果应用程序在只有8MB RAM的机器上运行,它的占用空间就很大。如果应用程序在64GB RAM的机器上运行,它的占用空间就不算大。但是,如果一些巨大的Oracle实例(例如)占用了大部分RAM,即使在64GB RAM的机器上,它可能仍然很大。

你还应该考虑到,只有9MB的一部分实际上被加载到RAM中--readelf或objdump工具可以向你展示确切的加载量。


1

这完全取决于你从这9MB中获得了多少价值。例如,如果该文件只添加了一些数字,则明显太大了。然而,在如今一个服务器可以轻松拥有超过8GB的内存的情况下,9MB并不算太多。

相比之下,启动一些虚拟机可能会使用超过50MB的内存。


2
我认为OP关心的是可执行文件的大小,而不是内存使用情况。 - sum1stolemyname

1

回到1996年,我通常为一家顶级CAD/CAM供应商创建可执行文件(静态链接),这些文件的大小通常在32到50MB之间,具体取决于平台。是的,在每MB 40美元的时代,我们设法用我们的程序填满了系统。在1996年。鉴于此,今天我看到的所有与软件膨胀有关的东西都让我很生气,因为那个程序在启动时所做的事情比大多数人整天所做的事情还要多。:-)

因此,除非它是“helloworld.exe”,否则9MB在今天并不算太多。


是的,对于一些人来说,使用静态库似乎更容易。但我们部署这个可执行文件是因为,首先我们不想分享我们的代码,其次较大的客户希望这样做,所以这样做很顺利。然而,一个与较大客户做同样事情的较小客户只想要一个静态库,因为这对他们来说更容易。为了避免今后更多的开发/测试和维护问题,我坚持自己的观点,并要求他们只需调用可执行文件即可获得所需内容。 - djones2010

1

听起来很正常。通过静态链接到各种库或启用调试符号,您很快就可以达到9MB。


0

我有1.5TB的硬盘空间。我可以在我的磁盘上放174762个该二进制文件的副本。

至于内存,也许如果那个二进制文件中有9MB的代码(我非常怀疑),那么可能所有内容都会被保存在内存中。

否则,可执行加载器可能只会加载它需要的部分,如果有一些资源或未映射的二进制文件部分,在整个运行时不需要一直保存在内存中。无论如何,您可能至少有1-4GB的内存,所以这显然不是问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接