使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)

使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)

使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)

文章分类:.net编程 关键字: memory leak, .net, .net memory profiler, https://www.360docs.net/doc/2f8891620.html,

做过应用诊断与优化的朋友都知道内存泄漏和带来的危害,对这种情况的分析和定位一般会比较困难,尤其在 .NET/Java 应用中,隐式的堆内存管理以及托管对象间纷繁复杂的引用关系,使分析和定位问题更加复杂。本文以我的了解,尽量说明了:

1.一种对 .NET/Java 托管内存类应用的内存泄漏分析和诊断方法;

2.使用 .Net Memory Profiler 工具对一个真实 https://www.360docs.net/doc/2f8891620.html, 应用中存在内存

泄漏问题的分析、诊断实践过程作为示例。

本文包括以下问题、不足:

1.本文以我的现有理解写成,尤其是“方法”相关的内容,每个人在不同情

况下会有不同的方式;

2.不是 .Net Memory Profiler 工具的全面讲解,实践中所涉及的功能仅是

为了定位这里 https://www.360docs.net/doc/2f8891620.html, 应用中的问题。可参见 .Net Memory Profiler 文档 。

.NET/Java 托管内存类应用的内存泄漏分析和诊断

方法

首先是些科普知识,理解的兄弟请自行快速跳过。

在托管内存管理中,“泄漏”意义不同与传统 Native 应用中的忘记显式释放(delete/delete[] 等)不同,当然对于非托管资源之类(如句柄等)还是需要在 Finalize (析构方法等同于 Finalize)方法中显式释放的,在托管内存管理中“泄漏”对象实例指的是,由于与 Root 对象集中的对象存在本应断开的引用关系,而让 GC 线程认为该对象还被使用,因而不能被释放,尽管其不再会被使用。决大部分情况下,由于应用(程序员)认为该对象不会存在了,而在再次使用时,又在托管堆中再次创建了该对象实例,可以想象这样的

后果很严重,随着创建次数增加堆内存会爆满。(托管堆中 G3 区爆满,G2 区无法腾出空间)。

GC 判断一个对象是否可以被释放是通过从被称为 Root 对象集中的根对象开始(如 Main 函数的 args 形参、static 变量及其对象成员等),遍历出所有被其引用的对象和子对象。GC 执行时通过标记这些引用中的对象,清除未标记上的对象来完成内存释放(标记、清理算法),当然清除也可能分步(如移送 Finalize 队列等)。由于标记、清理算法的中断时间等性能考虑,托管堆会分区(代),当前 CLR 是 3 代 – G1、G2、G3。伴随 Age(GC 一次 Age 加 1)增加,对象会逐渐从 G1 移送到 G3 代中(复制、整理算法),即 G1 是新生代,都是些短期对象,G3 是老年对象的永久居留地。需要说明的是,实际上在当前版本的 .NET CLR 中有 2 个托管堆(SOH 和 LOH),其中一个叫大对象托管堆(LOH),专门用来存放大于 84, 999 Bytes 的对象。程序只能在 SOH G1 和 LOH 中分配对象空间,只有 CLR GC 线程可以在 SOH 的 G2、G3 中分配(移送)对象。

明白上面的基本道理,下面看看和托管对象实例内存泄漏的图例:

上面图中表示的意思是使用一段时间后,堆中对象与 Root 对象的引用关系,其中颜色由浅到深表示了 Age 的因素。如果此时,GC 线程执行,堆情况将如下所示:

其中所有 Unreachable 的对象实例都将被 GC 所释放,这样托管堆内存会被正确回收。但需要说明的是,如果在 Reachable 的区域中(这部分 GC 是不会释放的),有一些被引用的对象在以后不会再使用,而且应用(程序员)在下次使用时还会创建新的对象时“泄漏”就发生了。当涉及对此类对象创建操作的业务被用户反复执行后,CLR 的 G3 代托管堆段会逐渐增长,服务的死期也就不远了。

有了以上的知识,可以说对内存泄漏的结构化诊断、定位方法如下:

1.监控托管堆使用量(查看进程的内存占用量也可以),找到内存只长不降

的业务,这些代码有内存泄漏的危险。这个过程我一般会使用 LoadRunner 脚本来做,毕竟小尺寸对象的泄漏需要较长的时间才能发生,靠手工操作不靠谱。这个一般不需要并发;

2.重新启动应用,让托管堆清理无关对象;

3.执行一次第1步发现的存在内存泄漏缺陷的业务;

4.使用工具将托管堆导出(dump)来,或对托管堆做一次快照(snapshot)。

在 dump/ snapshot 前要做一次全面 GC(full GC),尽量把可对象释放干净,排除干扰。此时泄漏的对象已经不能 GC 掉了,会保存在托管堆中,都会被 dump/shot 出来;

5.重复步骤 3。这会再次创建上次执行时(步骤 3)泄漏的对象;

6.重复步骤 4。此时,泄漏的对象是作为本次 dump/shot 的新对象存在的,

相对于步骤 4 中泄漏的同类对象而言;

7.通过对比步骤 4 和 6 两次 dump/snapshot 结果,下面就需要在茫茫对

象中找出泄漏的对象/对象类型来了。实际上这个过程是相对比较困难的,需要了解应用设计,相关背景知识,了然的越详细,定位越快,结果越准、完整。做两次 dump/snapshot 的目的在于,泄漏对象将属于“新”创建

对象集范围,这将有效缩小需检查的对象范围。需要说明的是,这里的

“新”指的是第二个 dump/snapshot 相对于第一个 dump/snapshot 里

