我的分类
流水记事
源码下载
数据库
Javascript
.Net技术
我的相册
友情链接
百度博客
CSDN博客
Start0
最新回复
大哥,有急事想请你帮..
[:..
great
是无意间还..
这个能否支持手动键盘..
很好的文章,在csdn能..
现在没有乱码了,但是..
我用的是2010修正的,..
在世界之窗浏览器怎么..
好像不是很好用
 日志列表    
本站一共有博客66条,当前显示24条
回复:1  发表于:2011-12-12 15:37:53
更新于:2011-12-12 15:38:15

因为个人看着流水记事中间夹杂着技术文章,有点不爽,娃哈哈……

回复:4  发表于:2011-02-22 15:44:51
更新于:2011-11-18 10:32:37
记录了小贝的成长日志,带有各个时期的照片,呵呵
回复:8  发表于:2009-11-03 11:33:49
更新于:2012-02-02 11:25:45

今天正式开通俺的博客,这个博客是俺写的,还是比较简陋的,功能也比较少,需要不断的完善,嗯。
如果哪位兄弟姐妹,对俺这个博客的源代码感兴趣呢,可以联系俺,俺的mail: youbl@126.com,俺不介意开源我的博客程序。
基于不少朋友想要代码,这里帖出下载地址,参考最下方的下载,后台管理要手动输入地址才能进入,初始密码为beinet,希望朋友们帮我找出问题,并反馈给我,我们一起进步吧

更新日志:
2011.11.18:评论太长,版面未换行问题;站点搜索功能;允许博客设置为首页不显示,仅分类页显示
2011.08.10:后台登录失效问题,是因为虚拟机上的machineKey经常改变造成,手动在web.config里指定就ok了,参考:http://blog.csdn.net/vasun/article/details/5100743
2011.03.02:修改显示排序,增加更新时间显示,增加回复时的表情功能
2010.08.20:修改日志编辑时,\转义成js变量时的bug;调整日志编辑界面
2010.05.23:增加相册评论功能;修改日志评论显示为按时间正序(原为按时间倒序);
2010.05.15:增加相册功能;

待修改日志:
1、站点静态化制作,提高访问速度;2、日志可对应多个分类;

源代码下载  已下载

先写这些吧。
下面放上我和我老婆的靓照一张,嘿嘿:
beinet的主人夫妻俩

 发表于:2012-05-03 11:30:25

这几天开发了一个Web站点,主要用于给其它站点做接口数据返回,在提交压力测试时,经常内存增长到1G后,溢出了,因为程序本身确实会加载不少缓存数据,而服务器本身是Windows2003 32位的操作系统,最大只支持2g内存,通过参考页面:http://support.microsoft.com/?kbID=810371,在boot.ini里增加启动参数:/3gb /Userva=3030
从而让程序可以使用到3G内存,然后继续提交压力测试

结果测试时,内存依旧持续增长,增长到2G后,又内存溢出了,至此,怀疑程序有内存泄露

找了一个win7版本的任务管理器,拷贝到服务器上,在内存达到2G时,创建了一个w3wp进程的dump(下面的创建转储文件)

抓下来dump文件后,在本地用Windbg加载sos.dll进行分析,通过!dumpheap -stat命令,发现占用内存最大的3个对象是:
6611b1b0  5027584    241324032 System.Web.SessionState.InProcSessionState
66149064  5027602    361987344 System.Web.Caching.CacheEntry
79330b24  5575562    378271928 System.String

各占用了241M、361M、378M,因为事先知道String占用这么大是正常的,所以要去分析另外2个对象,在Windbg里通过:  !dumpheap -type System.Web.Caching.CacheEntry  命令,查看所有具体的CacheEntry地址等信息,这个会很多,数据一出来,马上按Ctrl+Break,数据大致如下
 0:000> !dumpheap -type System.Web.Caching.CacheEntry
------------------------------
Heap 0
 Address       MT     Size
106837a8 044b3ac4       72    
107b0de0 044b3ac4       72    
107b1e74 044b3ac4       72    
107bdc14 044b3ac4       72    
107bdef8 044b3ac4       72    
107c1290 044b3ac4       72    
107c1370 044b3ac4       72    
107c142c 044b3ac4       72    
107c20f8 044b3ac4       72    

先找第一个地址分析:
0:000> !do 106837a8
Name: System.Web.Caching.CacheEntry
MethodTable: 044b3ac4
EEClass: 044aac24
Size: 72(0x48) bytes
 (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
02469134  400140c        4        System.String  0 instance 10683740 _key
030fb350  400140d        c          System.Byte  1 instance       16 _bits
03154d18  400140e        8         System.Int32  1 instance -1350406618 _hashCode
02466d54  4001415       10        System.Object  0 instance 10683794 _value
0321ab48  4001416       1c      System.DateTime  1 instance 106837c4 _utcCreated
0321ab48  4001417       24      System.DateTime  1 instance 106837cc _utcExpires
0321dda4  4001418       2c      System.TimeSpan  1 instance 106837d4 _slidingExpiration
030fb350  4001419        d          System.Byte  1 instance 4294967295 _expiresBucket
044b3964  400141a       34 ...g.ExpiresEntryRef  1 instance 106837dc _expiresEntryRef
030fb350  400141b        e          System.Byte  1 instance        2 _usageBucket
044b3a6c  400141c       38 ...ing.UsageEntryRef  1 instance 106837e0 _usageEntryRef
0321ab48  400141d       3c      System.DateTime  1 instance 106837e4 _utcLastUpdate
044b32f0  400141e       14 ...g.CacheDependency  0 instance 00000000 _dependency
02466d54  400141f       18        System.Object  0 instance 00000000 _onRemovedTargets
0321ab48  4001412      1e4      System.DateTime  1   shared   static NoAbsoluteExpiration
    >> Domain:Value  000dd050:NotInit  0012ad78:1616ba94 <<
0321dda4  4001413      1e8      System.TimeSpan  1   shared   static NoSlidingExpiration
    >> Domain:Value  000dd050:NotInit  0012ad78:1616baa4 <<
0321dda4  4001414      1ec      System.TimeSpan  1   shared   static OneYear
    >> Domain:Value  000dd050:NotInit  0012ad78:1616bab4 <<

然后再看_key的值
0:000> !do 10683740
Name: System.String
MethodTable: 02469134
EEClass: 02a42780
Size: 82(0x52) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: f2029612887/recommendservice.svc

再看_value的值
0:000> !do 10683794
Name: System.Web.Configuration.MapPathCacheInfo
MethodTable: 047026d0
EEClass: 04776bb8
Size: 20(0x14) bytes
 (C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
02469134  40018d4        4        System.String  0 instance 10683dfc MapPathResult
0320bdb8  40018d5        c       System.Boolean  1 instance        1 Evaluated
030f0498  40018d6        8     System.Exception  0 instance 00000000 CachedException
0:000> !do 10683dfc
Name: System.String
MethodTable: 02469134
EEClass: 02a42780
Size: 88(0x58) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: E:\wwwroot\Web\recommendservice.svc
看来第一个CacheEntry保存的是一个虚拟路径和物理路径的对应关系,接着分析下一个CacheEntry的数据
如此类推发现
!do 107b0de0得到的也是一个文件路径缓存数据
!do 107b1e74得到System.Web.Security.FileSecurityDescriptorWrapper,看起来像是文件安全配置说明
!do 107bdc14得到一个key为jbj1dejrlaibnmfyrnqldwk45的System.Web.SessionState.InProcSessionState对象
!do 107bdef8得到一个key为jfd2qmyinc5sgpk55b2nks4rw的System.Web.SessionState.InProcSessionState对象
107c1290、107c1370、107c142c、107c20f8等大部分CacheEntry保存的都是InProcSessionState对象

由此可见,占用内存第二大的,都引用了占用内存第三大的InProcSessionState对象,
而Asp.net的Session默认是保持20分钟,压力测试时,在20分钟内创建的Session全部被保持,无法被GC回收,从而内存不断增长,最终导致内存溢出了

马上咨询压力测试人员,果然是压力测试发起了所有连接,都是新连接,
通过修改压力测试方案,复用创建的连接,而不是发起 新连接,果然内存占用在400M左右,增长也极其缓慢

最后的修改方案,因为此站点仅作为接口使用,不会使用到Session,直接在Web.config增加配置:<sessionState mode="Off"></sessionState>
关闭Session,再进行压力测试,内存基本不会增长

 发表于:2012-03-21 09:42:15

我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:

  1. 假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?
  2. 某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?

我们先回顾一下操作系统原理。

操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,而Windows则属于抢占式的。

在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在 时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程 序所要做的就是维护一张就绪进程列表,,当进程用完它的时间片后,它被移到队列的末尾。

所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。

在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过 CPU 了),给他们算出一 个总的优先级来。操作系统就会把 CPU 交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起后,操作系统就会重新计算一 次所有进程的总优先级,然后再挑一个优先级最高的把 CPU 控制权交给他。

我们用分蛋糕的场景来描述这两种算法。假设有源源不断的蛋糕(源源不断的时间),一副刀叉(一个CPU),10个等待吃蛋糕的人(10 个进程)。

如果是 Unix操作系统来负责分蛋糕,那么他会这样定规矩:每个人上来吃 1 分钟,时间到了换下一个。最后一个人吃完了就再从头开始。于是,不管这10个人是不是优先级不同、饥饿程度不同、饭量不同,每个人上来的时候都可以吃 1 分钟。当然,如果有人本来不太饿,或者饭量小,吃了30秒钟之后就吃饱了,那么他可以跟操作系统说:我已经吃饱了(挂起)。于是操作系统就会让下一个人接着来。

如果是 Windows 操作系统来负责分蛋糕的,那么场面就很有意思了。他会这样定规矩:我会根据你们的优先级、饥饿程度去给你们每个人计算一个优先级。优先级最高的那个人,可以上来吃蛋糕——吃到你不想吃为止。等这个人吃完了,我再重新根据优先级、饥饿程度来计算每个人的优先级,然后再分给优先级最高的那个人。

这样看来,这个场面就有意思了——可能有些人是PPMM,因此具有高优先级,于是她就可以经常来吃蛋糕。可能另外一个人是个丑男,而去很ws,所以优先级特别低,于是好半天了才轮到他一次(因为随着时间的推移,他会越来越饥饿,因此算出来的总优先级就会越来越高,因此总有一天会轮到他的)。而且,如果一不小心让一个大胖子得到了刀叉,因为他饭量大,可能他会霸占着蛋糕连续吃很久很久,导致旁边的人在那里咽口水。。。
而且,还可能会有这种情况出现:操作系统现在计算出来的结果,5号PPMM总优先级最高,而且高出别人一大截。因此就叫5号来吃蛋糕。5号吃了一小会儿,觉得没那么饿了,于是说“我不吃了”(挂起)。因此操作系统就会重新计算所有人的优先级。因为5号刚刚吃过,因此她的饥饿程度变小了,于是总优先级变小了;而其他人因为多等了一会儿,饥饿程度都变大了,所以总优先级也变大了。不过这时候仍然有可能5号的优先级比别的都高,只不过现在只比其他的高一点点——但她仍然是总优先级最高的啊。因此操作系统就会说:5号mm上来吃蛋糕……(5号mm心里郁闷,这不刚吃过嘛……人家要减肥……谁叫你长那么漂亮,获得了那么高的优先级)。

那么,Thread.Sleep 函数是干吗的呢?还用刚才的分蛋糕的场景来描述。上面的场景里面,5号MM在吃了一次蛋糕之后,觉得已经有8分饱了,她觉得在未来的半个小时之内都不想再来吃蛋糕了,那么她就会跟操作系统说:在未来的半个小时之内不要再叫我上来吃蛋糕了。这样,操作系统在随后的半个小时里面重新计算所有人总优先级的时候,就会忽略5号mm。Sleep函数就是干这事的,他告诉操作系统“在未来的多少毫秒内我不参与CPU竞争”。

看完了 Thread.Sleep 的作用,我们再来想想文章开头的两个问题。

对于第一个问题,答案是:不一定。因为你只是告诉操作系统:在未来的1000毫秒内我不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。

与此相似的,Thread有个Resume函数,是用来唤醒挂起的线程的。好像上面所说的一样,这个函数只是“告诉操作系统我从现在起开始参与CPU竞争了”,这个函数的调用并不能马上使得这个线程获得CPU控制权。

对于第二个问题,答案是:有,而且区别很明显。假设我们刚才的分蛋糕场景里面,有另外一个PPMM 7号,她的优先级也非常非常高(因为非常非常漂亮),所以操作系统总是会叫道她来吃蛋糕。而且,7号也非常喜欢吃蛋糕,而且饭量也很大。不过,7号人品很好,她很善良,她没吃几口就会想:如果现在有别人比我更需要吃蛋糕,那么我就让给他。因此,她可以每吃几口就跟操作系统说:我们来重新计算一下所有人的总优先级吧。不过,操作系统不接受这个建议——因为操作系统不提供这个接口。于是7号mm就换了个说法:“在未来的0毫秒之内不要再叫我上来吃蛋糕了”。这个指令操作系统是接受的,于是此时操作系统就会重新计算大家的总优先级——注意这个时候是连7号一起计算的,因为“0毫秒已经过去了”嘛。因此如果没有比7号更需要吃蛋糕的人出现,那么下一次7号还是会被叫上来吃蛋糕。

因此,Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。

末了说明一下,虽然上面提到说“除非它自己放弃使用 CPU ,否则将完全霸占 CPU”,但这个行为仍然是受到制约的——操作系统会监控你霸占CPU的情况,如果发现某个线程长时间霸占CPU,会强制使这个线程挂起,因此在实际上不会出现“一个线程一直霸占着 CPU 不放”的情况。至于我们的大循环造成程序假死,并不是因为这个线程一直在霸占着CPU。实际上在这段时间操作系统已经进行过多次CPU竞争了,只不过其他线程在获得CPU控制权之后很短时间内马上就退出了,于是就又轮到了这个线程继续执行循环,于是就又用了很久才被操作系统强制挂起。。。因此反应到界面上,看起来就好像这个线程一直在霸占着CPU一样。

末了再说明一下,文中线程、进程有点混乱,其实在Windows原理层面,CPU竞争都是线程级的,本文中把这里的进程、线程看成同一个东西就好了。

本文转载自http://www.cnblogs.com/ilove/archive/2008/04/07/1140419.html

 发表于:2012-03-13 17:45:13
更新于:2012-03-20 16:17:22

一直在使用WebForm,最近领导要求项目开始使用MVC,因为服务器还没有安装Framework4,先从MVC2开始吧

1、在IIS里访问MVC路由时,出现404错误,但是在Visual Studio开发服务器里正常
这是因为没有配置IIS通配符应用程序映射,开始=>运行,输入Inetmgr,进入Internet信息服务管理器,在你的网站或虚拟目录上按右键=>属性=>主目录,点击下面的“配置”,在下方的“通配符应用程序映射”里,点“插入”,可执行文件里输入“c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll”,并去掉“确认文件是否存在”,最后点确定即可,现在IIS里访问也正常了
这里有点问题,按上面配置后,任意扩展名请求,都会交给aspnet_isapi.dll去处理了,包括html、jpg、js等常见扩展名了
即使通过routes.IgnoreRoute("{*dir}", new { dir = @".*\.html(.*)?" });忽略这些常用扩展名,也会进isapi走一趟,目前我的做法就是MVC都加一个ashx扩展名,这样IIS也不用配置了(Application_BeginRequest里加断点,可以看到所有的html等请求都会到这个断点)

我用的路由:routes.MapRoute("Default","{controller}.ashx/{action}/{*path}",new { controller = "Home", action = "Index" });

2、路由里的参数名称必须与Controller里的参数名称一致,如配置了一个路由:
routes.MapRoute("mytest","{controller}/MyTest/{id}",new { controller = "Home", action = "MyTest" });
那么HomeController里的方法必须为:
public ActionResult MyTest(string id){}// 如果参数名不是id,而是abc等其它名,就会出现找不到对应的Controller的错误

3、参数约束:
routes.MapRoute("mytest","{controller}/MyTest/{id}",new { controller = "Home", action = "MyTest" },
new {id = @"\d*"} );// 这个约束表明id必须为数字,而且必须全部是数字(有点疑惑,全数字的正则应该是^\d+$,这里没有开始结束符也可以做到)

4、执行前方法OnActionExecuting:在这里可以在Action执行前做任意操作,比如登录检查等等,如:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string controllName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    //string actionName = filterContext.ActionDescriptor.ActionName;
    if (!controllName.Equals("Account", StringComparison.OrdinalIgnoreCase)) {
        if (!IsLogin)  {
            filterContext.Result = RedirectToAction("LogOn", "Account"); // Redirect("/Account.ashx/LogOn");
            return;
        }
    }
            
    base.OnActionExecuting(filterContext);
}

 发表于:2012-02-27 10:46:31

这两天,由于负责的一个搜索站点服务器CPU很高,领导要求优化代码,在本地安装了个JetBrains dotTrace Performance 4.5,
并抓取IIS的请求,分析请求,发现每次请求IndexOf这个方法调用都超过10万次,已经占用了相当的处理时间了,经过ILSpy反编译,发现IndexOf方法定义:
public int IndexOf(string value)
{
    return this.IndexOf(value, StringComparison.CurrentCulture);
}

参考MSDN:

于是改用另外一个枚举:

Ordinal  
单单这个IndexOf的效率能提高一倍以上(其实不止)

另外,Contains方法默认使用的就是Ordinal了

还有一个字符串的Compare方法,我们经常使用:
string a="1", b = "2";
return a.CompareTo(b);

其实可以改用:
string.Compare(version1, version2, StringComparison.Ordinal);
或者:
string.CompareOrdinal(version1, version2);

效率也是很有提升的,关于StringComparison.CurrentCulture和StringComparison.Ordinal的区别,或其它StringComparison枚举,可以参考MSDN:
http://msdn.microsoft.com/zh-cn/library/system.stringcomparison(VS.80).aspx

 发表于:2012-01-29 16:47:47
更新于:2012-01-31 10:16:44

早上一来,公司门口猜谜抽奖,拆信,猜地名,开封嘛,然后抽奖,1块钱,nnd,蚊子肉也是肉,哈哈
结果晚上跟老婆出去吃饭,红包拿出来放桌上,吃完撤退,这一块钱也丢了……

 发表于:2011-12-12 14:53:51

白天正常的时候还好,很少咳嗽,但是午睡或晚上睡觉一段时间后,就开始咳嗽的很厉害,经常会把喝的奶也吐出来,去省妇幼看了好多次,边上一个老中医那里也看了很多次,依然不见效,天气一热就有好转,天一冷,好像又厉害了,上周看了老中医,吃了两付中药,吃完还拉肚子,骗她吃中药,要拿个棒棒糖,非常配合,添一个糖,吃一口中药,好可爱,可惜就是没效果。
唉,今天晚上再次去看下老中医,看看怎么样,想想小贝可爱的样子,再想想她咳嗽的哭的样子,真心疼……

 发表于:2011-11-17 15:44:21

2011年11月16日下午3点,科目三考试通过,长达4个月的学习结束,现在等待驾驶证出来

这4个月的学习和科目一、二、三的考试,经历还挺多的,等有空一一补足吧,可以写一短篇小说了,呵呵

 发表于:2010-12-24 09:03:22

因为项目要静态化,从而开发了这么一个静态页面抓取生成工具,功能:
1、支持GET、POST的参数配置,并支持3种参数类型,如:id=1,2,3  name=a,b,c 则会循环生成9个静态页面      
2、支持多网页配置,保存路径配置,保存路径可以根据参数设置,如:d:\{#id}\{#name}.htm,里面的变量会被上面的参数替换

这个程序也可以用来抓取其它站点的html,保存到自己的机器上
目前程序还在测试,等自己测试好了,再打包发上来吧

回复:1  发表于:2010-12-03 10:05:15
更新于:2010-12-15 09:47:53

这个礼拜,小贝跟着岳父回家参加亲戚的婚礼,终于又有了一周 2人世界,每天中午2个人在外面找地方吃饭,牛排,小炒……吃完在外面转一圈再上班,晚上加班回去,深夜2个人还跑出去转,吃烧烤,感觉又回到了谈恋爱的时候,嗯,挺开心的感觉 

今天周五了,明天要一起回家接小贝,虽然小东西有时挺烦人的,不过每天不在边上,确实有点想她,听着电话里,还会跟我们嗯嗯啊啊的,也是很开心的

看来带带小贝,再偶尔过过2人世界,还是挺不错的生活,只是外出旅游的机会少多了,还是要等小贝长大啊,上一张父女合影:

 发表于:2010-09-02 13:09:42
更新于:2010-11-05 10:06:51

什么狗P的车子,刚开始是没几天打一次气,今天早上正准备骑去售后检查,一出门就爆胎了,打电话给新日售后,从8:10分打电话,等到9:23,维修人员才来,一来就说车胎不保修,我拿出保修卡,上面写着:轮胎保修3个月,他又说,那是指外胎,不包括内胎

我火了,我说你到底换不换,不换,我也不要你修了,你回去吧,我自己去找地方投诉,他没辙,咕哝着打电话给他领导,征得他领导同意才换胎……

上周还换了个充电器,不能充电,换了个新的,结果晚上一用,都烫手,第二天又去换了一个,看来现在的电动车都tmd越来越烂了,买品牌的电动车,跟杂牌没2样

回复:3  发表于:2010-04-22 19:25:06
更新于:2010-08-26 10:33:55
贴几张我的乖女儿的照片,希望她能乖乖的健康的成长起来
加油,我亲爱的小贝,还有我亲爱的宝宝,yeah
回复:1  发表于:2010-07-03 14:11:38

新的公司,领导也是天天加班的人,因此底下的员工也个个加班,我也刚去,就开始加班,做网站信息采集的工作,自己这块不是很熟悉,也才发现正则表达式入门容易,深入比较难,还要认真学习啊……


©2008 Beinet.cn 版权所有