QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1877|回复: 11

gtk 程序内存使用初探

[复制链接]
发表于 2005-9-21 23:57:25 | 显示全部楼层 |阅读模式
最近因为遇到一个朋友的 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 程序,代码如下:

[code:1]GMainLoop* mainloop = g_main_loop_new(NULL, 1);
g_main_loop_run(mainloop);[/code:1]

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

如此之大的内存占用,制约着 Linux 在嵌入式设备、移动设备等小系统上的应用,甚至导致稍旧一些的电脑跑最新的 Linux 桌面都显得吃力。现在这已成了急待解决的一个问题了。
发表于 2005-9-22 02:03:31 | 显示全部楼层
这可不太容易阿。。。这要求开发人员个个都对底层有相当的敏感
回复

使用道具 举报

发表于 2005-9-22 08:39:51 | 显示全部楼层
不会有人在嵌入式上跑真正的gtk的程序 这是其一 要跑也跑个什么gtk----之类的
其二开十个gui程序在pda或者手机上 也不会有人这么无聊吧 我的e680一般也就开2到3个 切换起来就慢得不得了了
回复

使用道具 举报

发表于 2005-9-22 11:46:24 | 显示全部楼层
nice work

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

使用道具 举报

 楼主| 发表于 2005-9-22 12:08:01 | 显示全部楼层
[quote:e6662d0286="ltkun"]不会有人在嵌入式上跑真正的gtk的程序[/quote]
那么有人跑QT吧?道理并不变,最多我再补做个QT/e的试验

其二开十个gui程序在pda或者手机上 也不会有人这么无聊吧 我的e680一般也就开2到3个 切换起来就慢得不得了了

你在你的手机上 ps ax|wc -l 看看,再 free 看看     问题就是因你的手机而起的
回复

使用道具 举报

发表于 2005-9-22 19:42:24 | 显示全部楼层
http://live.gnome.org/MemoryReduction
回复

使用道具 举报

发表于 2005-9-22 20:59:29 | 显示全部楼层
Opera is so fast a progrm in Nokia and SE phones
回复

使用道具 举报

发表于 2005-9-24 00:40:19 | 显示全部楼层
严重同意,gnome-panel的小插件每一个都占去三十多m的内存了
回复

使用道具 举报

 楼主| 发表于 2005-9-24 01:24:49 | 显示全部楼层
[quote:8860162362="neptune"]严重同意,gnome-panel的小插件每一个都占去三十多m的内存了[/quote]

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

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

使用道具 举报

发表于 2005-9-24 16:00:54 | 显示全部楼层
原来如此
回复

使用道具 举报

发表于 2005-9-26 22:19:57 | 显示全部楼层
斗胆提一句

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

使用道具 举报

 楼主| 发表于 2005-9-27 09:26:35 | 显示全部楼层
你是指他们也可能被 swap out 是吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-7 12:26 , Processed in 0.087789 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表