存在的新对象;

8.可能前步骤的对象范围还是比较大,接下来可以从对象类型角度排个检查

的优先级顺序:

?检查应用命名空间中类型的对象;

?检查框架所提供的类型的对象;检查已经执行过手动关闭/释放方法的对象。如 .NET 中的 IDisposable 接口的 Dispose 方法。因为一旦调用了这种方法,对象本应该被 GC 所释放的,它是不应该再存在的。对于此类对象,存在的原因有可能:

A.被短生命周期的对象所引用,如局部变量(包括形参变量)等,造成

无法 GC。但在,在再次执行 dump/snapshot 时,它应该已经 GC 释放掉。

B.应用中设计了“池”,对象虽然被关闭,但它仍然会在池中存放,供

下次使用时再打开。一般这种情况比较少见,尤其在 .NET 中,放入池中的对象很少会调用其 Dispose 方法。这方面 Java 也类似。

实际上面所说的结构化方法只是表达个意思,真实的过程会是一个逐步定位、迭代的过程,在理解其中意义的前提下,灵活使用。通过上面的一系列分析、诊断方法来定位到泄漏的对象后,就查找是它们是被哪些对象所引用,即 Root Path 中都有哪些对象,通过修改代码来切断不应存在的引用,就可以使泄漏对象进行正常的 Unreachable 状态,GC 线程也就会正确处理它们了。实际上,重点还是在分析、诊断、定位,修复方法还是很容易找到的。

解决 https://www.360docs.net/doc/2f8891620.html, 应用内存泄漏问题 - .Net Memory Profiler 工具实践

首先要看下 .NET Memory Profiler 是什么,就不翻译了。我理解它实际就是个托管堆的 snapshot 工具,可以标记出非托管资源。显示实时堆使用图形的功能实在没大用。

.NET Memory Profiler is a tool for the .NET Common Language Runtime that allows the user to retrieve information about all instance allocations performed on the garbage collected heap (GC heap) and all instances that reside on the GC heap. The retrieved information is presented in real time, both numerically and graphically.

再说说这个 https://www.360docs.net/doc/2f8891620.html, 应用,前两天事业部的一个 https://www.360docs.net/doc/2f8891620.html, 应用出现了内存泄漏的情况。现象是,在一个查询业务场景中,发现查询几次之

后 IIS 的 w3p 工作进程会增长几兆、十几兆、几十兆不等的内存(这和查询结果大小成正比),而且通过 perfmon 监控可以看到 w3p 的 CLR 及时执行了 GC,但托管堆使用量始终只增不减,直到服务宕掉(在 LoadRunner 测试时还有 w3p crash 的情况)。

这里就不详细说明使用 .NET Memory Profiler 工具使用细节了,相信能看到这里的朋友,对这个工具的基本使用肯定不会成问题的。下面直接说重点。

按照上面提供的方法(内存泄漏的结构化诊断、定位方法),首先我们已经找到了在在问题的业务,也能够重现它。接下来将服务重启,让 w3p 的托管堆初始干净,排除无关对象。然后执行一次有问题的业务,这里我使用的 LoadRunner Vuser 回放测试脚本。接下来就要请 .NET Memory Profiler 出马,对 w3p 进程托管堆做次 snapshot。每个快照之前 .NET Memory Profiler 会自动做一次 Full GC。再来做一次执行查询业务,然后再做snapshot。通过过两次比较可以看到如下内容:

从中可以了解到:

1.展现的所有内容是其于 3# snapshot 与 2# snapshot 两次快照的对比结

果;

https://www.360docs.net/doc/2f8891620.html, Memory Profiler 提供了 Types 所有照到的对象类型,Show types

可以指定显示类型的范围,包括所有、“新”对象(第二个 dump/snapshot 相对于第一个 dump/snapshot 里存在的新对象)等;Type details 每个类型的对象实例信息;Instance details 每个实例的详细信息;Call

stacks/Methods 方法调用栈;Native memory 非托管内存信息;

3.另外需要注意的是 Field Sets,包括 Standard、Dispose Info、Heap

Utilization,用于过滤显示的 Types 类型结果。比较有用,能够看到上面方法中提到的 Dispose 方法调用后仍然在在的对象类型有哪些,这可

以缩小检查范围,下面会涉及到。

接下来就需要有针对性的逐一排查了,道先要考虑的是哪种类型的对象最有可能发生泄漏。上面的方法中提供了优先级别。我在这里是这样考虑的,因为对应用比较了解,我知道在有问题的业务页面中,有一个 static 类型的成员变量,它是 XmlDataSource 类型的对象,由于 static 所以实例不会被 GC,所以检查它所引用的有哪些对象实例就很有意义了。查看该类型的详细信息可见:

唯一的 XmlDataSource 类型实例是 #13, 483 号(全局实例编号)对象,通过详细信息可以看到如下被其引用的对象集:

通过对引用它的对象一一检查后发现,#13, 483 号的 XmlDataSource 类型实例共引用了 6 个 XmlDataSourceView 对象(之所以是 6 个,是因为我做了 3 次 snapshot,每次 LoadRunner 测试脚本中都执行了 2 次查询操作),通过它们的 Age 可以看到都经过了多次 GC,但都没有释放掉。

具体到 Root 对象集的引用路径也很简单,只有一条,它们都引用了#13, 483 号实例的事件。通过这样的分析,我们就能够找到由于与 static XmlDataSource 类型对象的引用关系,这造成了每次查询生成的 XmlDataSourceView类型对象都无法被 GC 回收,因此形成了内存泄漏情况。解决办法也很简单,可以通过将页面中 XmlDataSource 类型对象做为非 static 成员变量即可。

