2

我使用全新安装的 qt 5.1.0 64 linux。

我使用示例应用程序 qtbase/examples/widgets/widgets/lineedits 并运行,我们称之为 qt5_lineedit,我也从 qt4 源中获取类似的应用程序,使用 qt4 库构建它并运行。

在 htop 中我看到,有两个 qt5_lineedit(我只运行一个,所以它使用了 2 个线程)和内存使用量:VIRT 223M RES 18268。

而对于 qt4_lineedit 只存在一个进程并且它会吃掉:VIRT 126M RES 15848。

所以,

  1. 为什么qt5默认使用两个线程?
  2. 为什么虚拟内存大小差异如此之大?

更新。

尽管 qt5_lineedit 使用 2 个 pid,但它们不是进程,而是线程。所以关于 qt4_lineedit 的信息看起来像:

VmPeak:   130936 kB
VmSize:   130932 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     17140 kB
VmRSS:     17140 kB
VmData:     4524 kB
VmStk:       136 kB
VmExe:        28 kB
VmLib:     48232 kB
VmPTE:       220 kB
VmSwap:        0 kB
Threads:        1

有关 qt5_lineedit 的信息如下所示:

VmPeak:   278020 kB
VmSize:   228584 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     18268 kB
VmRSS:     18268 kB
VmData:    77468 kB
VmStk:       136 kB
VmExe:        28 kB
VmLib:     50056 kB
VmPTE:       288 kB
VmSwap:        0 kB
Threads:        2
4

2 回答 2

4

第二个线程(不是进程)来自XCB QPA 插件,它产生一个线程来轮询 XCB 事件。(我不知道这是为了解决 XCB 错误、XCB API 还是什么。)

通常,您无法通过查看 VM summaries 来比较两个进程的内存使用情况。您需要正确分析进程的内存映射/proc/pid/maps(此外,如果您发现动态分配的内存存在差异,则需要使用堆分析器(例如 valgrind 的 massif)进一步分析每个进程的使用情况。

谁说分析内存使用是一件容易的事?:)

于 2013-07-13T10:27:51.823 回答
1

我在一个简单的应用程序中发现了一些关于多线程的东西,这可能很有趣:http: //qt-project.org/forums/viewthread/10656

我自己可以想到,(我们可能都知道)QCoreApplication运行它自己的事件队列。为了实现这一点,它需要一个独立的线程来不阻塞主线程的执行。

关于内存使用我没有具体的线索,但可能是由于 Qt 绘制其小部件的方式发生了变化。

苏龙仔

于 2013-07-10T06:46:12.790 回答