paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法
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解决方法相关推荐
- windows7系统内存占用过高的解决方法
电脑的内存空间取决了电脑的运行流畅度,时间一久内存就会爆满导致占用过高这样就会使电脑变得延迟,那么windows7系统内存占用过高怎么办呢?下面就一起来看看windows7系统内存占用过高的解决方法吧 ...
- win10内存占用率过高怎么办_DNF:WIN10玩DNF卡顿,内存占用过高的解决方法
无论你是喜欢正经的职业百科还是搞笑的DNF趣事,点点关注不迷路 小编会努力继续给大家带来干货满满的文章,您的关注和收藏是最大的支持~ 各位勇士新年快乐,今天是初二了,祝大家玩的开心. 今天给大家分享一 ...
- 电脑开机内存占用过高的解决方法
以win11为例: 打开电脑控制面板->硬件和声音->电源选项->选择电源按钮的功能(左边第二行)-> 点击更改当前不可用的设置->取消启用快速启动选项->保存修改 ...
- Gitlab内存占用过高的解决方法
一.背景:最近使用Jenkins发布项目的时候,出现卡死的情况.然后,就去服务器跟踪具体情况,经过分析,发现CPU占用率在90%-100%之间波动.然后通过Linux命令:top -c查到与Gitla ...
- php 多核cpu,paip.提升性能--多核cpu中的java/.net/php/c++编程
paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- paip. 提升性能---hibernate的缓存使用 总结
paip. 提升性能---hibernate的缓存使用 总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- paip.提升性能----硬盘不同转速不同缓存对比转
paip.提升性能----硬盘不同转速不同缓存对比转 西数 WDC WD2500BEVT-08A23T1 ( 250 GB / 5400 转/分 ) 5400转 8M缓存 单碟250 GB 产品 ...
- android内存检测方法,Android_Android系统检测程序内存占用各种方法,1.检查系统总内存
复制代码 - phpStudy...
Android系统检测程序内存占用各种方法 1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal: 840868 kB ...
- linux free 命令以及系统内存占用过高的处理方法
linux free 命令以及系统内存占用过高的处理方法 [root@localhost ~]# free -mtotal used free shared buff/cache available ...
- 荣耀linux版开机内存占用高,win10开机内存占用50怎么办_win10一开机内存就占用过高的解决方法...
win10开机内存占用50怎么办?相信很多用户都遇到过这种情况,但内存占用过高会导致我们使用电脑变得很不流畅,那要怎么解决这一问题呢?下面小编就以win10旗舰版为例,来为大家整理了win10一开机内 ...
最新文章
- 构建高性能的ASP.NET应用(五)-如何开始寻找性能瓶颈
- python【蓝桥杯vip练习题库】ALGO-140 P1101(提货单)
- python中的栈结构_对Python列表进行封装和二次开发实现自定义栈结构
- Boost:重复计数器测试程序
- 一些著名的软件都用什么语言编写?
- SpringBoot 2.x 集成 Redis
- python 图像变化检测_python hough变换检测直线的实现方法
- [css] css图片缩放失真出现锯齿的如何解决呢?
- 如何使用WebUploader。
- Shell.FlyoutHeaderTemplate
- oracle滚动统计,sql – 按月滚动或运行Oracle总计
- 芬兰开放「线上 AI 速成班」,全球网民均可注册【智能快讯】
- 计算机上播放时没声音什么故障,电脑播放视频没有声音是什么原因
- 在IDEA里jsp项目图片显示不出来(图文解答)
- 这样设计积分兑换系统,让你的用户“活”起来
- html5第一人,5点证詹皇仍完压杜少坐稳第一人 死神万年老二或无翻身之日
- 阿里云oss对象存储的使用
- C#开发ActiveX控件及指纹采集
- [Unity框架] SimpleMiniForUnity 用于Unity单机游戏的迷你框架
- 【计算机网络】物理层 : 编码与调制 ( 基带信号 | 宽带信号 | 编码 | 调制 )
热门文章
- 面试官:请手写一个 webpack 4.0 配置
- PLSQL中的RECORD小例子
- mysql执行大量的操作时,报无法连接数据库的错误
- 单机数据库优化的一些实践
- Partition does not end on cylinder boundary
- Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
- JavaSE基础笔记一
- difference softreference and weakreference
- [java实战篇]--java的GUI(1)
- LCS2005标准版部署