通过修复上面这个对象泄漏问题,我们每次业务可以节约接近 11M 的托管内存。但是通过之前的监控来看,每次业务所增加的内存量要比这大很多,而且通过修复上面的问题也不能完全解决内存持续上涨的情况。可以认定,该业务中还存在有内存泄漏的其它位置,需要继续分析、诊断。这次我通过 Dispose Info 着手,上面说过了,.NET 对象在经过程序调用 Dispose 方法后,就应该不再被使用并被 GC 所回收,如果在 snapshot 发现执行 Dispose 方法后 GC 多次仍未能回收的,就需要关注了。下面就是 Dispose 过后的对象类型:

果然,可以看到在我们业务页面及其 Master 页面对象全部都是执行过 Dispose,但未 GC 掉。通过打开类型详细信息来查看可以发现,他们都被 SiteMap 所引用。

我们都知道 SiteMap 及 XmpSiteMapProvider 等

https://www.360docs.net/doc/2f8891620.html, 2.0 中站点地图的组件,它们都是由 .NET Framework 提供和管理的,

我们是通过 site 文件配置出来的,那么造成这个原因是什么呢?通过调查了解到 SiteMap 对象的 SiteMapResolve 事件是static的,而 SiteMap 也是全局性质的,只要我们这些页面订阅了 SiteMapResolve 事件,就都会引用到 SiteMap 上去。有兴趣的朋友可参见 MSDN SiteMap::SiteMapResolve Event 的SiteMapResolve causing memory leaks 小节。而且,从对象树的内存使用量上看也比较合理了,每个页面由于包括了大量的控件及其状态数据,因此都很大,每个页面对象有 46M 多。

写在最后

整个这个东西我写得是相对较完整、详细和易实践的,主要的原因是发现身边的一些人觉得托管堆的内存泄漏分析、诊断和定位是个能够用来“吃饭”的活,非常不愿意和别人分享。应该说这个事的确是很有经验含量的,这种经验化的东西都愿意私藏,等必要的时候拿来炫耀。但我想说的是,我们需要开放,需要传承,但凡是能够文字化的东西都是可以用来言传的(文字的意义)。在一个不提倡分享的环境里要么自己研究,要么裹足不前,如果没有想法的根本不要关注。

希望有用,如有想法请分享。晚安~

// 2009.03.06 01:01 添加 ////

补充个附件“lesson2.zip”,是 .NET Memory Profiler 内存泄漏分析、诊断的官方视频。使用的版本有点老了,而且例子应用太简单,不过其中的一些提示值得考虑。

.NET Memory Profiler 网站

用C#开发软件自动更新程序

用C#实现在线升级的关键步骤 这里我主要使用日期信息来检测是否需要下载升级版本。 4.1 准备一个XML配置文件 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 //xml版本号 //升级文件所在服务器端的网址 //升级文件的更新日期 //升级文件的版本号 //升级文件列表 //共有三个文件需升级 //允许重新启动应用程序 //启动的应用程序名 从以上XML文档中可以得知升级文档所在服务器端的地址、升级文档的更新日期、需要升级的文件列表,其中共有三个文件需升级:aa.txt、VB40.rar、VB4-1.CAB。以及是否允许重新启动应用程序和重新启动的应用程序名。 4.2 获取客户端应用程序及服务器端升级程序的最近一次更新日期 通过GetTheLastUpdateTime()函数来实现。 private string GetTheLastUpdateTime(string Dir) { string LastUpdateTime = ""; string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml"; if(!File.Exists(AutoUpdaterFileName)) return LastUpdateTime; //打开xml文件 FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open); //xml文件阅读器 XmlTextReader xml = new XmlTextReader(myFile); while(xml.Read()) { if(https://www.360docs.net/doc/2f8891620.html, == "UpdateTime") {

netuser命令

