paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法

作者Attilax ,  EMAIL:1466519819@qq.com

需要的效果是,监测内存占用,当物理内存占用超过99M时,调用SetProcessWorkingSetSize方法回收内存。。
在WIN7任务栏,工作集(工作设置内存)指的是程序使用的整个内存(缓存+物理内存),而内存 - 专用工作集,它是工作集的子集,它专门描述了某进程所占用的物理内存大小。

引用 MOLEI.DLL
代码:
   private void Form1_Load(object sender, EventArgs e)
        {
   new memory().start();
}

--------------------框架内全部源码:------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace m
{
    class memory
    {
        internal void start()
        {
          
               //c452308 add txt2list
          Thread t = new Thread(new ParameterizedThreadStart(
          delegate(object obj)
          {
             
              while (true)
              {

Thread.Sleep(3000);
                  float mem=getMem();
                  if(mem>99)
                  {
                      ClearMemory();
                      Console.WriteLine("--timex clr mm clear finish " + filex.getFilename());
                  }
                  Console.WriteLine("--timex clr mm "+filex.getFilename());

}

}));
          t.Name = " --start timex thread 4 clear memory";
          t.IsBackground = true;
          t.Priority = ThreadPriority.Lowest;
          t.Start(null);
        }

private float getMem()
        {
            string procName = Process.GetCurrentProcess().ProcessName;
            using (PerformanceCounter pc = new PerformanceCounter("Process", "Working Set - Private", procName))
                  {
                        float r= (pc.NextValue() / 1024/1024);
                        return r;
            }
        }

#region 内存回收
        [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
        /// <summary>
        /// 释放内存
        /// </summary>
        public static void ClearMemory()
        {
                 GC.Collect();
            //     GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            }
        }
        #endregion
    }
}

检测程序使用最大内存的情况
-------------------------------

运行CLRProfiler,点击Start Application选择CLRProfilerTestDemo.exe,将会运行此程序,运行一段时间后,点击Kill Application,CLRProfiler将会保存日志显示分析结果

需要查看的参数:FINALLY HEAP  BYTES。指明程序实际最终使用的内存大小。。很可能总共使用过700,但是GC了680M,实际只有20M。。打开此直言图。。选中了大的块》》右键

》show who alocate.。。可以打开一个方法调用过程,其中的对象占用大小。。

垃圾收集统计信息:GC统计信息。总共进行了4501次0代垃圾回收!

其它性能调试工具:
---------------------
使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多
** Profiler API 概述
当各种事件发生时,CLR 将调用这个回调接口的方法(参见图 2)。 

  下面是需要注意的主要分析器回调方法:RuntimeSuspendStarted、RuntimeSuspendFinished、RuntimeResumeStarted、ObjectAllocated、ObjectsAllocatedByClass、

MovedReferences、RootReferences 和 ObjectReferences。
  
  如果不熟悉 Profiler API,可以阅读 Profiler.doc(位于 Visual Studio .NET 安装目录下面的 \FrameworkSDK\Tool Developers Guide\docs 文件夹中),来了解某些更

深入的信息。

总结:
-------------------
调用  GC.Collect();实际上不起任何作用,pass
..资料上说SetProcessWorkingSetSize只是把物理内存移至了硬盘缓存上。实际上,调用此方法,不管理缓存还有,物理内存都大大减少了..

参考:
------------
C#?Winform应用程序占用内存较大解决方法整理_原建顺_新浪博客.htm
.NET程序内存分析工具CLRProfiler的使用(性能测试)%20-%20一路看.htm
使用.NET Profiler API检查并优化程序的内存使用_雨枫技术教程网.htm
【NET程序性能分析 - 下篇】使用CLR探查分析。NET程序 - DebugLZQ - 博客园.htm
ANTS Memory Profiler 7.4 C#程序内存分析工具 非破解 免费14天 - 下载频道 - CSDN.NET
使用CLR Profiler分析.NET程序内存不断上升的图文教程
使用 SetProcessWorkingSetSize 降低程序内存_无牙子的流水账簿_百度空间.htm
.NET(C#):获取进程的内存私有工作集 - _Mgen - 博客园.htm
windows 7 任务管理器 内存相关项目的解释_2012-7-16_NetNote_网记.htm
Performance Counter的使用 - jiangxinyu的专栏 - 博客频道 - CSDN.NET.htm

paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法相关推荐

  1. windows7系统内存占用过高的解决方法

    电脑的内存空间取决了电脑的运行流畅度,时间一久内存就会爆满导致占用过高这样就会使电脑变得延迟,那么windows7系统内存占用过高怎么办呢?下面就一起来看看windows7系统内存占用过高的解决方法吧 ...

  2. win10内存占用率过高怎么办_DNF:WIN10玩DNF卡顿,内存占用过高的解决方法

    无论你是喜欢正经的职业百科还是搞笑的DNF趣事,点点关注不迷路 小编会努力继续给大家带来干货满满的文章,您的关注和收藏是最大的支持~ 各位勇士新年快乐,今天是初二了,祝大家玩的开心. 今天给大家分享一 ...

  3. 电脑开机内存占用过高的解决方法

    以win11为例: 打开电脑控制面板->硬件和声音->电源选项->选择电源按钮的功能(左边第二行)-> 点击更改当前不可用的设置->取消启用快速启动选项->保存修改 ...

  4. Gitlab内存占用过高的解决方法

    一.背景:最近使用Jenkins发布项目的时候,出现卡死的情况.然后,就去服务器跟踪具体情况,经过分析,发现CPU占用率在90%-100%之间波动.然后通过Linux命令:top -c查到与Gitla ...

  5. php 多核cpu,paip.提升性能--多核cpu中的java/.net/php/c++编程

    paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http ...

  6. paip. 提升性能---hibernate的缓存使用 总结

    paip. 提升性能---hibernate的缓存使用 总结 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  7. paip.提升性能----硬盘不同转速不同缓存对比转

    paip.提升性能----硬盘不同转速不同缓存对比转 西数 WDC WD2500BEVT-08A23T1 ( 250 GB / 5400 转/分 ) 5400转 8M缓存 单碟250 GB 产品   ...

  8. android内存检测方法,Android_Android系统检测程序内存占用各种方法,1.检查系统总内存 复制代码 - phpStudy...

    Android系统检测程序内存占用各种方法 1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal:         840868 kB ...

  9. linux free 命令以及系统内存占用过高的处理方法

    linux free 命令以及系统内存占用过高的处理方法 [root@localhost ~]# free -mtotal used free shared buff/cache available ...

  10. 荣耀linux版开机内存占用高,win10开机内存占用50怎么办_win10一开机内存就占用过高的解决方法...

    win10开机内存占用50怎么办?相信很多用户都遇到过这种情况,但内存占用过高会导致我们使用电脑变得很不流畅,那要怎么解决这一问题呢?下面小编就以win10旗舰版为例,来为大家整理了win10一开机内 ...

最新文章

  1. 构建高性能的ASP.NET应用(五)-如何开始寻找性能瓶颈
  2. python【蓝桥杯vip练习题库】ALGO-140 P1101(提货单)
  3. python中的栈结构_对Python列表进行封装和二次开发实现自定义栈结构
  4. Boost:重复计数器测试程序
  5. 一些著名的软件都用什么语言编写?
  6. SpringBoot 2.x 集成 Redis
  7. python 图像变化检测_python hough变换检测直线的实现方法
  8. [css] css图片缩放失真出现锯齿的如何解决呢?
  9. 如何使用WebUploader。
  10. Shell.FlyoutHeaderTemplate
  11. oracle滚动统计,sql – 按月滚动或运行Oracle总计
  12. 芬兰开放「线上 AI 速成班」,全球网民均可注册【智能快讯】
  13. 计算机上播放时没声音什么故障,电脑播放视频没有声音是什么原因
  14. 在IDEA里jsp项目图片显示不出来(图文解答)
  15. 这样设计积分兑换系统,让你的用户“活”起来
  16. html5第一人,5点证詹皇仍完压杜少坐稳第一人 死神万年老二或无翻身之日
  17. 阿里云oss对象存储的使用
  18. C#开发ActiveX控件及指纹采集
  19. [Unity框架] SimpleMiniForUnity 用于Unity单机游戏的迷你框架
  20. 【计算机网络】物理层 : 编码与调制 ( 基带信号 | 宽带信号 | 编码 | 调制 )

热门文章

  1. 面试官:请手写一个 webpack 4.0 配置
  2. PLSQL中的RECORD小例子
  3. mysql执行大量的操作时,报无法连接数据库的错误
  4. 单机数据库优化的一些实践
  5. Partition does not end on cylinder boundary
  6. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  7. JavaSE基础笔记一
  8. difference softreference and weakreference
  9. [java实战篇]--java的GUI(1)
  10. LCS2005标准版部署