xLoneStar 发表于 2005-9-21 23:57:25

gtk 程序内存使用初探

最近因为遇到一个朋友的 Linux 系统内存紧张的问题,引起了我对 GUI 程序内存占用量的疑惑,我决定在普通 Linux 上试验一下。

我首先试验纯 gtk 程序。使用的是 http://bo.majewski.name/bluear/gnu/GTK/plain/ 提供的一个 gtk hello world 程序。程序很短,功能很简单,比较有参考价值。

这是一个只打开单个窗口的简单程序,我的试验的方法很简单,就是在每行代码后面都加上暂停,然后用 ps 看该进程的 RSS 段的大小。经过一番努力我得到了一下的数据:

程序刚开始运行时:1384K
做完 gtk_init 后:   2820K,增加了1436K
做完 gtk_window_new 后:3630K,增加了1210K
做完 gtk_window_set_default_icon_from_file 后:3872K,增加 242K
做完 gtk_container_add 后:3928K,增加 56K
做完 gtk_widget_show_all 后:5124K,增加了1196K
做完 gtk_run 后,5284K,增加了 160K

接下来我尝试分析一下得到的数据。首先,在程序刚开始执行时,此时还没有任何动作,这个程序已经占用了 1384K 内存,我觉得此时可以理解为这些是全部代码段的长度。如果是这样的话那就没问题,因为这 1.3M 将在所有 gtk 程序间共享,启动一个占用 1.3M,启动10个还是这么点。

接下来是 gtk_init。gtk 除了要初始化自己外,首先要把底层的 glib 给初始化了,包括 gtype 和 gobject。这一步内存占用增加了 1.4M,我猜想这应该是整个 gtk+ 库的类型系统构建完毕后所占的内存吧,毕竟此时还没有调用任何有关的函数。这1数字已经很惊人了。

接下来的事情就不太好理解了。创建一个窗口,占去了 1.2M 内存,而装入一个 106x72 的 png,消耗了 242K 内存。不太理解有什么地方有如此之大的数据。

最后,调用 gtk_widget_show_all 后,应该是将整个窗口给映射到了 X Window 之上。这步也耗用了 1.1M 内存,可能与 X 有点关系。

总之,一个什么都不做的单窗口 hello world 程序,在我 gtk 2.8.3 和 xorg 6.8.2 的电脑上,耗用了整整 5.2M 的内存。而如果你的某种嵌入式设备只有 45M 内存,这样的程序你9个都跑不到。这还没算 X Server 所占的内存。而通常一个 gnome 桌面,这样的进程要启动数十个。

最后,为了将 glib 从 gtk 中分离出去,我写了一个只有2行的什么都不干的 glib 程序,代码如下:

GMainLoop* mainloop = g_main_loop_new(NULL, 1);
g_main_loop_run(mainloop);

它与那个 gtk 程序有着一样的代码段大小。当运行起来后,该程序占用的内存是 1516K,也就是说 glib 自身只占用了 132K。虽然也不小,但相比之下是小得多的。

如此之大的内存占用,制约着 Linux 在嵌入式设备、移动设备等小系统上的应用,甚至导致稍旧一些的电脑跑最新的 Linux 桌面都显得吃力。现在这已成了急待解决的一个问题了。

积木 发表于 2005-9-22 02:03:31

这可不太容易阿。。。这要求开发人员个个都对底层有相当的敏感

ltkun 发表于 2005-9-22 08:39:51

不会有人在嵌入式上跑真正的gtk的程序 这是其一 要跑也跑个什么gtk----之类的
其二开十个gui程序在pda或者手机上 也不会有人这么无聊吧 我的e680一般也就开2到3个 切换起来就慢得不得了了

x11_yao 发表于 2005-9-22 11:46:24

nice work

我有点记不清了,Novell还是google以前提过有个GNOME瘦身研究课题。

xLoneStar 发表于 2005-9-22 12:08:01

不会有人在嵌入式上跑真正的gtk的程序
那么有人跑QT吧?道理并不变,最多我再补做个QT/e的试验

其二开十个gui程序在pda或者手机上 也不会有人这么无聊吧 我的e680一般也就开2到3个 切换起来就慢得不得了了
你在你的手机上 ps ax|wc -l 看看,再 free 看看:lol::lol: 问题就是因你的手机而起的

pupilzeng 发表于 2005-9-22 19:42:24

http://live.gnome.org/MemoryReduction

mandrakechina 发表于 2005-9-22 20:59:29

Opera is so fast a progrm in Nokia and SE phones :)

neptune 发表于 2005-9-24 00:40:19

严重同意,gnome-panel的小插件每一个都占去三十多m的内存了

xLoneStar 发表于 2005-9-24 01:24:49

严重同意,gnome-panel的小插件每一个都占去三十多m的内存了

这也明显是误解,呵呵。如果每个applet都要30多,你256M内存只能放几个 applet 呀?占用的物理内存数要看 RSS 段,每个 applet 平均也就是6、7M的样子。何况其中还要扣除可共享的代码段的长度,因为所有 applet 都要装入共同的一套 gnome library,它在内存中是共享的,只有一份。

所以有人说真正的内存占用应该看 RSS - SHARE 的值,这样一减的话,每个 applet 都1M 也不到。

neptune 发表于 2005-9-24 16:00:54

:o 原来如此

kakuyou 发表于 2005-9-26 22:19:57

斗胆提一句

段大小并不是真的消耗了那么多的物理内存。

xLoneStar 发表于 2005-9-27 09:26:35

你是指他们也可能被 swap out 是吗?
页: [1]
查看完整版本: gtk 程序内存使用初探