用net user创建用户及提升权限 (net user 1234 12345 /add 创建一个用户名为1234密码为12345的用户 net localgroup administrators 1234 /add 把用户1234添加到管理员组 net localgroup administrators 1234 /delete 把“用户”从到管理员组中使删除。 net localgroup users 用户名 /add 把“用户”添加到普通用户组使其变为普通受限用户。 net user 1234 /del 这个命名表示把它删除 net的用法还有很多,net user 可以查看到现有的用户 net user 后面加用户名就可以查看该用户的状态 比如net user user1就可以查看user1的属性 net user user1 /active:yes/no yes是指激活当前用户,no是指禁用当前用户 首先输入net user abc$ /add abc是建立的用户名,$符号是表示在dos下面隐藏 那么就完了吗?输入net user,察看的目录下并没有显示出abc$ 但是你在运行里面输入lusrmgr.msc在用户里面看看,abc$还是存在的,这样的话就达不到超级隐藏的目的了。 下面我们接着看,如何把它在计算机管理里面隐藏起来。 于是我们要用到注册表了,在运行里面输入regedt32进入编辑界面 在下面键值下HKEY_LOCAL_MACHINE\SAM\sam做。首先我们要编辑它的权限,点sam 然后点窗口上的编辑,在点权限命令,赋予administrator对sam的完全控制权限。如果没有的话,点添加,输入administrator,点确定。好,然后刷新一下。重新打开,这样sam下面就可以展开了。到以下键值 HKEY_LOCAL_MACHINE\SAM\sam\domains\account\users,展开users,在展开users键值下的names.好了,现在你看到的就是你计算机上面所有的用户。 你同样可以看到刚才建立的abc$这个用户。那么users下的键值怎么和names下的键值对应起来呢。你可以点一下administrator这个用户,看看右边的窗口,你可以发现类型中它的值是0x1f4,好了,对应关键就在这里了。你可以同样点一下guest帐户。看看它的类型,0x1f5。好了,大概知道了吧。用户名右边的类型和users键值下的项值是对应的。所以找到abc$的类型,并在users上找到它对应的项值。 下面我们要做的是,把abc$和administrator做一个克隆,就是我们所说的超级隐藏帐户。点中administrator对应的users中的项值,就是000001f4,可以看到右边窗口显示出来的F 和V这两个二进制值。双击F,展开,然后把里面的内容复制。在切到abc$对应的users下对应的项值中,同样双击F值,粘贴。好了,下面要做的指是导出键值,把names下面的abc$键值和users下对应的项值分别导出到桌面。点names下的abc$然后再窗口中点文件选项,然后导出。可以导出到桌面,就命名为1好了。同样的,把users下对应的项值导出。ok,搞定。关闭注册表。 运行下输入cmd,输入net user abc$ /del命令成功完成。好了,分别双击刚才导出的键值。显示信息已经成功导入。ok,具有管理员权限的超级隐藏帐户就建立好了。 不信吗?在cmd下输入net user,在运行里面输入lusrmgr.msc,看看abc$这个用户还存在

Android应用程序的自动更新升级

Android应用程序的自动更新升级(自身升级、通过tomcat) 刚入手android一个多月,因公司需要提交技术文档,才写了这个demo测试,想保存下来,以备后用!有什么不对的地方欢迎大家指正,这个示例也是参考了网上别人的demo自己做的。 Android应用程序的升级(自身升级) 一、引言: 很多的Android应用都具有版本检测和自动更新的功能,用户一键就可以完成软件的升级和更新。Android应用程序的升级本质上是利用了Linux系统的软件包管理和安装机制,而对于上层这一功能的开发来说很容易,只需要我们开发人员利用Android自带的API就可以实现。 二、功能说明: 1、本示例用来实现单个应用程序的自身升级 2、程序启动时,连接tomcat7 web服务器进行版本的检测,若有新版本则提示更新 3、将从web服务器下载的新版本的APK文件放到sdcard中 4、监听新版本的APK应用是否安装完成,如果是,则将下载的apk文件从sdcard中删除 三、程序框架流程:

四、环境说明: 1、服务器端:Ubuntu下的tomcat7web服务器,安装后默认端口是8080,Android模拟器访问时要将apk文件放到/var/lib/tomcat7/webapps/ROOT/目录下,Android模拟器的访问方式是http://10.0.2.2/NewAppSample.apk 2、Android模拟器端的开发环境: Ubuntu+eclipse+ADT 五、流程详解及关键点说明: (一) 新版本的应用程序(NewAppSample)准备: a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1 b) 编辑应用程序对应的版本信息文件version.json 说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。 (二) 旧版本的应用程序准备: 1、在其AndroidManifest.xml中定义版本代码为versionCode=”1”让其自动生成即可,我们主要利用程序的版本代码的高低来判断是否有新的版本,用于更新。 2、我们在应用程序启动时自动联网检测是否有新的版本,即在onCreate()函数中进行联网检测。 a) 从服务器获得读取版本信息文件version.json,我们单独写了一个类来实现,用其GetUpdateInfo静态方法来返回读取的version.json,返回形式是字符串。代码如下

软件自动更新技术

软件自动更新思路 时间:2011-06-03 03:17:54 来源:作者:中原石油勘探局地质录井处付全彬 1前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。我们希望开发一个与具体应用无关的能够复用的自动升级系统。下面结合工作中所承担的井场数据中心项目为大家介绍如何实现可复用的自动升级系统。 2软件自动升级存在的困难 第一,为了查找远程服务器上的更新,应用程序必须有查询网络的途径,这需要网络编程、简单的应用程序与服务器通讯的协议。 第二是下载。下载看起来不需要考虑联网的问题,但要考虑下载用户请求的文件,以及在没有用户同意时下载大文件。友好的自动更新应用程序将使用剩余的带宽下载更新。这听起来简单,但却是一个技术难题,幸运的是已经有了解决方法。 第三个考虑因素是使用新版应用程序更换原应用程序的过程。这个问题比较有趣,因为它要求代码运行时将自己从系统删除,有多种办法可以实现该功能,本文程序主要通过比较新旧版本的日期号来实现替换新版本应用程序的功能。 3软件自动在线升级的原理 写两个程序,一个是主程序;一个是升级程序;所有升级任务都由升级程序完成。 3.1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件、XML配置文档等)到临时文件夹; 3.2.升级程序获取服务器端XML配置文件中新版本程序的更新日期或版本号或文件大小; 3.3.升级程序获取原有客户端应用程序的最近一次更新日期或版本号或文件大小,两者进行比较;如果发现升级程序的日期大于原有程序的最新日期,则提示用户是否升级;或者是采用将现有版本与最新版本作比较,发现最新的则提示用户是否升级;也有人用其它属性如文件大小进行比较,发现升级程序的文件大小大于旧版本的程序的大小则提示用户升级。本文主要采用比较新旧版本更新日期号来提示用户升级。 3.4.如果用户选择升级,则获取下载文件列表,开始进行批量下载文档; 3.5.升级程序检测旧的主程序是否活动,若活动则关闭旧的主程序; 3.6.删除旧的主程序,拷贝临时文件夹中的文件到相应的位置; 3.7.检查主程序的状态,若状态为活动的,则启动新的主程序; 3.8.关闭升级程序,升级完成。 4实现在线升级的关键步骤 这里我主要使用日期信息来检测是否需要下载升级版本。 4.1 准备一个XML配置文件 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 //xml版本号 <AutoUpdater> <URLAddres URL="http://192.168.198.113/vbroker/log/"/>//升级文件所在服务器端的网址

