为什么这个简单的GTK3应用程序消耗了这么多内存?

时间:2017-06-24 13:17:30

标签: c gtk gtk3

我创建了一个简单的应用程序,它只创建并显示空的50x50窗口,但它已经消耗了20MB的内存。我的目标是低内存设备,所以每兆字节真的很重要。是什么导致GTK消耗所有内存?是否可以减少内存使用量?

这是该计划的完整源代码:

#include <gtk/gtk.h>
int main(int argc, char* argv[]) {
  gtk_init(&argc, &argv);

  GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DOCK);
  gtk_window_set_default_size(GTK_WINDOW(window), 50, 50);
  gtk_window_move(GTK_WINDOW(window), 50, 50);

  gtk_widget_show_all(window);
  gtk_main();
  return 0;
}

这是我编译的内容:

gcc -std=gnu99 -Wall -o example main.c $(pkg-config --cflags --libs gtk+-3.0)

这是由此产生的内存使用情况:

$ ps -FC example
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
platon    4214 11052  7 84812 20996   1 16:13 pts/5    00:00:00 ./example

(ps以KB为单位测量内存使用量,以便20996KB或~21MB)

我在linux 4.11.6,x86_64上使用gtk3版本3.22.16。

问题上下文:目标系统是相对低内存的PC(200-400 MB内存)。应用程序是该PC上的类似于kiosk的界面,具有相对复杂的GUI结构(许多页面和可能的交互)。而且我宁愿避免手动重新实现所有GUI逻辑(在较低级别的库之上),所以我正在寻找更高级别的东西 - 而且似乎在该空间中只有GTK和Qt(Qt是只能从C ++中使用,这很痛苦。)

2 个答案:

答案 0 :(得分:2)

我在后台运行您的程序(使用-O1优化),而不是使用pmap(1)来观察其(虚拟)内存映射。它在Debian / Sid / x86-64上的349个内存段中消耗335752K(即335Mbytes)。加载了77个不同的共享库。顺便说一句,只要你使用文本和字体,它们也会进入虚拟地址空间。 ps -FCSZ提供约84Mb,为RSS提供约21Mb(另请注释,使用pmap -x,以获取RSS详细信息)。

您应该在自己的(目标)系统上使用pmap,并得出有关消耗内存的结论。如果pmap不可用且流程有pid 1234,请参阅/proc/1234/maps(提供与<{1}}相同的信息并由pmap解析),阅读proc(5)

BTW我对这么高的消费并不感到惊讶。想一想GUI所使用的所有隐含资源(您可以通过研究pmap的输出或使用strace(1) ...来猜测)。另请参阅this answer并按照我在那里给出的链接。我的观点是,在实践中你需要一个千兆字节(或至少一半)的RAM(比如大多数RaspberryPI)来运行像Qt或GTK这样的现代GUI工具包。请注意,今天一块GB的内存非常便宜,因此您的公司可能需要销售数百万台设备才能支付数年所需的额外开发工作,以满足几百兆的需求。

(也许您最好使用libsdl或libX11等较低级别的内容,但请参阅this

  

所以每兆字节确实很重要

然后你不需要一个成熟的GUI工具包(或者你应该买一个带有千兆字节RAM的更强大的硬件)。您可以仅针对原始Wayland(或X11)display server(以牺牲多年的开发工作为代价,或者接受一个不那么复杂的GUI)。 BTW QT(也许还有GTK)有专门的嵌入式或帧缓冲变体(可能会略微减少资源消耗)。

PS。我猜你的操作系统是Linux的一些变种;我建议阅读一些教科书,如Operating Systems : Three Easy Pieces(自由和合法下载),以便更好地了解操作系统的工作原理。

答案 1 :(得分:2)

在声称您的进程占用大量内存之前,您应该回答以下问题:

  1. 添加更多小部件时,RAM的数量会增加多少?内存成本很可能是20 MB + 0.1 MB * k,其中k是小部件的数量。
  2. 除了GUI之外,您还有多少个进程。如果每个小部件的成本小于0.1 MB(我相信只要你不加载巨大的图像),你可以有1000个小部件没有任何问题,只要你不运行任何需要大量内存的东西
  3. 此外,由于您的目标系统的ram小于1 gig,因此请研究以32位模式运行的可能性以及该环境中的内存使用情况。这将减少每个指针的大小为2。这主要影响指针重的应用程序。