none
IE11打印时发生内存泄漏 RRS feed

全部回复

  • 你好,

    据我所知,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

    内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出來。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确的。

    确认是否是内存泄露的方法很简单,首先你开着这个程序,过个5分钟左右再去看看这一段内存是否被释放了。

    然后你关闭这个程序看看这段内存是否消失。

    从这两点我们能够看出是否是内存泄漏的问题。

    并且你观察的是printtemplates.exe所占内存的情况,我们并不清楚这个程序是如何设计的,所以不能判断是IE的内存泄漏导致这个内存升高。

    2016年9月29日 8:49
  • 你好,

    谢谢回复!

    但是我还想继续问个与COM组件代码相关的问题,就是我在用IE11打印时,程序中调用到下面的函数:

        IOleCommandTarget::Exec()

    该函数声明如下:

    HRESULT STDMETHODCALLTYPE Exec(
        __RPC__in_opt const GUID *pguidCmdGroup,
        DWORD nCmdID,
        DWORD nCmdexecopt,
        __RPC__in_opt VARIANT *pvaIn,
        __RPC__inout_opt VARIANT *pvaOut)

    第一个参数的取值,我只能找到两个:NULL(也就是standard group)和CGID_MSHTML;

    第二个参数就是打印命令,对应第一个参数命令组,分别是OLECMDID_PRINT(或OLECMDID_PRINT2)和IDM_PRINT;

    第三个参数,我设置为OLECMDEXECOPT_DONTPROMPTUSER;

    第四个参数是我一个本地模板文件的路径;

    第五个参数为NULL。

    我调用这个函数打印的结果如下:

    当第一个参数是NULL,第二个参数是OLECMDID_PRINT,打印10次后看任务管理器中进程 iexplorer.exe 所占的内存,升高了728KB。

    我理解,这应该是由IE11的内存泄漏导致的。那怎么样才能避免内存泄漏?

    如果不是IE11的内存泄漏导致的,那我想问关于这个函数的使用问题。比如,第一个参数的取值还有哪些?目前这两个有什么区别? OLECMDID_PRINT2命令似乎并不支持,不知在哪种情况下可用?它与OLECMDID_PRINT命令有什么区别?其他参数具体应如何使用?



    2016年9月30日 3:30
  • 你好,

    这个问题我建议你可以使用一些IE的内存泄漏分析工具先去分析一下,首先确定是IE的内存泄漏然后再决定使用什么方法来避免它。、

    你可以使用sIEve和IE JavaScript Memory Leak Detector工具,具体的话你可以参照如下链接,

    http://www.cnblogs.com/quange/archive/2010/06/12/1756825.html

    另外,根据微软的文档并没有OLECMDID_PRINT2命令,链接如下(官方文档没有中文版)https://msdn.microsoft.com/en-us/library/windows/desktop/ms691264%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

    至于如何才能解决内存泄漏的问题,我的看法是:

    首先你要找到内存泄漏的原因,一般有循环引用,闭包等等。

    你要找到具体的原因才能谈如何避免。

    有关如何避免内存泄漏,你可以参照如下链接:

    http://bubkoo.com/2015/01/31/understanding-and-solving-internet-explorer-leak-patterns/

    2016年10月17日 2:45