.NET应用程序基础环境部署

.NET应用程序基础环境部署 1.部署说明 本文档适用于指导项目实施人员所有基于.NET开发应用程序的基础运行环境部署。 .NET是一种面向网络,支持各种用户终端的开发平台环境,主要包括IIS服务和.netframework环境配置。IIS服务主要包括Web服务、FTP 服务、webservice服务等应用环境。其中web服务可以实现发布、基于B/S的应用程序部署。FTP是通用环境,主要应用于文件传输、文件存储,可以实现文件的上传与下载。Web services是基于组件的可实现不同应用之间可交互性的分布式应用程序,可以实现不同平台应用之间交互操作。.NET Framework 4是支持生成和运行应用程序和 XML Web Services 的部 Windows 组件,是.NET应用程序运行的基础支撑环境。 本文重点介绍一下应用及服务安装部署: 第一:安装部署IIS应用。 第二:安装部署.netframework4.0。 第三:部署web应用及服务。

2.安装部署 2.1.IIS服务安装部署 2.1.1.IIS简介 IIS是Internet Information Services(互联网信息服务)的缩写,主要提供基于运行Microsoft Windows的互联网基本服务,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。IIS是一种Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和发送等。 基于B/S架构的.NET应用程序需要在服务器端部署IIS服务,基于C/S架构的.NET应用程序不需要在服务器端部署IIS服务。 2.1.2.IIS环境要求 依据公司的.net应用程序系统框架要求,IIS须具备以下环境配置。

WSUS客户端补丁自动更新配置

在办公电脑上配置自动更新因为有部分电脑启用自动更新服务会出现错误。 所以我将排错步骤一起写进配置文档里。 第一步,在“运行”里输入 %windir% 找到微软补丁服务的文件夹 找到Softwaredistribution这个文件夹,将它删除掉。 如果直接删除,可能会提示有程序正在使用它。

删除Softwaredistribution文件夹的方法如下:以管理员的身份启动命令行管理器。 位置:开始-->程序-->附件-->命令提示符 右键点击,选择“以管理员身份运行”

使用net stop wuauserv 命令将更新服务程序停止掉。 然后就可以删除掉Softwaredistribution文件夹。 之后,在使用net start wuauserv 命令启动更新服务程序。 然后还需要确定一次windows update 这个服务是否已经启动了。在“运行”里输入 services.msc 进行查看 如果没有启动,就讲它启动起来。

到这里,准备步骤就已经完毕。 现在,开始配置每一台需要更新的机器的关键部分。指定WSUS更新服务器的IP。并设置自动更新和安装。在“运行”里输入gpedit.msc进入组策略管理。

找到:“管理模板”-->“Windows组件”-->“Windows Update”“双击鼠标左键”打开它 接下来是重要的配置步骤: 以上用箭头标注的六个地方需要配置。 启用“配置自动更新”,并选择“自动下载并计划安装” 安装时间,可以根据实际当前电脑开机的时段进行配置。

启用“指定Intranet Microsoft更新服务位置” 配置WSUS服务器IP地址 格式为 X.X.X.X 这个地址更具实际情况进行配置,每个网段的电脑配置IP会不一样。

VC++ 6.0 MFC 俄罗斯方块 自动求解 代码 源程序

#include #include #include #include #define tDown 1 //方块下落定时器的标识(编号) #define tPaint 2 //重绘定时器的标识(编号) #define tDownTime 500 //方块下落一行位置的时间间隔 #define tPaintTime 50 //窗口重绘的时间间隔 #define ROW 24 //地图的行数目(第23行不用) #define COL 14 //地图的列数目(第0列和第13列不用) #define MAX_CLASS 7 //方块形状数目 #define LEN 20 //每个方格大小为20×20像素 #define StartY -1 * LEN + 5 //-15,绘制俄罗斯方块地图时的边界起始位置#define StartX -1 * LEN + 5 //-15 int iDeleteRows = 0; //总共清除的行 int iTotalNum = 0; //总得分 char WindowTxt[100] = "俄罗斯方块游戏自动求解已关闭"; //窗口标题 char s1[] = "关闭", s2[] = "启动"; //用于启动/关闭自动求解功能时显示不同的标题

bool bAuto; //是否自动求解的标志 bool Pause; //是否暂停的标志 int Map[ROW][COL]; //俄罗斯方块的地图(被占据的方格为1,否则为0) int CurrentBox[4][4]; //当前落下的方块 int CurrentY, CurrentX; //当前落下方块的当前位置(指左上角位置) int NextBox[4][4]; //下一个将落下的方块 int Box[MAX_CLASS][4][4] = //7种方块形状 { { {0,0,0,0}, {1,1,1,1}, {0,0,0,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,0,0}, {1,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {1,1,0,0}, {0,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,1,0}, {1,1,0,0}, {0,0,0,0} }, { {0,1,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0} }, { {0,1,1,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}

API实现程序自动升级

