zoukankan      html  css  js  c++  java
  • C#定时清理内存,net网页端可以尝试使用

    -- in class definition

    ——在类定义中

    [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]

    internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

    [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]

    internal static extern IntPtr GetCurrentProcess();

    -- code to call when you want to reduce the memory

    --要减少内存时调用的代码

    IntPtr pHandle = GetCurrentProcess();

    SetProcessWorkingSetSize(pHandle, -1, -1);

    使用SetProcessWorkingSetSize函数并不能提高什么性能,也不会真的节省内存,反倒往往会造成一些内存错误,造成应用程序或者系统不稳定,微软自己也建议在建立进程,线程,内核池,就必须小心的使用该函数。

    因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用。如果你强制使用该方法来 设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换。

    当我们的应用程序刚刚加载完成时,可以使用该操作一次,来将加载过程不需要的代码放到虚拟内存,这样,程序加载完毕后,保持较大的可用内存。

    这个东西一般就是整理内存的软件用来骗人的,或者是对于内存占用有强迫症的用户,拿这个安慰他们。

    内存占用量的数值有很多种,你看到任务管理器的那个privateworkingset,有些内存占用在这里看不出来,比如开线程占用的栈空间。实际上是要看virtualsize,如果32位程序超过了2GB,64位程序超过8TB,就会溢出。关于系统在资源方面的限制,做sysinternals的MarkRussinovich写过可以参考。.net本身在分配内存的时候也有些限制,比如就算是在64位下,byte[]最大也只能是2GB。也有些溢出的错误并不是真正的溢出,比如GDI+的有些错误也会被误报成溢出。定位内存泄漏有dotMemory/ANTSMemoryProfiler之类的工具可以用。它们就是监视一段时间的内存分配,在完全GC回收后,看还有哪些对象留下来,辅助你分析。

    在应用程序中,往往为了释放内存等,使用一些函数,其实,对于内存操作函数要谨慎使用,比如大家常常想到的 SetProcessWorkingSetSize,其实对于windows来说,系统会自动在程序闲置时(如程序被最小化)释放内存的,自己用内存释放 时,往往会造成一些莫名的内存错误,造成自己的应用程序及系统不稳定。

  • 相关阅读:
    curl 设置超时时间
    allure 2
    shell 给文件每一行都添加指定字符串
    shell 文件的包含
    shell 求数组的平均值,求和,最大值,最小值
    shell 编写进度条
    shell 换行与不换行
    Linux常用命令简述--dirname与basename
    shell中脚本参数传递getopts
    Shell 中eval的用法
  • 原文地址:https://www.cnblogs.com/njccqx/p/9972851.html
Copyright © 2011-2022 走看看