社区彩票 社区农场 社区赌场 社区法院 社区房产 社区股市 欢迎大家到这个网上的共同的家园交流你的思想、分享你的经验!收藏本页 联系我们 论坛帮助 redbridge 重登录隐身用户控制面板搜索风格论坛状态论坛展区社区设施社区服务退出 >> PowerBuilder编程技术与相关应用我的收件箱 (0) 程序员家园论坛→软件开发→ PowerBuilder → [转帖]使用PB调用API自动更新(非FTP模式) 您是本帖的第 12 个阅读者 * 贴子主题:[转帖]使用PB调用API自动更新(非FTP模式) hongjuan 头衔:菜鸟协会会长 等级:管理员 威望:1 文章:35158 积分:44536 魅力:34850 现金:18265 存款:11106 门派:足彩协会 住址:幸福之家21号 注册:2003-12-31 鲜花(0) 鸡蛋(0) 楼主 [转帖]使用PB调用API自动更新(非FTP模式)

一、STRUCTURE定义 1、s_filetime global type s_filetime from structure long dwlowdatetime long dwhighdatetime end type 2、s_win32_find_data global type s_win32_find_data from structure long dwfileattributes s_filetime ftcreationtime s_filetime ftlastaccesstime s_filetime ftlastwritetime long nfilesizehigh long nfilesizelow long dwreserved0 long dwreserved1 character cfilename[255] character calternatefilename[14] end type 3、s_netresource global type s_netresource from structure long dwScope long dwType long dwDisplayType long dwUsage string lpLocalName string lpRemoteName string lpComment string lpProvider end type 一、WNetAddConnection2A function ulong WNetAddConnection2A(ref s_netresource lpNetResource, String lpPassword, String lpUserName, long dwFlags) library "mpr.dll" Alias for "WNetAddConnection2A" 说明: VB声明 Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

.net中打开应用程序的几种方法

第一种:System.Diagnostics.Process.Start(iexplore.exe) //为打开浏览器.. 直接调用Diagnostics类打开Start的参数亦可为路径 string path = "C:\\Program Files\\Raymark\\Xpert-Central_live\\Main\\posisent.exe"; System.Diagnostics.Process.Start(path); 第二种:首先尝试用开始运行cmd输入路径start /D "C:\Program Files\Raymark\Xpert-Central\Main\" posisent.exe 路径可随意更改为在本机的应用程序路径 确认该路径可用后代码中可按以下打开 public void OpenRunPark() { try { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; https://www.360docs.net/doc/2f8891620.html,eShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); string path = "start /D \"C:\\Program Files\\Raymark\\Xpert-Central_live\\Main\\\" posisent.exe"; p.StandardInput.WriteLine(path); p.Close(); p.Dispose(); StreamWriter wt = File.AppendText(@"D:\xPertErrLog.txt"); wt.Write("打开应用程序成功!路径为"+path); wt.WriteLine(File.GetLastWriteTime(@"D:\xPertErrLog.txt")); wt.Close(); } catch { StreamWriter wt = File.AppendText(@"D:\xPertErrLog.txt"); wt.Write("打开应用程序失败!请检查打开路径是否出错!"); wt.WriteLine(File.GetLastWriteTime(@"D:\xPertErrLog.txt")); wt.Close(); }

CMD(网络命令大全)

CMD(网络命令大全) CMD(网络命令大全) netstat -a 查看开启了哪些端口,常用netstat -an netstat -n 查看端口的网络连接情况,常用netstat -an netstat -v 查看正在进行的工作 netstat -p 协议名例:netstat -p tcqip 查看某协议使用情况(查看tcpip 协议使用情况) netstat -s 查看正在使用的所有协议使用情况 nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写 tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。 ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。 ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping) ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“all”显示全部配置信息 tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Supporttools文件夹内) kill -F 进程名加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Supporttools文件夹内) net user 用户名密码add 建立用户 net user guest activeyes 激活guest用户 net user 查看有哪些用户 net user 帐户名查看帐户的属性 net localgroup administrators 用户名 add 把“用户”添加到管理员中使其具有管理员权限,注意:administrator后加s用复数 net start 查看开启了哪些服务 net start 服务名开启服务;(如net start telnet, net start schedule) net stop 服务名停止某服务 net time 目标ip 查看对方时间

WSUS客户端补丁自动更新配置

在办公电脑上配置自动更新 因为有部分电脑启用自动更新服务会出现错误。 所以我将排错步骤一起写进配置文档里。 第一步,在“运行”里输入%windir% 找到微软补丁服务的文件夹 找到Softwaredistribution这个文件夹,将它删除掉。 如果直接删除,可能会提示有程序正在使用它。 删除Softwaredistribution文件夹的方法如下: 以管理员的身份启动命令行管理器。

位置:开始-->程序-->附件-->命令提示符 右键点击,选择“以管理员身份运行” 使用net stop wuauserv 命令将更新服务程序停止掉。 然后就可以删除掉Softwaredistribution文件夹。 之后,在使用net start wuauserv 命令启动更新服务程序。 然后还需要确定一次windows update 这个服务是否已经启动了。

在“运行”里输入services.msc 进行查看 如果没有启动,就讲它启动起来。 到这里,准备步骤就已经完毕。 现在,开始配置每一台需要更新的机器的关键部分。 指定WSUS更新服务器的IP。并设置自动更新和安装。 在“运行”里输入gpedit.msc进入组策略管理。 找到:“管理模板”-->“Windows组件”-->“Windows Update”“双击鼠标左键”打开它

接下来是重要的配置步骤: 以上用箭头标注的六个地方需要配置。 启用“配置自动更新”,并选择“自动下载并计划安装”安装时间,可以根据实际当前电脑开机的时段进行配置。 启用“指定Intranet Microsoft更新服务位置”

cmd常用命令大全

windows XP cmd命令大全 一,ping 它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。 -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M 的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。 -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。 -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。 说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。 下面我们举个例子来说明一下具体用法。 这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix) 至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对

资料WindowsUpdate自动更新错误代码大全

【资料】Windows Update 自动更新错误代码大全 在使用Windows Update更新时,时常会遇到过这样的情况:“升级没有成功,只给出一段不知其意的代码如“XXXXXX”!让人无从下手,特将这些错误提示的代码的整理出来供大家参考! Windows Update 错误51F 如果在尝试安装更新时收到Windows Update 错误51F,则Microsoft Office 2003 产品的本地安装源(LIS) 已损坏。LIS 是Office 2003 产品用来安装程序和Office 程序更新的软件。 Windows Update 错误52F

如果在尝试安装更新时收到Windows Update 错误52F,说明Microsoft Office 2003 产品的本地安装源(LIS) 已损坏。LIS 是Office 2003 产品用来安装程序和Office 程序更新的软件。 Windows Update 错误80070070 如果在尝试安装更新时收到Windows Update 错误80070070,请释放计算机上的磁盘空间,然后重新尝试。 Windows Update 错误80070002 如果在检查更新时收到Windows Update 错误80070002,需要删除Windows 用于确定计算机更新的临时更新文件。若要删除这些文件,请完成下面的所有步骤,然后重新尝试检查Windows 更新。 Windows Update 错误80070003 如果在检查更新时收到Windows Update 错误80070003,则需要删除Windows 用于识别计算机更新的临时文件。若要删除这些临时文件,请完成下面的所有步骤,然后重新尝试检查Windows 更新。 Windows Update 错误80070422 如果在下载更新时收到Windows Update 错误80070422,可能需要更改Windows

NET命令基本用法

NET命令基本用法 综合了WINDOWS 98,WINDOWS WORKSTATION和WINDOWS SERVER三个操作系统关于NET命令的解释,希望可以全面一些。 先说一些: (1)NET命令是一个命令行命令。 (2)管理网络环境、服务、用户、登陆……等本地信息 (3)WIN 98,WIN WORKSTATION和WIN NT都内置了NET命令。 (4)但WIN 98的NET命令和WORKSTATION、NT的NET命令不同。 (5)WORKSTATION和SERVER中的NET命令基本相同。 (6)获得HELP (1)在NT下可以用图形的方式,开始-》帮助-》索引-》输入NET (2)在COMMAND下可以用字符方式,NET /?或NET或NET HELP得到一些方法,相应的方法的帮助NET COMMAND /HELP或NET HELP COMMAND 或NET COMMAND /? 另对于错误NET HELPMSG MESSAGE#是4位数 (7)强制参数所有net命令接受选项/yes和/no(可缩写为/y和/n)。[简单的说就是预先给系统的提问一个答案] (8)有一些命令是马上产生作用并永久保存的,使用的时候要慎重 (9)对于NET命令的功能都可以找到相应的图形工具的解决方案 (10)命令的组成命令参数选项| 参数选项| 参数选项|。。。。。。 还要注意: (1)在NT的NET命令中有一些参数是只有在SERVER环境中才能使用的 (2)在WIN98的NET命令中有一些参数不能在DOS-WIN中使用,只能在DOS环境中使用 下面对NET命令的不同参数的基本用法做一些初步的介绍: (一)NET VIEW 作用: 显示域、计算机或由指定计算机共享资源的列表。如果在没有参数的情况下使用,则net view 显示当前域中的计算机列表。 语法: net view [ComputerName] [/domain[:DomainName]] net view /network:nw [ComputerName] 参数: 键入不带参数的net view显示当前域的计算机列表。 Computername 指定包含要查看共享资源的计算机。

客户端常见问题及解决办法

客户端常见问题及解决办法 客户端简介: 宽带认证客户端是由北京城市热点公司开发的宽带接入认证程序。主要用于高校,企业,或者其他局域网上网认证,以及网络管理。 客户端常见问题及解决办法: 常见问题有:登陆超时失败、code(21)、账号正在使用、用户名或密码错误、本账号只能在指定ip使用、其他程序占用端口、下载的客户端安装时出现乱码、IP地址错误或网卡被禁用、网络连接受限等。 1.其他程序占用端口: 提示图 原因:你电脑中正在运行的某个应用程序占用了客户端的通信端口(客户端通信端口UDP 61440)、杀毒软件或防火墙也会引起此类问题。 解决办法:方法一.检查出现这个问题之前,你安装了什么应用软件,把这个应用软件卸载掉或者在任务管理器中停掉相应的进程;方法二.开始——运行——输入"cmd”回车——再输入"netsh winsock reset "回车然后重启电脑(前提是在XP下,或vista的特权模式下)方法三..卸载客户端——重启电脑,下载最新版本的客户端重新安装。 2.code21错误: 客户端提示图 原因:客户端程序与本机安装的防火墙有系统冲突、应用程序破坏了客户端所写的注册表信息、本机系统的协议工作状态异常也会导致code(21) 解决办法:

方法一右键点击客户端图标选择属性,在打开的属性窗口中点击 查找目标,会自动打开客户端安装的文件夹,选择文件双击。 方法二这个可以用命令netsh winsock reset 解决,前提是在XP下,或vista 的特权模式下 方法三以上使用之后还不能解决,建议用户卸载客户端——重启电脑——再安装客户端 3.登陆超时失败: 出现此类问题比较多,原因也很多, 客户端提示图 原因及解决办法: (1)本地连接显示已经连接上,但还是上不了网,此类问题多是系统问题,用户可查看客户端登录服务器地址 是否正确,我校客户端登陆服

源代码版本管理

目录 1 Visual Studio环境下源代码版本管理 2 Eclipse环境源代码版本管理 3体会

1Visual Studio环境下源代码版本管理 1.1SubVersion+TortoiesSVN的配置 1.1.1安装SubVersion 。(下载地址: https://www.360docs.net/doc/2f8891620.html,/servlets/ProjectDocumentList?folderID=8100&exp andFolder=8100&folderID=91),例如我安装到D:/SVN/SubVersion 1.1.2安装TortoiseSVN。(下载地址:https://www.360docs.net/doc/2f8891620.html,/downloads),这是一个SubVersion的图像化管理工具,没有它也可以,但是管理SubVersion需要使用命令行的形式,安装过TortoiseSVN可以在右键菜单出现相应的选项。例如我安装到了D:/SVN/TortoiseSVN 1.1.3建立版本库(repository)。这点和VSS一样,我们需要一个库来存放版本信息。创建方式有两种通过SubVersion的命令行或者通过TortoiseSVN的图形界面来创建。我们就直接通过TortoiseSVN创建,例如我想在D盘建立一个文件夹SVNServices 用来放版本库,然后在其中建立一个EMIData的文件夹作为我的项目EMI的版本库,这是我对EMIData点击右键--TortoiseSVN—Create Repository here 即可将EMIData最为一个版本库,这是你会发现EMIData文件夹中多了很多的文件。 1.1.4启动SVN服务。到这里我们的SubVersion其实还没有启动,我们在cmd命令行输入:svnserve –-daemon –-root D:/SVNServices这样我们就可以启动SVN并且以D:/SVNServices作为根目录。这里我要指明几点,第一就是输入的命令中两处都是两个‘-’,也就是‘--’而不是‘-’;第二点就是启动后cmd窗口使不能关闭的,

网络命令NET的基本用法

网络命令NET的基本用法 NET[ACCOUNTS|COMPUTER|CONFIG|CONTINUE|FILE|GROUP|HELP|HELPMSG|LOCALGROUP |NAME|PAUSE|PRINT|SEND|SESSION|SHARE|START|STATISTICS|STOP|TIME|USE|USER|VIEW] NetAccounts 更新用户帐号数据库、更改密码及所有帐号的登录要求。 命令格式: netaccounts[/forcelogoff:{minutes|no}][/minpwlen:length][/maxpwage:{days|unlimited}][/minpwage:days][/uniquepw:n umber][/domain]参数介绍: (1)、键入不带参数的netaccounts显示当前密码设置、登录时限及域信息。(2)、/forcelogoff:{minutes|no}设置帐号或有效登录时间过期时,被强制退出系统之前所拥有的分钟数。 (3)、/minpwlen:length设置用户帐号密码的最少字符数。 (4)、/maxpwage:{days|unlimited}设置用户帐号密码有效的最大天数。(5)、/minpwage:days设置用户必须保持原密码的最小天数。(6)、/uniquepw:number要求用户更改密码时,必须在经过number次后才能重复使用与之 精选文档

相同的密码。 (7)、/domain在当前域的主域控制器上执行该操作。 (8)、/sync当用于主域控制器时,该命令使域中所有备份域控制器同步例:netaccounts/minpwlen:7将用户帐号密码的最少字符数设置为7netaccounts/forcelogoff:no禁止强制退出系统,默认。 NetComputer 从域数据库中添加或删除计算机。 命令格式:netcomputer\computername{/add|/del}参数介绍: (1)、\computername指定要添加到域或从域中删除的计算机。(2)、/add将指定计算机添加到域。(3)、/del将指定计算机从域中删除。例: netcomputer\abc/add将计算机abc添加到登录域NetConfig 显示当前运行的可配置服务,或显示并更改某项服务的设置。命令格式:netconfig[service[options]]参数介绍: (1)、键入不带参数的netconfig显示可配置服务的列表。 (2)、service通过netconfig命令进行配置的服务(server或workstation)(3)、options服务的特定选项。例: 精选文档

自动更新程序源码下载(C#.Net)=

由于微软提供的更新程序使用不方便,所以又写了此程序。此程序是本人一年前所写的一段程序,当时在开发一个CS版本报价系统,当时由于开发过程仓促,代码可能有点不是太规范此程序编译后只有一下AutoUpdate.exe文件与一个配置文件UpdateList.xml,主要通过本地程序与服务端程序文件的版本号来升级与更新本地程序文件。UpdateList.xml文件内容如下: Application autoUpdate http://10.0.5.98/SoftUpdate/ 2005-09-05 ItemSoft.exe . 1.0.0.0 说明: 程序的描述; 更新服务器地址,为一个虚拟目录或站点路径; 需要更新主程序文件,为exe; . 需要更新主程序文件所在路径; 1.0.0.0 主程序版本号; 需要更新的文件列表;Ver:文件版本号,Name:文件名,包括路径(相对); 使用时,在更新服务器上新建Web虚拟目录或站点,然后将需要更新的文件与UpdateList.xml放在上面; 本地将AutoUpdate.exe与UpdateList.xml放在主程序的根目录下。本地UpdateList.xml中的版本号如果小于服务端,自动程序会自动下载所需要更新的文件。 本人的完整.Net打包程序下载中所带的项目中,就使用了此更新程序。 源码下载:/Files/jenry/AutoUpdate.rar 二进制文件下载:/Files/jenry/bin.rar 生成配置文件UpdateList.xml工具:/Files/jenry/AULWriter1.0.rar(由whatisgood 提供,感谢!!)

相关文档
最新文档