??xml version="1.0" encoding="utf-8" standalone="yes"?>伊人久久大香线蕉亚洲五月天,亚洲人成电影网站色,亚洲av无码一区二区三区天堂http://www.tkk7.com/dongbule/archive/2014/03/04/410574.html陈于?/dc:creator>陈于?/author>Tue, 04 Mar 2014 02:49:00 GMThttp://www.tkk7.com/dongbule/archive/2014/03/04/410574.htmlhttp://www.tkk7.com/dongbule/comments/410574.htmlhttp://www.tkk7.com/dongbule/archive/2014/03/04/410574.html#Feedback0http://www.tkk7.com/dongbule/comments/commentRss/410574.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/410574.html前段旉部分目ҎmavenQƈ搭徏了nexusU服Q所以在l内做了一个关于maven的分享与培训Q下面是q次的ppt

http://www.tkk7.com/Files/dongbule/maven.zip


----------------------------------------

by 陈于?
QQ:34174409
Mail: dongbule@163.com


]]>
《mac os x选购与初步探索?的分?/title><link>http://www.tkk7.com/dongbule/archive/2014/02/23/410207.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Sun, 23 Feb 2014 04:54:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2014/02/23/410207.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/410207.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2014/02/23/410207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/410207.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/410207.html</trackback:ping><description><![CDATA[用macpȝ已经一q多了,周边同事也越来越多h开始用macQ所以在公司内部做了一ơmac选购和mac os xpȝ比较有技术细节的分nQ留?份ppt用于U念?br /><br />《mac的选购》对最常见的几个macg Q?macbook air,macbook pro,mac mini,imac q行Ҏ分析Q包括性能h和针对的应用分析<br /><a href="http://www.tkk7.com/Files/dongbule/mac%20(1).pptx.zip">《mac选购?/a> http://www.tkk7.com/Files/dongbule/mac%20(1).pptx.zip<br />在完成分享后Q以新增2个同事选购了macbook air  ^_^<br /><br />《mac os x》针对了mac的一些细节分析,Z么在05q以前苹果不能虚拟机和黑ҎQؓ什么在ҎҎx86pȝQ黑Ҏ横行Qmac在内存管理与win有何实质的不同,Q,Q等{?br /><a href="http://www.tkk7.com/Files/dongbule/mac%20os.zip">《mac os x?/a>http://www.tkk7.com/Files/dongbule/mac%20os.zip<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />----------------------------------------<img src ="http://www.tkk7.com/dongbule/aggbug/410207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2014-02-23 12:54 <a href="http://www.tkk7.com/dongbule/archive/2014/02/23/410207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cocos2dx2.0升?.0一些常见变化纪?/title><link>http://www.tkk7.com/dongbule/archive/2013/12/27/408140.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Fri, 27 Dec 2013 15:29:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2013/12/27/408140.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/408140.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2013/12/27/408140.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/408140.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/408140.html</trackback:ping><description><![CDATA[<div>最q接手项目从cocos2dx 2.0 升?3.0 Q至于ؓ什么要升我也弄不清楚Q只感觉3.0是要摆脱cocos2d-iphone的n影,q是要作ȝ态度吗,没时间去了解3.0的核心发生了马变化Q只Z从cocos2dx2.0l常适应?.0做了一些纪录,以便查阅和方便正在从2.0?.0的朋友?br /><br /><div><strong>1.去CC</strong></div><div>之前2.0的CC**,把CC都去掉,基本的元素都是保留的</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0<br />CCSprite  CCCallFunc CCNode ..<br />3.0<br />Sprite CallFunc Node ..</div><br /><div><strong>2.cc***l构体改?/strong></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0        <br />ccp(x,y)        <br />ccpAdd(p1,p2)<br />ccpSub<br />ccpMult<br />ccpLength(p)<br />ccpDot(p1,p2);<br />ccc3()<br />ccc4()<br />ccWHITE<br />CCPointZero<br />CCSizeZero<br /><img src="http://www.tkk7.com/Images/dot.gif" alt="" /><br /><br />2.0<br />Point(x,y)<br />p1+p2;<br />p1-p2<br />p1*p2<br />p.getLength()<br />p1.dot(p2)<br />Color3B()<br />Color4B()<br />Color3B::WHITE<br />Point::ZERO<br />Size:ZERO<br /><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></div><div><br /><strong>3.shared***改变</strong></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0<br />CCSize winSize = CCDirector::sharedDirector()->getWinSize();<br />SpriteFrameCache::sharedSpriteFrameCache()<br />AnimationCache::sharedAnimationCache()<br />NotificationCenter::sharedNotificationCenter()<br />…<br /><br />3.0<br />Size size = Director::getInstance()->getWinSize();<br />SpriteFrameCache::getInstance()<br />AnimationCache::getInstance()<br />NotificationCenter::getInstance()<br />…</div><br /><div><strong>4.PODcd</strong></div><div>使用const为PointQSize,Rectq行帔R修饰</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0<br /><span style="color: #0000FF; ">void</span> setPoint(CCPoint p)<br />3.0<br /><span style="color: #0000FF; ">void</span> setPoint(<span style="color: #0000FF; ">const</span> Point& p)</div><br /><div><strong>5.点触事g</strong></div><div>此部分全面更新采用Event Listener</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->auto dispatcher = Director::getInstance()->getEventDispatcher();<br />auto touchListener = EventListenerTouchOneByOne::create();<br />touchListener->onTouchBegan = CC_CALLBACK_2(FBMainScene::onTouchBegan,<span style="color: #0000FF; ">this</span>);<br />touchListener->onTouchMoved = CC_CALLBACK_2(FBMainScene::onTouchMoved,<span style="color: #0000FF; ">this</span>);<br />touchListener->onTouchEnded = CC_CALLBACK_2(FBMainScene::onTouchEnded, <span style="color: #0000FF; ">this</span>);<br />dispatcher->addEventListenerWithSceneGraphPriority(touchListener, <span style="color: #0000FF; ">this</span>);<br /><br /><span style="color: #0000FF; ">bool</span> FBMainScene::onTouchBegan(Touch *touch,Event *pEvent){<br />    CCLOG("onTouchBegan");<br />    Point point = <span style="color: #0000FF; ">this</span>->convertToWorldSpace(<span style="color: #0000FF; ">this</span>->convertTouchToNodeSpace(touch));<br />    <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />}<br /><br /><span style="color: #0000FF; ">void</span> FBMainScene::onTouchMoved(Touch *touch,Event *pEvent){<br />    CCLOG("onTouchMoved");<br />}<br /><br /><span style="color: #0000FF; ">void</span> FBMainScene::onTouchEnded(Touch *touch,Event *pEvent){<br />    CCLOG("onTouchEnded");<br />}<br /><br />//获得触点的方法也发生了改变:<br />Point point = <span style="color: #0000FF; ">this</span>->convertToWorldSpace(<span style="color: #0000FF; ">this</span>->convertTouchToNodeSpace(touch));<br /><br />//dispatcher控制ҎQ?br />dispatcher->addEventListener…<br />dispatcher->removeEventListener(listener);<br />dispatcher->removeAllListeners();</div><br /><div><strong>6.CC_CALLBACK_*</strong></div><div>CC_CALLBACK_0 CC_CALLBACK_1 CC_CALLBACK_2 CC_CALLBACK_3</div><div>回调函数Q分别携带不同的参数Q方?/div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0<br />CCMenuItemFont *item = CCMenuItemFont::create("q回上个场景", <span style="color: #0000FF; ">this</span>, menu_selector(GameScene::backScene));<br />3.0<br />MenuItemFont *item = MenuItemLabel::create("q回上个场景", CC_CALLBACK_1(GameScene::backScene, <span style="color: #0000FF; ">this</span>));<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; "> new callbacks based on C++11</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#define</span> CC_CALLBACK_0(__selector__,__target__, <img src="http://www.tkk7.com/Images/dot.gif" alt="" />) std::bind(&__selector__,__target__, ##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span> CC_CALLBACK_1(__selector__,__target__, <img src="http://www.tkk7.com/Images/dot.gif" alt="" />) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span> CC_CALLBACK_2(__selector__,__target__, <img src="http://www.tkk7.com/Images/dot.gif" alt="" />) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span> CC_CALLBACK_3(__selector__,__target__, <img src="http://www.tkk7.com/Images/dot.gif" alt="" />) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ##__VA_ARGS__)</div><br /><div><strong>7.使用"Function"对象</strong></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CallFunc::create([&](){<br />        Sprite *sprite = Sprite::create("s");<br />        <span style="color: #0000FF; ">this</span>->addChild(sprite);<br />});</div><br /><div><strong>8.使用clone代替copy</strong></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2.0<br />CCMoveBy *action = (CCMoveBy*) move->copy();<br />action->autorelease();<br />3.0<br />action = move->clone();<br />不需要autoreleaseQ在clone已经实现?/div><br /><div><strong>9.Physics Integration 物理引擎</strong></div><div>暂无使用Qbox2d ?3.0中可以gl?/div><div>?.0的Physics中需要定?PhysicsWorld, PhysicsBody, PhysicsShape, PhysicsJoint {,于box2d总Q用前需要定义CC_USE_PHYSICS</div><div></div><div>……l箋{待补充</div><br /><br />----------------------------------------<br /> <br /> by 陈于?<br /> QQ:34174409<br /> Mail: dongbule@163.com<br /> <br /><br /><br /><br /><br /></div><img src ="http://www.tkk7.com/dongbule/aggbug/408140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2013-12-27 23:29 <a href="http://www.tkk7.com/dongbule/archive/2013/12/27/408140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>朋友要招几个javaQ让帮忙出点面试题目http://www.tkk7.com/dongbule/archive/2013/07/05/401249.html陈于?/dc:creator>陈于?/author>Fri, 05 Jul 2013 09:18:00 GMThttp://www.tkk7.com/dongbule/archive/2013/07/05/401249.htmlhttp://www.tkk7.com/dongbule/comments/401249.htmlhttp://www.tkk7.com/dongbule/archive/2013/07/05/401249.html#Feedback6http://www.tkk7.com/dongbule/comments/commentRss/401249.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/401249.html上周朋友说要招几个高U点的javaQ网上那些java面试宝典已经被h背得熟透了Q让帮忙出出几个面试的问题,主要看看Ҏ使用得语a有较深入得了解,不停留在使用什么开源框Ӟ和对自己一些项目得见解。当然还要装装BQ最后问一些别Z懂得问题Q好压压价钱。。。罪q,公司是他自己?/div>
随便整理了一下,以后面试也可以用刎ͼ主要针对qx日常得应用,只要有稍微阅读过jdk源码Q对数据l构有一点点了解回答应该没什么问题?/div>
随便写了几个

1.     当需要往一?/span>hashMap里面put很多对象Q你会怎么?/span>new q个hashmap?

注:主要审查是否懂得hash的数据结构,是否会用

HashMap(int initialCapacity, float loadFactor)

q个构造函数去创徏一个大容积?/span>Hashl构Q懂得原理即可。如果回{正,可深入问hashmap的扩宏V?/span>

 

2.     实现一个先q先出的队列Q分别有arraylist?/span>linkedlistQ选择哪个Qؓ什么?

注:主要审查是否懂得U性表和链表?/span>

 

3. 当我?/span>new arrayList(20)一个这L对象后,不断往里面dadd(object),加到W?/span>21个后Q内存会有什么调整?/span>

注:主要审查是否懂得可变array的本质,当内存进行扩容的本质?/span>

Arrays.copyOf(elementData, newCapacity)

      

4.     一个类有几百个实现ҎQ突然有个需求:要纪录每个方法被调用的参敎ͼ旉为日志,q个怎么d玎ͼ

注:主要审查是否使用aop{面向切面编E?/span>如果回答正确Ql追问,只对Ҏ名开头ؓ’insert’Q?/span>’update’{方法进行日志纪录,该怎么配对。注Q主要审查对正则表达式的掌握?/span>

 

     5Q在vi的编辑下Q对光标所在行q行整行删除命o是什么,光标移到当前行   W一列的命o是什?/span>

         注:主要审查?/span>linux下最基础?/span>vi~辑命oQ不?/span>vi是否可认为无?/span>linux真实工作Q?/span>

 

6.     机器出现OutOfMemoryErrorQ?/span> PermGen space 的内存溢出错误,解决思\是什?/span>

注:主要审查是否明白Ҏ区或叫永久区的定义,该区是否内存回收Q什么实例会存放在该区,不求具体实现ҎQ主要有大概思\卛_?/span>

 

7.     你的pȝ在明天出现ȝ高ƈ发,该怎么准备

注:Ҏ多种Q主要检查思\QO谈来观察?/span>

 

8.     一?/span>linux服务器每天定时生成一ҎӞ需要将q批文g同步到其他多台服务器Q该怎么实现?/span>

注:Ҏ多种Q如rsyncQ?/span>nfsQ?/span>scp{等Q主要检?/span>linux下文件处理的能力Q主要检查思\?/span>

 

9.     Z么说量减小synchronized Ҏ

注:主要审核对同步实现方法的认识Q如果能回答?#8220;?#8221;的概念,l箋q问Q如果对实例Ҏ?/span>synchronizedQ?/span> 锁的对象是什么,寚w态方法加synchronized Q锁的对象是什?/span>

  

10Q说说单例的使用场景是什么,?/span>spring场景中就有许多单例模?/span>

       注:{案很多Q可以O谈来观察Q能回答出,让多个线E相互通信辑ֈ资源׃n卛_

 

11. 随便?/span>jdk?/span>spring的英?/span>api中找一D让其翻?/span>

注:能大概说出接口的用处卛_



----------------------------------------

by 陈于?
QQ:34174409
Mail: dongbule@163.com



]]>《lua & ngx_lua 的介l与应用 ?/title><link>http://www.tkk7.com/dongbule/archive/2012/03/19/372201.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Mon, 19 Mar 2012 08:33:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2012/03/19/372201.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/372201.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2012/03/19/372201.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/372201.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/372201.html</trackback:ping><description><![CDATA[<div> <div>上段旉使用ngx_lua效果q真不错</div> <div>luaq门语言让h耳目一斎ͼ跟一般的脚本语言如phpQperl不同Qlua被称ZU嵌入式的语aQ当然lua也可以单独的q行~程Q但如果你这么做的话Q那么lua只是一片Q云,当然了,luaq有高执行效率和无^台无关等特点?/div> <div>ngx_lua的搭配更是一ơ架构的q化Q把我们的业务逻辑提前到web serverQ当然这样做是否合理Q这个还有很大的争论Q最Ltaobao的量子统计用ngx_lua取代了phpq是带来了很多亮点,值得我们x和学习?/div> <div></div> <div>上周做了个交讲座,做了份pptQ参考和摘录了淘宝的《打造安全易q维的高性能webq_》http://lych.yo2.cn的《走qlua?br /> <br /> <a href="/Files/dongbule/ngx_lua.pptx">《lua & ngx_lua 的介l与应用?/a> -->  ppt 下蝲<br /> <a href="/Files/dongbule/ngx_lua.pptx">/Files/dongbule/ngx_lua.pptx<br /> <br /> </a> <div> <div>目前使用lua搭配ttQ和lua搭配memcachedQ做用户轨迹的收录的高ƈ发工作,效率非常好,为我们解决了机器的问题还有现成开发框架一些不的到地方,luaq有很多地方需要再q行研究Q相信以后在一些高q发Q小业务的方面会l箋发挥作用<br /><br /><br />----------------------------------------<br /> <br /> by 陈于?<br /> QQ:34174409<br /> Mail: dongbule@163.com<br /></div> </div> <div></div> </div> </div><img src ="http://www.tkk7.com/dongbule/aggbug/372201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2012-03-19 16:33 <a href="http://www.tkk7.com/dongbule/archive/2012/03/19/372201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对setTimeout的误差堆U测试和单分?/title><link>http://www.tkk7.com/dongbule/archive/2012/01/10/368229.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Tue, 10 Jan 2012 07:15:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2012/01/10/368229.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/368229.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2012/01/10/368229.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/368229.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/368229.html</trackback:ping><description><![CDATA[<div><br /> <div> <div>前段旉做了一个团购秒杀倒计时的js展现的例子(<a href="http://www.tkk7.com/dongbule/archive/2011/12/06/365687.html">http://www.tkk7.com/dongbule/archive/2011/12/06/365687.html</a>Q,倒计时的方式主要使用setTimeout的函数进行递归实现Q由于是使用setTimeoutQ所以根据js的引擎,q其中将可能存在一定的旉误差Q一个误差不要紧Q两个误差无所谓,但长旉的误差堆U将出现较大的偏d|所以根据秒杀倒计时的例子Q做了一个简单的模拟的误差堆U测试,q在各个览器中q行试?/div> <div></div> <div>鉴于U杀倒计旉是以一Uؓ单位Q所以下面的例子也都?000毫秒,当然各个览器的实现和附加代码的~写也会造成一定的旉误差Q这部分误差也合q在setTimeout的实现里面计误差?br /> <br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; "><</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; "> style</span><span style="color: #0000FF; ">="width:500px;"</span><span style="color: #0000FF; ">></</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">></span><br /> <span style="color: #0000FF; "><</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">></span><span style="background-color: #f5f5f5; "><br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> w </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> second </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5; "> showtime(){    <br /> showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">  </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; "> Date();    <br /> setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);    <br /> document.getElementById(</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">show</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">).innerHTML</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">second </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">    </span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">(showtime.curr</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">(showtime.last</span><span style="background-color: #f5f5f5; ">||</span><span style="background-color: #f5f5f5; ">showtime.curr)</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">)</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">    <br/></span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;    <br /> showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;    <br /> second</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br /> }<br /> showtime();<br /> </span><span style="color: #0000FF; "></</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">></span></div> <br /> <div>可以看到在各个不同的览器在不同的秒C出现不同的误差,当然q个跟我本机的浏览器和环境有?/div> <br /> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/js/10.png" width="485" height="417" alt="" /><br /> <br /> <div> <div>下面再将q些误差D行叠加测?br /> <br /> <div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; "><</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">></span><br /> <span style="color: #0000FF; "><</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; "> style</span><span style="color: #0000FF; ">="width:500px;"</span><span style="color: #0000FF; ">></</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">></span><br /> <span style="color: #0000FF; "></</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">></span><br /> <span style="color: #0000FF; "><</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">></span><span style="background-color: #f5f5f5; "><br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> w </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> i </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5; "> showtime(){<br />     showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">  </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; "> Date();<br />     f </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />     w</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">(showtime.curr</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">(showtime.last</span><span style="background-color: #f5f5f5; ">||</span><span style="background-color: #f5f5f5; ">showtime.curr)</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />     document.getElementById(</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">show</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">).innerHTML</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">i</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">   </span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">(showtime.curr</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">(showtime.last</span><span style="background-color: #f5f5f5; ">||</span><span style="background-color: #f5f5f5; ">showtime.curr)</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">)  </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">    </span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">w</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; "> <br /> <br /> <br/></span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />     showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;<br />     i</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br /> }<br /> showtime();<br /> </span><span style="color: #0000FF; "></</span><span style="color: #800000; ">script</span><span style="color: #0000ff; ">></span></div> </div> </div> <br /> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/js/4.png" width="360" height="406" alt="" /><br /> <br /> <div>IE和chrome相对较ؓE_Q不知道是不是我本机环境的原因,firefox出现了很多大偏差Q可以选择定时清空q个误差值来处理Q或是采用链式的setTimeOut()来处理?/div> <br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; "><</span><span style="color: #800000; ">div </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; "> style</span><span style="color: #0000FF; ">="width:300px;"</span><span style="color: #0000FF; ">></</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">></span><br /> <span style="color: #0000FF; "><</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">></span><span style="background-color: #f5f5f5; "><br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> w </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> i </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> f ;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> t ;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; "> k </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> </span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5; "> showtime(){<br />     showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">  </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; "> Date();<br />     f </span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; "> setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />     w</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">(showtime.curr</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">(showtime.last</span><span style="background-color: #f5f5f5; ">||</span><span style="background-color: #f5f5f5; ">showtime.curr)</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />     document.getElementById(</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">show</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">).innerHTML</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">i</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">   </span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">w</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">  </span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">(showtime.curr</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">(showtime.last</span><span style="background-color: #f5f5f5; ">||</span><span style="background-color: #f5f5f5; ">showtime.curr)</span><span style="background-color: #f5f5f5; ">-</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">)  </span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">    <br/></span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />     showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;<br />     i</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br /> }<br /> </span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #f5f5f5; "> round(){<br />     </span><span style="background-color: #F5F5F5; color: #0000FF; ">if</span><span style="background-color: #f5f5f5; ">(k</span><span style="background-color: #f5f5f5; ">!=</span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">){<br />         clearTimeout(f);<br />         showtime();<br />         document.getElementById(</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">show</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">).innerHTML</span><span style="background-color: #f5f5f5; ">+=</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">  clear<br/></span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />         w</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br />     }<br />     setTimeout('round()',</span><span style="background-color: #f5f5f5; ">10000</span><span style="background-color: #f5f5f5; ">);<br />     k</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br /> }<br /> showtime();<br /> round();<br /> </span><span style="color: #0000FF; "></</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">></span></div> <br /> <div> <div>其实Z么javascript的定时器会出现所谓的不可靠或偏差的情况,q是可以理解的,最主要的问题是它们q不是所谓的U程Q其?/div> <div>javascript是运行于单线E的环境中,而定时器只是计划代码在未来某个执行的旉Q执行的旉Ҏ不能被保证的Q因为在面的生命周期中Q不同时间可能存在其他代码,或各个浏览器的内核控制住javascriptq程?br /> <br /> <div> <div><strong>settimeout几个见解</strong></div> <div>1、setTimeOut  !=  thread | 旉片的q发调用</div> <div>2、javascript以单U程的方式运行于览器的javascript引擎?/div> <div>3、setTimeout 只是把要执行的代码在讑֮的时间点插入js引擎l护的代码队?/div> <div>4、setTimeout 插入代码队列q不意味着代码׃立马执行?/div> </div> </div> </div> <br /> <div> <div>function showtime(){</div> <div><span style="white-space:pre"> </span>// code 1...</div> <div><span style="white-space:pre"> </span></div> <div><span style="white-space:pre"> </span>f = setTimeout('showtime()',200);     //200毫秒后要插入执行代码Ҏ览器的js队列</div> <div><span style="white-space:pre"> </span></div> <div><span style="white-space:pre"> </span>// code 2...</div> <div>}<br /> <div>以上面面的代码ؓ例,说说它的执行程<br /> <div> <div>Code 1 -> 200毫秒后通知览器有队列插入   ->   Code 2   ->   showtime()  ->    …</div> <div></div> <div>q个U重复递归可能会造成2个问题:</div> <div>1 . 旉间隔可能于定时调用的代码的执行旉</div> <div>2 . 旉间隔或许会蟩q?/div> </div> <br /> <div><span style="color: red; ">旉间隔或许会蟩q?/span></div> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/js/9.png" width="597" height="261" alt="" /><br /> <br /> <div> <div>5ms : code1 代码执行完毕Q?00ms后有定时器进入队?/div> <div>205ms : 定时器进入队列,code2l箋</div> <div>300ms : function代码l束Q定时器从队列中取出Q执?/div> <div>405ms : W二个定时器q入队列,W一个定时器的代码在执行?/div> <div>605ms : W三个定时器意图q入队列p|Q这个点的settimeout丢失</div> </div> <br /> <div> <div>Z避免q?个问题,可以采用铑ּsetTimeOut()q行调用</div> <div>setTimeOut(function(){</div> <div><span style="white-space:pre"> </span>code处理...</div> <div><span style="white-space:pre"> </span>setTimeOut(arguments.callee,interval);</div> <div>},interval);</div> <div>q个模式铑ּ条用setTimeOut(),每次函数执行的时候都会创Z个新的定时器Q第二个setTimeOut调用使用了arguments.callee来获取当前执行的函数引用Qƈ为其讄另外一个定时器Q这L好处在于Q在前一个定时器执行完之前不会向队列中插入新的定时器代码Q确保不会有M的确实间隔,而且它可以保证在下一ơ定时器代码执行前,臛_{待指定的间隔,避免q箋的运行?br /><br /><br /><br /> </div> <div>//-------------//</div> <div>U杀的定时器已经通过正式运行了Q博客记录得不好Q表达不是很清楚Q关于setTimeOut的函C要参考了《JavaScript高E序设计(W??》的W?8章?/div> </div> </div> </div> </div> </div> </div> </div><img src ="http://www.tkk7.com/dongbule/aggbug/368229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2012-01-10 15:15 <a href="http://www.tkk7.com/dongbule/archive/2012/01/10/368229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript 实现'U杀Q团?倒计时展C的记录http://www.tkk7.com/dongbule/archive/2011/12/06/365687.html陈于?/dc:creator>陈于?/author>Tue, 06 Dec 2011 08:22:00 GMThttp://www.tkk7.com/dongbule/archive/2011/12/06/365687.htmlhttp://www.tkk7.com/dongbule/comments/365687.htmlhttp://www.tkk7.com/dongbule/archive/2011/12/06/365687.html#Feedback7http://www.tkk7.com/dongbule/comments/commentRss/365687.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/365687.html阅读全文

]]>
单分析cglib引v的PermSize Space内存溢出http://www.tkk7.com/dongbule/archive/2011/08/21/356987.html陈于?/dc:creator>陈于?/author>Sun, 21 Aug 2011 07:55:00 GMThttp://www.tkk7.com/dongbule/archive/2011/08/21/356987.htmlhttp://www.tkk7.com/dongbule/comments/356987.htmlhttp://www.tkk7.com/dongbule/archive/2011/08/21/356987.html#Feedback0http://www.tkk7.com/dongbule/comments/commentRss/356987.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/356987.html
上段旉有台机器发生?java.lang.OutOfMemoryError: PermGen space 内存溢出的异常,当时大概判断了原因后把 MaxPermSize 配置调高后,把问题解决了,不过IZ旉后还是需要l把review代码?br />
一般来说PermSize Space OOM的话Q第一U可能就是方法区溢出Q第二种是q行时常量池溢出Q第二种查看后基本排除掉Q问题就应该出现在方法区的溢出,Ҏ区用于存放class的相关信息,如类名,讉K修饰W,帔R池,字段描述Q方法描q等{,对于q个区域的溢出,基本上都是运行时产生大量的类填满了整个方法区Q直到溢出?br />
spring aop中都是用到了cglibq类字节码的技术,动态代理的c越多,需要越多的Ҏ区来保证动态生成的class可以加蝲入到内存中去Q?/span>
不过spring框架D的不会因U原因?strong>撑爆perm的应该是各种methodaccessorX和constructoracccessorX{等。本来这些accessor也有~存Q但它们使用内存大小敏感的reference引用着的,且用的是堆内存。当你堆内存吃紧的时候,q些~存摧毁了Q就必然会不断生新的methodAccessor字节码,是这个撑爆了perm?strong>所以除增大permsizeq应该看看^时运行时堆内存是不是l常用光?/span>

下面的例使用cglib直接q行动态代理生大量的动态类Q然后用jconsoleq行观察?br />
首先本机的jvm配置?-XX:PermSize=64M -XX:MaxPermSize=64M Q给到PermSize最大ؓ64M的内?/div>
public class PermgenOOM {

    
public static void main(String[] args) throws InterruptedException {
        
int i=0;
        
while(true){
            Enhancer enhancer 
= new Enhancer();
            enhancer.setSuperclass(Product.
class);
            enhancer.setUseCache(
false);// 关闭CGLib~存Q否则L生成同一个类
            enhancer.setCallback(new MethodInterceptor() {                
                @Override
                
public Object intercept(Object obj, Method method, Object[] args,
                        MethodProxy methodproxy) 
throws Throwable {
                    
// TODO Auto-generated method stub
                    return methodproxy.invokeSuper(obj,args);
                }
            });
            enhancer.create();
            Thread.sleep(
100);
        }
    }
}

很快Q系l就抛出?java.lang.OutOfMemoryError: PermGen space
内存池peimgen的情?/div>

加蝲cȝ情况



q且在方法区中,一个类如果要被垃圾攉器回收掉Q判断的条g是非常苛ȝQ很多h都把Ҏ区称?#8220;怹?#8221;(Permanent Generation),但据?者在本质上是不一致的Q另外还有称gؓ“非堆?#8221;Q不U结q个了?br />
再看看enhancer.setUseCache(false)Q如果选择为true的话Q那么就使用和更Ccd有相同属性生成的cȝ静态缓存,而不会在同一个类文gql被动态加载ƈ视ؓ不同的类Q这个其实跟cȝequals()和hashCode()有关Q它们是与cglib内部的class cache的key相关的?br />
上面的E序 enhancer.setUseCache(false) 改ؓ enhancer.setUseCache(ture)

public class PermgenOOM {

    
public static void main(String[] args) throws InterruptedException {
        
int i=0;
        
while(true){
            Enhancer enhancer 
= new Enhancer();
            enhancer.setSuperclass(Product.
class);
            enhancer.setUseCache(
true);// 或者不写,默认值就是true
            enhancer.setCallback(new MethodInterceptor() {                
                @Override
                
public Object intercept(Object obj, Method method, Object[] args,
                        MethodProxy methodproxy) 
throws Throwable {
                    
// TODO Auto-generated method stub
                    return methodproxy.invokeSuper(obj,args);
                }
            });
            enhancer.create();
            Thread.sleep(
100);
        }
    }
}

内存池peimgen的情?/div>

加蝲cȝ情况



可以发现内存池peimgen和加载类的情况ƈ没有呈现直线上涨Q已l他们一直都使用者动态类生成cȝ静态缓存,但是q种动态创建类使用静态缓存在一些情况下q不适合需求?br />



]]>java~程?Z性能'一些尽量做到的地方http://www.tkk7.com/dongbule/archive/2011/08/15/356577.html陈于?/dc:creator>陈于?/author>Mon, 15 Aug 2011 08:51:00 GMThttp://www.tkk7.com/dongbule/archive/2011/08/15/356577.htmlhttp://www.tkk7.com/dongbule/comments/356577.htmlhttp://www.tkk7.com/dongbule/archive/2011/08/15/356577.html#Feedback13http://www.tkk7.com/dongbule/comments/commentRss/356577.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/356577.html


最q的机器内存又爆满了Q出了新增机器内存外Q还应该好好review一下我们的代码Q有很多代码~写q于随意化,q些不好的习惯或对程序语a的不了解是应该好好打压打压了?/div>
下面是参考网l资源和ȝ一些在java~程中尽可能做到的一些地?br />-
1.量在合适的场合使用单例
使用单例可以减轻加蝲的负担,~短加蝲的时_提高加蝲的效率,但ƈ不是所有地斚w适用于单例,单来_单例主要适用于以下三个方?/div>
W一Q控制资源的使用Q通过U程同步来控制资源的q发讉K
W二Q控制实例的产生Q以辑ֈ节约资源的目?/div>
W三Q控制数据共享,在不建立直接兌的条件下Q让多个不相关的q程或线E之间实现通信
-
2.量避免随意使用静态变?/strong>
要知道,当某个对象被定义为stataic变量所引用Q那么gc通常是不会回收这个对象所占有的内存,?/div>
public class A{
static B b = new B();
}
此时静态变量b的生命周期与Acd步,如果AcM会卸载,那么b对象会常d存,直到E序l止?br />-
3.量避免q多q常的创建java对象
量避免在经常调用的ҎQ@环中new对象Q由于系l不仅要p旉来创建对象,而且q要花时间对q些对象q行垃圾回收和处理,在我们可以控制的范围内,最
大限度的重用对象Q最好能用基本的数据cd或数l来替代对象?br />
-
4.量使用final修饰W?/strong>
带有final修饰W的cL不可z的。在Java核心API中,有许多应用final的例子,例如java.lang.String。ؓStringcL定final防止了用者覆盖length()Ҏ。另外,如果一个类是final的,则该cL有方法都是final的。java~译器会LZ内联(inline)所有的finalҎ(q和具体的编译器实现有关)。此举能够性能q_提高50%?br />
-
5.量使用局部变?/strong>
调用Ҏ时传递的参数以及在调用中创徏的时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量{,都在?Heap)中创建,速度较慢?br />-
6.量处理好包装类型和基本cd两者的使用场所
虽然包装cd和基本类型在使用q程中是可以怺转换Q但它们两者所产生的内存区域是完全不同的,基本cd数据产生和处理都在栈中处理,包装cd是对象,是在堆中产生实例?/div>
在集合类对象Q有对象斚w需要的处理适用包装cdQ其他的处理提倡用基本类型?br />-
7.慎用synchronizedQ尽量减synchronize的方?/strong>
都知道,实现同步是要很大的系l开销作ؓ代h的,甚至可能造成死锁Q所以尽量避免无谓的同步控制。synchronizeҎ被调用时Q直接会把当前对象锁了,在方法执行完之前其他U程无法调用当前对象的其他方法。所以synchronize的方法尽量小Qƈ且应量使用Ҏ同步代替代码块同步?br />-
8.量使用StringBuilder和StringBufferq行字符串连?/strong>
q个׃多讲?br />-
9.量不要使用finalizeҎ
实际上,资源清理放在finalizeҎ中完成是非常不好的选择Q由于GC的工作量很大Q尤其是回收Young代内存时Q大都会引v应用E序暂停Q所以再选择使用finalizeҎq行资源清理Q会DGC负担更大Q程序运行效率更差?br />
-
10.量使用基本数据cd代替对象
String str = "hello";
上面q种方式会创Z?#8220;hello”字符Ԍ而且JVM的字W缓存池q会~存q个字符Ԍ
String str = new String("hello");
此时E序除创建字W串外,str所引用的String对象底层q包含一个char[]数组Q这个char[]数组依次存放了h,e,l,l,o
-
11.单线E应量使用HashMap, ArrayList
HashTable,Vector{用了同步机制Q降低了性能?br />
-
12.量合理的创建HashMap
当你要创Z个比较大的hashMapӞ充分利用另一个构造函?/div>
public HashMap(int initialCapacity, float loadFactor)
避免HashMap多次q行了hash重构,扩容是一件很耗费性能的事Q在默认中initialCapacity只有16Q而loadFactor?.75Q需要多大的定wQ你最好能准确的估计你所需要的最佛_,同样的HashtableQVectors也是一L道理?br />
-
13.量减少对变量的重复计算
?/div>
for(int i=0;i<list.size();i++)
应该改ؓ
for(int i=0,len=list.size();i<len;i++)
q且在@环中应该避免使用复杂的表辑ּQ在循环中,循环条g会被反复计算Q如果不使用复杂表达式,而循环条gg变的话,E序会q行的更快?nbsp;
-
14.量避免不必要的创徏
?/div>
A a = new A();
if(i==1){list.add(a);}
应该改ؓ
if(i==1){
A a = new A();
list.add(a);}
-
15.量在finally块中释放资源
E序中用到的资源应当被释放Q以避免资源泄漏。这最好在finally块中d。不程序执行的l果如何Qfinally块L会执行的Q以保资源的正关闭?nbsp;
-
16.量使用UM来代?a/b'的操?/strong>
"/"是一个代价很高的操作Q用移位的操作会更快和更有效
?/div>
int num = a / 4;
int num = a / 8;
应该改ؓ
int num = a >> 2;
int num = a >> 3;
但注意的是用移位应d注释Q因为移位操作不直观Q比较难理解
-
17.量使用UM来代?a*b'的操?/strong>
同样的,对于'*'操作Q用移位的操作会更快和更有效
?/div>
int num = a * 4;
int num = a * 8;
应该改ؓ
int num = a << 2;
int num = a << 3;
-
18.量定StringBuffer的容?/strong>
StringBuffer的构造器会创Z个默认大?通常?6)的字W数l。在使用中,如果出q个大小Q就会重新分配内存,创徏一个更大的数组Qƈ原先的数组复制q来Q再丢弃旧的数组。在大多数情况下Q你可以在创?StringBuffer的时候指定大,q样避免了在容量不够的时候自动增长,以提高性能?nbsp;
如:StringBuffer buffer = new StringBuffer(1000);  
-
19.量早释放无用对象的引用
大部分时Q方法局部引用变量所引用的对?会随着Ҏl束而变成垃圾,因此Q大部分时候程序无需局部,引用变量昑ּ设ؓnull?/div>
例如Q?/div>
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面q个没必要了,随着Ҏtest()的执行完成,E序中obj引用变量的作用域q束了。但是如果是Ҏ下面Q?/div>
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时Q耗内存操作;或调用耗时Q耗内存的Ҏ
……
}
q时候就有必要将obj赋gؓnullQ可以尽早的释放对Object对象的引用?br />
-
20.量避免使用二维数组
二维数据占用的内存空间比一l数l多得多Q大?0倍以上?br />
-
21.量避免使用split
除非是必ȝQ否则应该避免用splitQsplit׃支持正则表达式,所以效率比较低Q如果是频繁的几十,几百万的调用会耗费大量资源Q如果确实需要频J的调用splitQ可以考虑使用apache的StringUtils.split(string,char)Q频Jsplit的可以缓存结果?br />
-
22.ArrayList & LinkedList
一个是U性表Q一个是链表Q一句话Q随机查询尽量用ArrayListQArrayList优于LinkedListQLinkedListq要Ud指针Q添加删除的操作LinkedList优于ArrayListQArrayListq要Ud数据Q不q这是理论性分析,事实未必如此Q重要的是理解好2者得数据l构Q对症下药?br />
-
23.量使用System.arraycopy ()代替通过来@环复制数l?/strong>
System.arraycopy() 要比通过循环来复制数l快的多 
-
24.量~存l常使用的对?/strong>
可能将l常使用的对象进行缓存,可以使用数组Q或HashMap的容器来q行~存Q但q种方式可能Dpȝ占用q多的缓存,性能下降Q推荐可以用一些第三方的开源工P如EhCacheQOscacheq行~存Q他们基本都实现了FIFO/FLU{缓存算法?br />
-
25.量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因ؓ分配p|造成的。分配的内存块都必须是连l的Q而随着堆越来越满,扑ֈ较大的连l块来困难?br />
-
26.慎用异常
当创Z个异常时Q需要收集一个栈跟踪(stack track)Q这个栈跟踪用于描述异常是在何处创徏的。构些栈跟踪旉要ؓq行时栈做一份快照,正是q一部分开销很大。当需要创Z?Exception ӞJVM 不得不说Q先别动Q我惛_您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含q行时栈中的一两个元素Q而是包含q个栈中的每一个元素?/div>
如果您创Z?Exception Q就得付Z仗好在捕获异常开销不大Q因此可以?try-catch 核心内容包h。从技术上Ԍ您甚臛_以随意地抛出异常Q而不用花费很大的代h。招致性能损失的ƈ不是 throw 操作——管在没有预先创建异常的情况下就抛出异常是有点不d。真正要׃L是创建异常。幸q的是,好的~程习惯已教会我们,不应该不三七二十一抛出异常。异常是为异常的情况而设计的Q用时也应该牢记这一原则?br />
文章主要是ؓ了抛砖引玉,希望有更多牛人的指点

谢谢?nbsp;
xuanyuan 的徏议:
===================================================
7.慎用synchronizedQ尽量减synchronize的方?br />reQ同意,不过文中有个地方说错了,使用synchronized关键字ƈ不一定都是锁定当前对象的Q要看具体的锁是什么。如果是在方法上加的synchronizedQ则是以对象本n为锁的,如果是静态方法则锁的_度是类?br />---------------
9.量不要使用finalizeҎ
reQ同意,其实不推荐用finalizeҎ的根本原因在于,JVM的规范ƈ不保证何时执行该ҎQ所以用q个Ҏ来释放资源很不合适,有可能造成长时间资源得不到释放?br />---------------
16.量使用UM来代?a/b'的操作;17.量使用UM来代?a*b'的操?br />reQ个Z太同意这两条。这样做实有更好的性能Q但是却牺牲了可L。这两个操作W对很多E序员来说ƈ不直观。我认ؓ在如今硬件hg那么昂贵的情况下Q略微牺牲一些性能Q换来更好的可读性和可维护性是好的选择?br />
===================================================
19.量早释放无用对象的引用
大部分时Q方法局部引用变量所引用的对?会随着Ҏl束而变成垃圾,因此Q大部分时候程序无需局部,引用变量昑ּ设ؓnull?/span>
例如Q?/span>
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面q个没必要了,随着Ҏtest()的执行完成,E序中obj引用变量的作用域q束了。但是如果是Ҏ下面Q?/span>
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时Q耗内存操作;或调用耗时Q耗内存的Ҏ
……
}
如果Object obj = new Object(); 如果q对象ƈ不是大对象,q有必要吗?Obj=null;只是告诉jvmq个对象已经成ؓ垃圾Q至于什么时候回Ӟq不能确定! q可L也不好Q?/span>
===================================================


]]>述MongoDB的管理操?/title><link>http://www.tkk7.com/dongbule/archive/2011/07/30/355409.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Sat, 30 Jul 2011 10:23:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2011/07/30/355409.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/355409.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2011/07/30/355409.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/355409.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/355409.html</trackback:ping><description><![CDATA[<div>     不知不觉房pȝ已经使用MongoDB一q多了,记得一q多以前Q正是NOSQL被热炒时QMongoDB更是作ؓNOSQL中的g者,被炒得火烫,也应该就在当时被q股火烫着了,所以义无反儡选择了MongoDBQ现在想惛_时确实有些冲动了Q当时MongoDB的资料还是比较少Q更别说中文资料了,后来q出C用MongoDB成功应用的范例Foursquare的宕Z件。现在确实应该很感谢MongoDB为我们的pȝ服务了一q了Q在q一q的旉里,实出现q不的问题,特别是在理操作上,我想q大概也是因为MongoDB在系l维护上不如Mysql那样有着各种的业界实践,往往只能通过理员自己去摸烦?br /> 下面在q一q的一些简单的理操作做一下记?br /><br /><div><div>    <a href="#x1">Starting and Stopping Mongo</a></div> <div>    <a href="#x2">Security and Authentication</a></div> <div>    <a href="#x3">Monitoring and Diagnostics</a></div> <div>    <a href="#x4">Backups</a></div> </div><br /> <div><strong><a target=""><span style="font-size: 12pt;">Starting and Stopping Mongo</span></a></strong><a target=""><a name='x1' id='x1'></a></a><strong><a target=""><span style="font-size: 12pt;"></span></a><br /> <br /> </strong><span style="background-color: #ccffcc;">MongoDB启动</span><strong><br /> </strong> <div>对了QMongoDB在linux下是无需安装的,从官|上下蝲下安装包后解压,直接执行mongodQ就可以启动MongoDB服务器,当然mongodq有很多的启动选择,q行mongod --help可以查看所有的选择V?br /> <br /> -f [ --config ] arg   configuration file specifying additional options<br /> 一般来_启动选择可以直接写在在mongod后面Q也可以指定配置文gQ用文g来加载各U启动项Q如<br /> /home/mongodb/bin/mongod --config /home/mongodb/conf/mongod.conf</div> <strong><br /> </strong></div> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/1.jpg" alt="" width="725" border="0" height="195" /></div> <div>上面是一台测试机的启动选择V?br /> <br /> dbpath = /home/mongodb/data<br />     指定数据库的存储目录Q如果不讄则以mongodb的根目录为目录,当MongoDB启动之后Q在数据库的存储目录下会创徏一个mongod.lock文gQ它是用来记录当前的mongod的进E号Q同时也用于区分各个mongod的进E实例,所以不同的mongodq程实例是不能用相同的dbpath?br /> logpath = /home/mongodb/mongodb.log<br />     指定日志输出的\径,如果没有讄logappend = trueQ系l会清除原来的日志记录,把已有的文gq行覆盖?br /> logappend = true<br />     日志以追加的方式q行记录<br /> bind_ip = 192.168.86.111<br />     指定对外服务的绑定ipQ这里指定内|的ip方式Q如果外|无Ҏ的处理方式是无法q行q接?br /> port = 27017<br />     指定服务器的监听端口P默认?7017Q如果单个机器要q行多个mongodq程Q则需要给每个q程指定不同的端口号?br /> fork = true<br />     指定以守护进E的方式来启动MongoDBQ如果不指定Q在启动mongod命o是加“&”也是可以的?br /> auth = true<br />     启动mongodb客户端登录的认证机制?br /> master = true<br />     指定该机器ؓM模式下的L器?br /> 配置完配|文件后启栋mongodQ启动时要盯着日志文g看,因ؓ日志通常会告诉我们一些错误或警告的信息,q样能够更好的帮助我们了解和避免错误?br /> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/2.jpg" alt="" width="729" border="0" height="94" /><br /> <br /> <div>q里l出了个提示Q用的?2位的MongodbQ所以MongoDB只是存储最大ؓ2GB的数据。其实这个跟MongoDB的mmap机制有关Q如果是64位则不会存在q种限制?br /> h意一定要盯着日志?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">tail </span><span style="color: #000000;">-</span><span style="color: #000000;">100f </span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">mongodb</span><span style="color: #000000;">/</span><span style="color: #000000;">mongodb.log</span></div> <br /> <div><span style="background-color: #ccffcc;">停止MongoDB</span></div> <div>千万要强调的是千万不要用kill -9d闭mongodQ这h据库会不理一切直接杀死该q程Q会使得数据文g损坏?br /> E_的方法是使用kill -2 pidd闭mongodQ也是当mongodq程接受到关闭指令后会等待当前运行操作或文g分配{操作完毕后Q关闭所有打开的连接,q将~存的数据刷新到盘后才正式关闭?br /> 最E_的方式是使用shutdown命o来结?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">></span><span style="color: #000000;"> use admin<br /> switched to db admin<br /> </span><span style="color: #000000;">></span><span style="color: #000000;"> db.shutdownServer();</span></div> <br /> <div><strong>Security and Authentication</strong><a name='x2' id='x2'></a><br /><strong> <br /> </strong></div> </div> <div>打开mongodb.org的Security文Q第一句话是 Running Without Security(Trusted Environment)Q跟我们世界上没有什么百分百安全的环境,最好的安全是放在一个安全的环境中运行,q么无底气的话语未免也让Zؓ它的安全担心Q不q事实上MongoDBq是有安全认证模式的Q只不过跟mysqlҎh有一点简陋?br /> <br /> <span style="background-color: #ccffcc;">MongoDB的安?/span><br /> MongoDB目前只支持最基本的安全认证,如果我们开启了安全性检查,则只有数据库认证用户才能q行d操作Q当然我们还可以创徏d权限用户和只L限用P如果我们在admin的数据库中进行创建用P那么admin中的用户׃被当作超U用P用户可以d所有的数据库,q且q可以进行特D的理操作Q比如可以再创徏其他用户关闭q程{操作?br /> <br /> <span style="background-color: #ccffcc;">配置MongoDb用户认证</span><br /> Ҏ官网上的例子Q我们也来创Z个超U用P一个test库中hd操作的普通用P一个test库中只有L作的普通用戗?/div> <br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">> use admin<br /> switched to db admin<br /> > db.addUser(</span><span style="color: #000000;">"</span><span style="color: #000000;">cyz</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br /> {<br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">_id</span><span style="color: #000000;">"</span><span style="color: #000000;"> : ObjectId(</span><span style="color: #000000;">"</span><span style="color: #000000;">4dba5fe7c6792ae30fea3c31</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">cyz</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;"> : false</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">8658a5bf469e005b047560619ef0d51c</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /> }<br /> > use test<br /> switched to db test<br /> > db.addUser(</span><span style="color: #000000;">"</span><span style="color: #000000;">cyz001</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br /> {<br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">cyz001</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;"> : false</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">7a597bef551027cc2161d5e0efe4049e</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /> }<br /> > db.addUser(</span><span style="color: #000000;">"</span><span style="color: #000000;">cyz002</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">true)<br /> {<br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">cyz002</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;"> : true</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">2dde0a3777cd7dd92459a6c3f98afac6</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /> }<br /> </span></div> </div> <div>q里cyz是在admin库中创徏Q属于超U用P可以Ҏ有库q行操作Q在test库中创徏的cyz001和cyz002属于test库的操作人员Q只能对test库进行相应操作,记得要ؓ安全验证生效需要将启动auth讄为true?br /> <br /> <span style="background-color: #ccffcc;">查看用户</span><br /> 所有的用户信息都存储在每个数据库的db.system.users中,可以使用find()q行查看<br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">> use admin<br /> switched to db admin<br /> > db.system.users.find()<br /> { </span><span style="color: #000000;">"</span><span style="color: #000000;">_id</span><span style="color: #000000;">"</span><span style="color: #000000;"> : ObjectId(</span><span style="color: #000000;">"</span><span style="color: #000000;">4dba5fe7c6792ae30fea3c31</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">cyz</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;"> : false</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;"> : <br /> <br /> </span><span style="color: #000000;">"</span><span style="color: #000000;">8658a5bf469e005b047560619ef0d51c</span><span style="color: #000000;">"</span><span style="color: #000000;"> }</span></div> <br /> 其中的pwd是根据用户名和用户密码生成的散列倹{?br /> <br /> <span style="background-color: #ccffcc;">修改用户</span><br /> 不管是添加用P修改用户密码Q修改用h作权限都使用addUser()来完成。删除用户可以用remove()来实现?/div> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">> db.system.users.find({</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;">cyz001</span><span style="color: #000000;">"</span><span style="color: #000000;">})</span></div> </div> <br /> <div><span style="background-color: #ccffcc;">更多的安全考虑</span><br /> <br /> 刚说了MongoDB的安全认证其实还是简陋的Q所以我们还是有其他很多的安全考虑?br /> 1.比如说MongoDB传输协议是不加密的,如果需要加密的话,我们可以考虑使用ssh隧道或是他们的技术来对客L和服务端之间的通讯q行加密?br /> 2.MongoDB部v在只有客L服务器才能访问到的环境,比如内网Qvpn|络中,可以使用 bind_ip = 本机或内|??br /> 3.如果实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES{技术进行访问限制?br /> <br /> <div><strong>Monitoring and Diagnostics</strong><a name='x3' id='x3'></a><br /> <br /> <div>官网首先l我们推荐了mongostat监控工具Q基本上mongostat可以作ؓ一个外部观MongoDB内部状态指标的工具Qƈ且一U更Cơ,如果出现一些性能问题可以用这里入手进行分析?br /> <br /> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/3.jpg" alt="" width="1144" border="0" height="122" /></div> <br /> <div>q里的属性都可以通过mongostat --helpq行查看Q有几个列需要解释一下,可以帮助到我们发生性能问题时比较准备的扑ֈ定位?br /> <br /> faultsQ这是一个重要的性能指标Q显CZ的机器每U页面故障的数量Q这个是mongoDB映射到虚拟地址I间Q而不是物理内存,q个值如果飙高的话,可能意味着你的机器没有_的内存来存储数据和磁盘的讉K?br /> flushesQ每U做了多次fsyncQ表面多次数据被刷新进了磁盘?br /> mappedQ是指mmap有多数据量Q也是服务器的内存映射Q其中包含了虚拟内存和常d存?br /> lockedQ这个D面全局写入锁占用了机器多少旉Q?当放生全局写入锁时Q所有的查询操作都将{待Q直到写入锁的解锁,如果q个锁飙高有可能是你的程序那部分出现问题?br /> idx missQB树未命中的比例,q个应该是我们查询的命中的实时指敎ͼ一般在特定查询中会有用到?br /> qr | qwQ如果有太多的查询进行处理,它们׃一个队列的方式q行Q如果这个值飙高的话,那么查询也会变得很慢Q因为后面的队列必须{待前面的队列执行完毕,高ƈ发时Q一般队列g升高?br /> 另外我们q可以在mongodb shell中进行检查,使用db.serverStatus()</div> </div> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/4.jpg" alt="" width="683" border="0" height="376" /></div> <br /> <div>基本上db.serverStatus()跟mongostat 差不多,不过它显C的数据更ؓ具体Q它也有一个缺陷就是它的数据是静态的Q不是实时的?br /> <br /> <span style="background-color: #ccffcc;">Http Console</span><br /> 其实mongodbq提供了一个跟直观的检工P在默认情况下Q启动mongodb的同时还会启动一个http的服务器Q用|页展示的信息比前两个工h得更加直观,启动默认的监听端口ؓ28017 httpQ?/ip:28017<br /> <br /> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/5.jpg" alt="" width="1178" border="0" height="385" /></div> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/6.jpg" alt="" width="1151" border="0" height="236" /><br /> 基本上我们可以看到查询,复制Q锁{等q些的情况,具体的参数还是上官网looklookQhttp://www.mongodb.org/display/DOCS/Http+Interface<br /> <div>当然了,我们q可以用其他的专业监控软gq行监控Q如nagiosQcactiQ这些都有mongodb的插件?br /> <br /> <div><strong>Backups</strong><a name='x4' id='x4'></a><br /> MongoDB的备份机制还是不错的Q备份的方式也是很多Q这个ƈ不比mysql要差?br /> <br /> Shutdown and Backup<br /> 关闭服务Q直接把dbpath参数的目录进行备份,只需把所有的文gq行复制到其他地方就可以Q不q如果这个备份是在服务启动时候做的话Q有可能备䆾的文件会被损坏,虽然q种关闭服务的备份很有效也很安全Q都效果相当不理惟?br /> <br /> mongodump & mongorestore<br /> mongodump直就是mysqldump的另一版,如果你用过mysqldump那就再熟悉不q了Qmongodbdump可以使用在各个客LQ对正在q行的mongodb服务做出查询Q然后将所有查到的文本写入到客L的磁盘?/div> </div> <img src="http://www.tkk7.com/images/blogjava_net/dongbule/46046/7.jpg" alt="" width="704" border="0" height="257" /><br /> <br /> <div><br /> 除了mongodumpQMongoDBq提供了从备份中恢复数据的工具mongorestoreQmongorestore从mongodump获取l果Qƈ备份的数据插入到运行的MongoDB实例?/div> <br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">./mongodump --db test --collection user --out - > /home/chenyz/cyz.bson<br /> ./mongorestore --db test --collection user --directoryperdb /home/chenyz/cyz.bson --drop cyz.bson</span></div> <br /> <div>上面的例子中Q指定了要备份的db和要备䆾的collectionQ?-drop表明要在恢复前删除集合,否则Q数据将和现有的集合数据合ƈ?br /> <br /> <span style="background-color: #ccffcc;">M备䆾</span><br /> 上面说的几种备䆾数据方式已经很灵zMQ但都不及在从服务器上备份来得方便,从服务器的数据几乎是于主服务器进行同步,涉及C从方面还有很多,从服务器备䆾׃攑֜q里讲了?br /> <br /> <span style="background-color: #ccffcc;">修复</span><br /> 遇到一些停电,或非法关闭mongodbQ不合理备䆾文g的操作,往往会出现文件损毁的提示Q幸好,mongodb内置的修复功能会试着L复损坏的文g?br /> 操作很简单,只需在启动mongod 加入 --repair启动,pȝ׃所有的文g导入忽略那些无效的文然后进行导入,完成之后Q会重新建立索引Q数据量大的话需要花费很长的旉Q因为所有的文g都需要进行验证,所有的索引都需要重建,另外修复数据库还能v到压~数据的作用Q闲|的I间Q碎片在修复后会被重新回收进行用?br /> <br /> 另外在shell中也可以直接q行repair操作<br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">> db.repairDatabase()<br /> {<br />         </span><span style="color: #000000;">"</span><span style="color: #000000;">ok</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">1</span><span style="color: #000000;"><br /> }</span></div> </div><img src ="http://www.tkk7.com/dongbule/aggbug/355409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2011-07-30 18:23 <a href="http://www.tkk7.com/dongbule/archive/2011/07/30/355409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java数据l构-Comparable&Comparatorhttp://www.tkk7.com/dongbule/archive/2011/06/15/352361.html陈于?/dc:creator>陈于?/author>Wed, 15 Jun 2011 07:07:00 GMThttp://www.tkk7.com/dongbule/archive/2011/06/15/352361.htmlhttp://www.tkk7.com/dongbule/comments/352361.htmlhttp://www.tkk7.com/dongbule/archive/2011/06/15/352361.html#Feedback0http://www.tkk7.com/dongbule/comments/commentRss/352361.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/352361.html在深入了解TreeMap之前Q有两个接口要先弄清楚,分别是Comparable和Comparator

Comparable & Comparator

Comparable
Comparable 此接口强行对实现它的每个cȝ对象q行整体排序。这U排序被UCؓcȝ自然排序Q类?compareTo Ҏ被称为它的自然比较方法。对象本w就已经支持自比较所需要实现的接口Q如 String、Integer 自己可以完成比较大操作)?br />
它只有一个方?int compareTo(T o),用来比较当前对象和传入的参数Q查看jdk apiQ共有这一批类实现了此接口Q见下图


打开实现了该接口的Integer包装cL看源?/div>
public final class Integer extends Number implements Comparable<Integer> {

    
public int compareTo(Integer anotherInteger) {
    
int thisVal = this.value;
    
int anotherVal = anotherInteger.value;
    
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }

可以看到该方法通过当前的Integer对象的值是否大于传入的参数来得到返回|Integer的compareTo实现是按数字大小的自然排序,再找另一个例子String

public final class String
    
implements java.io.Serializable, Comparable<String>, CharSequence
{
public int compareTo(String anotherString) {
    
int len1 = count;
    
int len2 = anotherString.count;
    
int n = Math.min(len1, len2);
    
char v1[] = value;
    
char v2[] = anotherString.value;
    
int i = offset;
    
int j = anotherString.offset;

    
if (i == j) {
        
int k = i;
        
int lim = n + i;
        
while (k < lim) {
        
char c1 = v1[k];
        
char c2 = v2[k];
        
if (c1 != c2) {
            
return c1 - c2;
        }
        k
++;
        }
    } 
else {
        
while (n-- != 0) {
        
char c1 = v1[i++];
        
char c2 = v2[j++];
        
if (c1 != c2) {
            
return c1 - c2;
        }
        }
    }
    
return len1 - len2;
    }

可以看出String的compareTo实现是按字符串中字符的UnicodeD行排序的Q也真是因ؓ各种cd现的不同Q所以只有在怺可比的类才能q行排序Q否则会抛出java.lang.ClassCastException的异常。应该说Comparable是集合内部实现的排序Q想要进行集合外的排序就需要Comparator接口?br />
Comparator
如果一个类不能实现Comparable接口Q那么我们自己可以提供Comparator的排序,如果你不喜欢~省的Comparator行ؓQ照样可以编写自qComparator?br />
Comparator只有2个方法,分别为int compare(T o1, T o2) 和boolean equals(Object obj)

Comparator的compareҎ的返回值和Comparable的compareToq回值基本相|如果排序W一个元素出现在W二个元素之前,则返回一个负|如果W一个元素出现在W二个元素后面,q回一个正|再否则,q回零。与Comparable不同的是Comparator是由用户自行军_处理?br /> 通过一个小例子可以比较明确的看?/div>
      class ComparatorTest implements Comparator{
          
public int compare(Object u1, Object u2) {
            String uname1 
= ((User)u1).getName();
            String uname2 
= ((User)u2).getName();
            
return uname1.compareTo(uname2);
        }
      }
      
class User {
          
private String name;
          
public String getName(){
              
return this.name;
          }
      }

Comparator比较函数Ҏ些对?collection q行整体排序。可以将 Comparator 传递给 sort ҎQ如 Collections.sortQ,从而允许在排序序上实现精控制。还可以使用 Comparator 来控制某些数据结构(?TreeSet ?TreeMapQ的序?/div>

]]>说说MongoDB的ObjectIdhttp://www.tkk7.com/dongbule/archive/2011/06/12/352138.html陈于?/dc:creator>陈于?/author>Sun, 12 Jun 2011 10:30:00 GMThttp://www.tkk7.com/dongbule/archive/2011/06/12/352138.htmlhttp://www.tkk7.com/dongbule/comments/352138.htmlhttp://www.tkk7.com/dongbule/archive/2011/06/12/352138.html#Feedback8http://www.tkk7.com/dongbule/comments/commentRss/352138.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/352138.html前段旉有个朋友问我Q分布式主键生成{略在我们这Ҏ怎么实现的,当时我给的答案是sequenceQ当然这在不高ƈ发的情况下是没有M问题Q实际上Q我们的主键生成是可控的Q但如果是在分布式高q发的情况下Q那肯定是有问题的?br />
H然惌vmongodb的objectidQ记得以前看q文,objectid是一U轻量型的,不同的机器都能用全局唯一的同U方法轻量的生成它,而不是采用传l的自增的主键策略,因ؓ在多台服务器上同步自动增加主键既费力又费Ӟ不得不佩服,mongodb从开始设计就被定义ؓ分布式数据库?br />下面深入一Ҏȝq个Objectid的底l,在mongodb集合中的每个document中都必须有一?_id"建,q个键的值可以是Mcd的,在默认的情况下是个Objectid对象?br />当我们让一个collection中插入一条不带_id的记录,pȝ会自动地生成一个_id的key

> db.t_test.insert({"name":"cyz"})
> db.t_test.findOne({"name":"cyz"})
{ "_id" : ObjectId("4df2dcec2cdcd20936a8b817"), "name" : "cyz" }

可以发现q里多出一个Objectidcd的_idQ当然了Q这个_id是系l默认生成的Q你也可以ؓ其指定一个|不过在同一collections中该值必L唯一?br />
?ObjectId("4df2dcec2cdcd20936a8b817")q串值拿出来q对照官|的解析来深入分析?br />
"4df2dcec2cdcd20936a8b817" 以这D字W串Z来进行解析,q是一?4位的字符Ԍ看v来很长,很难理解Q实际上它是由ObjectId(string)所创徏的一l十六进制的字符Q每个字节两位的十六q制数字Qd使用?2字节的存储空_可能有些朋友会感到很奇怪,居然是用?2个字节,而mysql的INTcd也只?个字节,不过按照现在的存储设备,多出来的q点字节也应该不会成Z么瓶颈,实际上,mongodb在设计上无处不在的体现着用空间换旉的思想Q接下看?br />
下面是官|指定Bson中ObjectId的详l规?br />


TimeStamp
?位是一个unix的时间戳Q是一个intcdQ我们将上面的例子中的objectid的前4位进行提?#8220;4df2dcec”Q然后再他们安装十六进制专为十q制Q?#8220;1307761900”Q这个数字就是一个时间戳Qؓ了让效果更佳明显Q我们将q个旉戌{换成我们习惯的时间格?/div>
$ date -d '1970-01-01 UTC 1307761900  sec'  -u
2011q?nbsp;06?nbsp;11?nbsp;星期?nbsp;03:11:40 UTC

?个字节其实隐藏了文创徏的时_q且旉戛_在于字符的最前面Q这意味着ObjectId大致会按照插入进行排序,q对于某些方面v到很大作用,如作为烦引提高搜索效率等{。用时间戳q有一个好处是Q某些客L驱动可以通过ObjectId解析记录是何时插入的Q这也解{了我们qx快速连l创建多个ObjectidӞ会发现前几位数字很少发现变化的现实,因ؓ使用的是当前旉Q很多用h心要Ҏ务器q行旉同步Q其实这个时间戳的真实值ƈ不重要,只要其M停增加就好?/div>
Machine
接下来的三个字节Q就?2cdcd2 ,q三个字节是所在主机的唯一标识W,一般是机器L名的散列|q样q保了不同L生成不同的机器hash|保在分布式中不造成冲突Q这也就是在同一台机器生成的objectid中间的字W串都是一模一L原因?br />
pid
上面的Machine是ؓ了确保在不同机器产生的objectid不冲H,而pid是Z在同一台机器不同的mongodbq程产生了objectid不冲H,接下来的0936两位是产生objectid的进E标识符?br />
increment
前面的九个字节是保证了一U内不同机器不同q程生成objectid不冲H,q后面的三个字节a8b817Q是一个自动增加的计数器,用来保在同一U内产生的objectid也不会发现冲H,允许256?ơ方{于16777216条记录的唯一性?/div>
客户端生?/strong>
mongodb产生objectidq有一个更大的优势Q就是mongodb可以通过自n的服务来产生objectidQ也可以通过客户端的驱动E序来生,如果你仔l看文档你会感叹Qmongodb的设计无处不在的?br />
用空间换旉的思想Q比较objectid是轻量Q但服务端生也必须开销旉Q所以能从服务器转移到客L驱动E序完成的就量的{U,必须事务扔l客L来完成,减低服务端的开销Q另q有一点原因就是扩展应用层比扩展数据库层要变量得多?br />
好吧Q既然我们了解到我们的程序生objectid是在客户端完成,那再l箋Q进一步了解,打开mongodb java driver源码Q无源码可以到mongodb官网q行下蝲Q下面摘录部分代?br />
public class ObjectId implements Comparable<ObjectId> , java.io.Serializable {

    
final int _time;
    
final int _machine;
    
final int _inc;

    
public ObjectId( byte[] b ){
        
if ( b.length != 12 )
            
throw new IllegalArgumentException( "need 12 bytes" );
        ByteBuffer bb 
= ByteBuffer.wrap( b );
        _time 
= bb.getInt();
        _machine 
= bb.getInt();
        _inc 
= bb.getInt();
        _new 
= false;
    }
    
    
public ObjectId( int time , int machine , int inc ){
        _time 
= time;
        _machine 
= machine;
        _inc 
= inc;
        _new 
= false;
    }
    
    
public ObjectId(){
        _time 
= (int) (System.currentTimeMillis() / 1000);
        _machine 
= _genmachine;
        _inc 
= _nextInc.getAndIncrement();
        _new 
= true;
    }


Q完整代码请查看源码Q?/span>

q里可以发现ObjectId的构建可以有多种方式Q可以由自己制定字节Q也可以指定旉Q机器码和自增|q里重点看看驱动E序默认的构建,也就是public ObjectId()
可以看到objectid主要由_time _machine _inc 所l成Q其?_time直接?System.currentTimeMillis() / 1000)计算出所谓的旉戻Iq里很简单,接下来是重点Q主要看?strong>机器码和q程?/strong>的构?/div>

 private static final int _genmachine;
    
static {

        
try {
            final int machinePiece;//机器码块
            {
                StringBuilder sb 
= new StringBuilder();
                Enumeration
<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();//NetworkInterface此类表示一个由名称和分配给此接口的 IP 地址列表l成的网l接口,它用于标识将多播l加入的本地接口Q这里通过NetworkInterface此机器上所有的接口
                while ( e.hasMoreElements() ){
                    NetworkInterface ni 
= e.nextElement();
                    sb.append( ni.toString() );
                }
                machinePiece 
= sb.toString().hashCode() << 16//得到所有接口的字符串进行取散列?/span>
                LOGGER.fine( "machine piece post: " + Integer.toHexString( machinePiece ) );
            }

            final int processPiece;//q程?/span>
            {
                
int processId = new java.util.Random().nextInt();
                
try {
                    processId 
= java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode();//RuntimeMXBean是Java虚拟机的q行时系l的理接口Q这里是q回表示正在q行?nbsp;Java 虚拟机的名称Qƈq行取散列倹{?/span>
                }
                
catch ( Throwable t ){
                }

                ClassLoader loader 
= ObjectId.class.getClassLoader();
                
int loaderId = loader != null ? System.identityHashCode(loader) : 0;

                StringBuilder sb 
= new StringBuilder();
                sb.append(Integer.toHexString(processId));
                sb.append(Integer.toHexString(loaderId));
                processPiece 
= sb.toString().hashCode() & 0xFFFF;
                LOGGER.fine( 
"process piece: " + Integer.toHexString( processPiece ) );
            }
            _genmachine 
= machinePiece | processPiece; //最后将机器码块的散列gq程块的散列D行位或运,得到 _genmachine 
            LOGGER.fine( "machine : " + Integer.toHexString( _genmachine ) );
        }
        
catch ( java.io.IOException ioe ){
            
throw new RuntimeException( ioe );
        }
    }

 Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
               while ( e.hasMoreElements() ){
                    NetworkInterface ni = e.nextElement();
                    sb.append( ni.toString() );
                }
 machinePiece = sb.toString().hashCode() << 16;

q里的NetworkInterface.getNetworkInterfaces();取得的接口通常是按名称Q如 "le0"Q区分的Q大U是下面的类?/div>
name:lo (Software Loopback Interface 1) index: 1 addresses:
/0:0:0:0:0:0:0:1;
/127.0.0.1;
name:net0 (WAN Miniport (SSTP)) index: 
2 addresses:
name:net1 (WAN Miniport (IKEv2)) index: 
3 addresses:
name:net2 (WAN Miniport (L2TP)) index: 
4 addresses:
name:net3 (WAN Miniport (PPTP)) index: 
5 addresses:
name:ppp0 (WAN Miniport (PPPOE)) index: 
6 addresses:

q里Z么要采取q样斚wq行取散列|感觉有些不太理解Q应该网l接口本w相对而言是ƈ不稳定的

int processId = new java.util.Random().nextInt();
 try {
        processId = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode();
 }
 catch ( Throwable t ){
}

RuntimeMXBean是Java虚拟机的q行时系l的理接口Q这里是q回表示正在q行?Java 虚拟机的名称Qƈq行取散列|如果在这q程中出现异常,processId 以随机数的方式l箋计算

_genmachine = machinePiece | processPiece;
最后将机器码块的散列gq程块的散列D行位或运,当然q里是十q制Q你把这里的十进制专为十六进Ӟ׃发现q块的值就是生产objectid中间部分的|q里的构服务端的构徏是有些不一LQ不q最基本的构建元素还是一致的Q就?strong>TimeStampQMachine QpidQincrement?br />
mongodb的ObejctId生思想在很多方面挺值得我们借鉴的,特别是在大型分布式的开发,如何构徏轻量U的生Q如何将生的负载进行{U,如何以空间换取时间提高生产的最大优化等{?/div>
----------------------------------------

by 陈于?
QQ:34174409
Mail: dongbule@163.com


]]>js全局/局部变量的乌龙问题http://www.tkk7.com/dongbule/archive/2011/06/02/351608.html陈于?/dc:creator>陈于?/author>Thu, 02 Jun 2011 08:11:00 GMThttp://www.tkk7.com/dongbule/archive/2011/06/02/351608.htmlhttp://www.tkk7.com/dongbule/comments/351608.htmlhttp://www.tkk7.com/dongbule/archive/2011/06/02/351608.html#Feedback0http://www.tkk7.com/dongbule/comments/commentRss/351608.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/351608.html今天在写个一Djs代码出现了变量值出现异常的问题Q把代码做了提取Q简单的如下?/div>
<script>
function a1(){
    
var a = [{"name":"1"},{"name":"2"},{"name":"3"}];
    
for(i=0;i<a.length;i++){
        alert(i
+" first");
        a2(a[i]);
        alert(i
+" second");
    }
}
function a2(obj){
    
for (i in obj) {
    }
    
return "hello";
}
</script>
<body onload="a1();">


在第一ơalert(i)?0 first
在第二次alert(i)?name second

Z么会出现q样的情况,明明在a2函数传进ȝ是实参,q且也没有对参数a[i]q行改写
在反复查看问题后发现是i变量的问题,在函数a1()中,i被定义成Z全局变量Q而在函数a2()中,i又是一个全局变量Q所以在a2的for (i in obj) 循环中i被重新赋值成"name"
q个乌龙是没有养成在一些时函数定义成局部变量造成的,特别是在一些forQwhileQif的操作中Q时变量必d义成局部变量否则会出现全局变量被改写的情况?br />
再回一下定义全局变量Q局部变量的规则
在函数外部,使用varQ或直接使用变量Q如var a=1;?a=1; 定义了全局变量
在函数内部,直接使用变量Q如a=1;也定义了全局变量
在函数内部,使用varq行定义是局部变?br />
修改一下上面的代码

<script>
function a1(){
    
var a = [{"name":"1"},{"name":"2"},{"name":"3"}];
    
for(var i=0;i<a.length;i++){
        alert(i
+" first");
        a2(a[i]);
        alert(i
+" second");
    }
}
function a2(obj){
    
for (var i in obj) {
    }
    
return "hello";
}
</script>
<body onload="a1();">


]]>
房地图google map的初步应用点?4)http://www.tkk7.com/dongbule/archive/2011/06/02/351597.html陈于?/dc:creator>陈于?/author>Thu, 02 Jun 2011 06:01:00 GMThttp://www.tkk7.com/dongbule/archive/2011/06/02/351597.htmlhttp://www.tkk7.com/dongbule/comments/351597.htmlhttp://www.tkk7.com/dongbule/archive/2011/06/02/351597.html#Feedback1http://www.tkk7.com/dongbule/comments/commentRss/351597.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/351597.html房地图google map的初步应用点?1)

google map距的实现和分析

不断有传闻google map在今q的7?号之后在大陆停止q营Q具体原因是因ؓ天朝的牌照问题,q个׃多讲了,可以发现现在搜房|的地图Q和安居客等的地囄U都撤下 google mapQ而重新选择了mapabc或baiduQ当然网易房产地图也不例外,现在也在使用mapabc作ؓ|易房地图的开发,预计在6月底前上U,?时再跟大家分享一下mapabc的一些开发实c?br />
q是说回google map的开发,自从上次Z个qq就有不h在问距怎么实现Q当然很多h想的是拿来主义的Q当时是拿http://xf.house.163.com /gz/map/000B.html的例子出来,但确实页面上q行了封装也写得比较乱,所以还是比较难以抽,先给个简单实现的例子Q?/div>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=GBK"/>
<title>163|易房</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  
var map;
  
function initialize() {
    
var myLatlng = new google.maps.LatLng(23.116193,113.374525);
    
var myOptions = {
      zoom: 
15,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map 
= new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }
var polyline;
var polylinesArray = [];
//距离标记数组
var lenArray = []; 
var rule = null
 
//距离
function getDistance(){
    
//启动整个地图的click侦听
    rule = google.maps.event.addListener(map,"click",function(event){
        addMarker(event.latLng);
    });
}
//d新标?/span>
function addMarker(location){
    
//标记选项
    var myOptions = {
        position : location,
        draggable :
false,
        map : map,
    };
    marker 
= new google.maps.Marker(myOptions);
    
//标记压入数l?/span>
    lenArray.push(marker);
    
//计算距离 
    drawOverlay();
}
//d路径覆盖?/span>
    function drawOverlay(){
    
//路线数组
    var flightPlanCoordinates = [];
    
//坐标压入\U数l?/span>
    if (lenArray) {
        
for (i in lenArray) {
            flightPlanCoordinates.push(lenArray[i].getPosition());
        }
    }
    
//路径选项
    var polylineOptions = {
        path : flightPlanCoordinates,
        map : map,
        strokeColor : 
"#FF0000",
        strokeOpacity : 
1.0,
        strokeWeight : 
2
    };
    polyline 
= new google.maps.Polyline(polylineOptions);
    
//清除原有折线路径
    if (polylinesArray) {
        
for (i in polylinesArray) {
            polylinesArray[i].setMap(
null);
        }
        polylinesArray 
= [];
    }
    polyline.setMap(map);
    polylinesArray.push(polyline);
    alert((polyline.getLength()
/1000).toFixed(3+ "km");
}
google.maps.LatLng.prototype.distanceFrom 
= function(latlng) {
    
var lat = [this.lat(), latlng.lat()]
    
var lng = [this.lng(), latlng.lng()] 
    
var R = 6378137;
    
var dLat = (lat[1- lat[0]) * Math.PI / 180;
    
var dLng = (lng[1- lng[0]) * Math.PI / 180;
    
var a = Math.sin(dLat / 2* Math.sin(dLat / 2+ Math.cos(lat[0* Math.PI / 180* Math.cos(lat[1* Math.PI / 180* Math.sin(dLng / 2* Math.sin(dLng / 2);
    
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    
var d = R * c;
    
return Math.round(d);

google.maps.Marker.prototype.distanceFrom 
= function(marker) {
    
return this.getPosition().distanceFrom(marker.getPosition());
}
google.maps.Polyline.prototype.getLength 
= function() {
    
var d = 0;
    
var path = this.getPath();
    
var latlng;
    
for (var i = 0; i < path.getLength() - 1; i++) {
        latlng 
= [path.getAt(i), path.getAt(i + 1)];
        d 
+= latlng[0].distanceFrom(latlng[1]);
    }
    
return d;
}
</script>
</head>
<body onload="initialize()">
  
<div id="map_canvas" style="width: 500px; height: 400px"></div>
  
<href="#this" onclick="getDistance();">开始测?/span></a>
</body>
</html>



例子l完了,其中距的计是抄了google的示例,想简单拿来应用的到这里就可以l束了,q有点兴的可以看看下面的简单分析:

说到距无非是U的计算Q根据google map apiQ测距的U性实现我们采?strong>Polylinec,Polyline是折U是地图上的q接U段的线性叠加层Q扩展自MVCObject?/div>
距是由U组成,然后Ҏ一l线的长短计出U的启动和终点线的距,Ҏq个思\Q我们定义出
var polyline;
var polylinesArray = [];
其中polyline是当前画出来q条U,polylinesArray是一个数l,当每话出一条线将q条Upush到polylinesArrayq个数组中去?/div>
另外一条线其实是由两个点,始点和终Ҏl成Q所以我们也定义一?br />var lenArray = [];
lenArray是一个数l,用来记录鼠标点过的每一个点的信?br />也就是说整个距是由每一条线所l成Q而一条线是由2个点l成?br />
思\理清楚了Q接着一步一步看

当我们点M开始测距时Q就需要启动一个事件的监听Q对整个map的click事g监听
    rule = google.maps.event.addListener(map,"click",function(event){
        addMarker(event.latLng);
    });
当我们在地图上进行点LQ就会新增一个maker点,q且这个maker压入lenArray数组Q以便于后面的计?br />function addMarker(location){
...
marker = new google.maps.Marker(myOptions);
...
lenArray.push(marker);
drawOverlay();
接着会调用drawOverlay();使用polyline来画U?br />    var flightPlanCoordinates = [];
    //坐标压入\U数l?br />    if (lenArray) {
        for (i in lenArray) {
            flightPlanCoordinates.push(lenArray[i].getPosition());
        }
    }
    var polylineOptions = {
        path : flightPlanCoordinates,
        map : map,
        strokeColor : "#FF0000",
        strokeOpacity : 1.0,
        strokeWeight : 2
    };
    polyline = new google.maps.Polyline(polylineOptions);

其中polylineOptions的path参数是折U坐标的有序序列。可以用一个简单的 LatLng 数组或?LatLng ?MVCArray 指定此\径。请注意Q如果您?br />
递简单的数组Q则它会转换?MVCArray。在 MVCArray 中插入或删除 LatLng 自动更新地图上的折Uѝ?br />flightPlanCoordinates数组用于存储在上面我们定义的lenArray数组的坐标|每点Mơ就压入一对坐标倹{?br />strokeColor和strokeOpacityQstrokeWeight是一些样式的参数Q如指定U条的宽度等{?br />最后我们将定义的polylineq行setMapQ在地图上展玎ͼq将polyline压入到polylinesArray数组中去?br />    polyline.setMap(map);
    polylinesArray.push(polyline);
到这里,U和点的展现已经完成了,接下来是需要将q些点线转换成我们需要的距离倹{?br />
google.maps.Polyline.prototype.getLength = function() {
    var d = 0;
    var path = this.getPath();
    var latlng;
    for (var i = 0; i < path.getLength() - 1; i++) {
        latlng = [path.getAt(i), path.getAt(i + 1)];
        d += latlng[0].distanceFrom(latlng[1]);
    }
    return d;
}

q里需要讲明的是this.getPath();它的说明是检索第一条\径。ƈ且返回值是一lMVCArray.<LatLng>Q也是实际存储了一条线的坐标|在这里取些坐标的数组Qƈ且进行@环distanceFrom计算

google.maps.LatLng.prototype.distanceFrom = function(latlng) {
    var lat = [this.lat(), latlng.lat()]
    var lng = [this.lng(), latlng.lng()]
    var R = 6378137;
    var dLat = (lat[1] - lat[0]) * Math.PI / 180;
    var dLng = (lng[1] - lng[0]) * Math.PI / 180;
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat[0] * Math.PI / 180) * Math.cos(lat[1] * Math.PI / 180) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    return Math.round(d);
}
q段计算实际上是抄自google mapCZ的,是将我们的坐标D{换成我们需要计的距离|q里׃分析Q有兴趣可以玩玩Q没兴趣q接抄q去吧?br />
l果出来了,q个是我们需要的距的距,当然你也可以用其他方式进行展?br />
alert((polyline.getLength()/1000).toFixed(3) + "km");
只要阅读google api和自己思\清楚Q一个测距的demo很快完成了Q稍加装饰基本就可以应用于生产上

如果你也在进行google map的开发,Ƣ迎赐教和讨论,Z个qq:11029590


]]>解答一下几道笔试题http://www.tkk7.com/dongbule/archive/2011/04/21/348723.html陈于?/dc:creator>陈于?/author>Thu, 21 Apr 2011 09:23:00 GMThttp://www.tkk7.com/dongbule/archive/2011/04/21/348723.htmlhttp://www.tkk7.com/dongbule/comments/348723.htmlhttp://www.tkk7.com/dongbule/archive/2011/04/21/348723.html#Feedback9http://www.tkk7.com/dongbule/comments/commentRss/348723.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/348723.html
    1.cookie和session的作用以及他们的应用场合
    2.怎样让jvm加蝲一个Class的同时执行一D代?br />     3.post和get区别
    4.事务的属性有哪些Q写出spring或jdbc理事务的例?br />     5.实现一个高q发、高性能的hashmap。写Z代码
    6.解析一DxmlQ拼接成一个url?br />     7.怎么解决q发Q怎么解决集群环境下的q发?
    8.java GC的原?
    9.mysql支持事务吗?mysql存储引擎有哪些?
    10.数据库数据查找比较慢的时候,如何解决Q?br />     11.学生 评 选课的一个sql语句书写
    12.查找日志文g中某一个信息出现的ơ数
    13.32位linux操作pȝ中,最多支持多个U程Q?br />     14.关于TreeMap操作?br />     15.重写cA的equals和hascodeҎ。类A有个属性private B bQ?br />     16.实现一个mysql的sequence?br />
下面是我的一点解{,也不知道对不对,现在的笔试要你白UR字写些东西真是难啊!

1)cookie和session的作用以及他们的应用场合
两者都是记录用戯问网站信息,但他们的保持状态不同,cookie是采用客L保持Q而session是采用服务端保持Q一般来说cookie不是很安全,因ؓ别h可以分析本地的cookieq行cookieƺ骗Q考虑到安全的问题应该使用sessionQsession是保持在服务端,但当讉K增多Ӟ会增加服务器的压力?br /> 在应用场合中Q徏议徏用户dQ交易重要信息存放sessionQ其他信息可以存攑֜cookie中,Ҏ实际需求两者可以交替搭配用?br />
2)怎样让jvm加蝲一个Class的同时执行一D代?/strong>
使用Class.forName()动态加载类Q题目中?同时"Q是否启用另一U程Q)

3)post和get区别
从http动词协议来看Qget是从服务器获取数据,post是向服务器上传数?br /> get方式会把数据出现在url中,post则不?br /> get提交的数据有大小限制Qpost则无

4)事务的属性有哪些Q写出spring或jdbc理事务的例?/strong>
有原子性,一致性,隔离性,持久?br /> spring提供了丰富的事务模型Q主要是针对jdbc事务Qjta事务Q还有一些自定义事务Q如果有从一张白U写出spring transaction的例子,那真是佩服之极)
q是写一个简单jdbc事务
try{
class.forName("***");
...
conn=DriverManager.getConnection(url,user,password);
conn.createStartement().executeUpdate("****");//更新操作
conn.commit();//事务提交
}catch(Exception e){
..
conn.rollback();//事务回滚
..
}

5)实现一个高q发、高性能的hashmap。写Z代码
什么叫做高性能Q高q发的hashmap? 是要考hashmap的数据结??

6)解析一DxmlQ拼接成一个url
xml,url???q两者有什么联pd?

7)怎么解决q发Q怎么解决集群环境下的q发?
Q有很多点可以ƈ发,webh可以q发Q数据库h可以q发Q怎么那么I泛Q?br /> 高ƈ发最重要的还是考虑到锁的问题,如数据库该用表锁用表锁,该用排他锁用排它锁,E序中要注意非线E安全的问题
高ƈ发还有带来性能问题Q缓存,负蝲均衡Q这些看情况而定

8)java GC的原?
又来Q不回答?br />
9)mysql支持事务吗?mysql存储引擎有哪些?
支持Q常用的是inndb和myisam

10)数据库数据查找比较慢的时候,如何解决Q?/strong>
假如是mysql
1.漏了索引,用explain看看查询语句是不是没使用索引或者烦引用有问题
2.使用show processlist看看是不是有sql卡住?br /> 3.q有一U情况就是sql写得q于复杂Q如goroupbyQ多表关联等{,使用desc来进行分?br /> 4.q有是配置的问题,如key_buffer{参敎ͼq个看文吧
5.最后一U就是机器负药高,调整l构来解军_Q比如用mysql-proxy代理{等

11)学生 评 选课的一个sql语句书写
??

12)查找日志文g中某一个信息出现的ơ数
cat 日志 | grep 信息 | wc -l

13) 32位linux操作pȝ中,最多支持多个U程Q?/strong>
上网查了Q写得很复杂Q附上文?br /> http://www.517sou.net/Article/Linux-maximum-number-of-threads-and-the-maximum-number-of-processes.aspx

14)关于TreeMap操作?/strong>
TreeMap是一颗^衡排序二叉树Q操作的。。后面是什??

15)重写cA的equals和hascodeҎ。类A有个属性private B bQ?/strong>
??

16)实现一个mysql的sequence
mysql的last_insert_id()大致可以满Q如果不行就写触发器?br />


]]>
在debian安装nfs-server出现的bug处理http://www.tkk7.com/dongbule/archive/2011/04/06/347718.html陈于?/dc:creator>陈于?/author>Wed, 06 Apr 2011 09:13:00 GMThttp://www.tkk7.com/dongbule/archive/2011/04/06/347718.htmlhttp://www.tkk7.com/dongbule/comments/347718.htmlhttp://www.tkk7.com/dongbule/archive/2011/04/06/347718.html#Feedback1http://www.tkk7.com/dongbule/comments/commentRss/347718.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/347718.html nfs安装与配|(debianQ?/a>
好吧Q这个错误浪费了我今天几个小时的旉Q必L它记录下来?br /> 问题是这LQ在启动更新了portmapQexportfsQ一些没问题后,在做/etc/init.d/nfs-kernel-server restart 出现

/etc/init.d/nfs-kernel-server start
Exporting directories for NFS kernel daemonexportfs: /etc/exports 
[1]:
Neither 'subtree_check' or 'no_subtree_check' specified for export
"foobar".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 
1.0.x

.
Starting NFS kernel daemon: nfsd
Not starting: portmap daemon is not running (warning).


警告提示portmap is not running

好吧Q检查一下portmap

/home/mnt/index# ps aux | grep portmap
daemon   
31478  0.0  0.0   2052   624 ?        Ss   13:59   0:00 /sbin/portmap


portmap的状态已l是runningQ在googling后,发现|上有h说是
This is the problem, portmap is not actually running, causing rpc.statd

看来问题q是出现rpc上,最主要的进Erpc.mountd无法启动

好吧Q接下来打开/etc/init.d/nfs-kernel-serverq个启动脚本q行查看

                 # See if portmap or rpcbind are running
                 (cat </dev/null >/dev/tcp/localhost/
1112>/dev/null
                 RET
=$?
                 if 
[ $RET != 0 ]; then
                     echo
                     log_warning_msg 
"Not starting: portmap daemon is not running"
                     exit 
0
                 fi


看来问题出来这个,什么叫“/dev/tcp/localhost/111”Q还是googlingQ网上有

I find that this is a bashism, but the init-script is marked as a bash script at the
top:
!/bin/bash
再man BashQ发?br /> Bash, as packaged for Debian, does not support using the /dev/tcp and /dev/udp files

应该很清楚了Q如果按照这里的分析Q那么我们需要对上面的这个启动脚本进行一下修改就可以完成我们的目的,最直接的就是把exit 0注释掉,另外说一点,q个脚本也有些写得不大合理,既然是log_warning_msgQ一个warningQ就不应该直接的exit 0




]]>
nfs安装与配|(debianQ?/title><link>http://www.tkk7.com/dongbule/archive/2011/04/06/347716.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Wed, 06 Apr 2011 09:09:00 GMT</pubDate><guid>http://www.tkk7.com/dongbule/archive/2011/04/06/347716.html</guid><wfw:comment>http://www.tkk7.com/dongbule/comments/347716.html</wfw:comment><comments>http://www.tkk7.com/dongbule/archive/2011/04/06/347716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/dongbule/comments/commentRss/347716.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/dongbule/services/trackbacks/347716.html</trackback:ping><description><![CDATA[<br /> <br /> <strong>NFS服务器端</strong><br /> apt-get install nfs-kernel-server nfs-common portmap<br /> <br /> vi /etc/hosts.allow<br /> portmapQ?192.168.0.<br /> lockdQ?nbsp;  192.168.0.<br /> rquotadQ?192.168.0.<br /> mountdQ?nbsp; 192.168.0.<br /> statdQ?nbsp;  192.168.0.<br /> <br /> vi /etc/hosts.deny<br /> portmap:ALL<br /> lockd:ALL<br /> mountd:ALL<br /> rquotad:ALL<br /> statd:ALL<br /> <br /> vi /etc/default/portmap<br /> ?-i 127.0.0.1 注释?br /> <br /> /etc/init.d/portmap restart   重启portmap daemon<br /> <br /> vi /etc/exports<br /> /home/zp/share  220.181.8.*(rw,sync,no_root_squash)   若更改了/etc/exportsQ?q行 $sudo exportfs -r 更新<br /> <br /> /etc/init.d/nfs-kernel-server restart  <br /> Q可以到/var/log/messages里面查看是否正确Ȁz)<br /> <br /> showmount -e ip  查看NFS server的export list. <br /> <br /> <strong>NFS客户?/strong><br /> apt-get install nfs-common portmap nfs-client<br /> <br /> mount 192.168.86.111:/home/mnt/share /home/mnt 挂v<br /> 如果出现<br /> mount.nfs: rpc.statd is not running but is required for remote locking.<br /> mount.nfs: Either use '-o nolock' to keep locks local, or start statd.<br /> mount.nfs: an incorrect mount option was specified<br /> <br /> 那么<br /> mount 192.168.86.111:/home/mnt/share /home/mnt -o nolock  挂v<br /> <br /> umount /home/mnt 撤销 <img src ="http://www.tkk7.com/dongbule/aggbug/347716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/dongbule/" target="_blank">陈于?/a> 2011-04-06 17:09 <a href="http://www.tkk7.com/dongbule/archive/2011/04/06/347716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>房地图google map的初步应用点?3)http://www.tkk7.com/dongbule/archive/2011/03/30/347304.html陈于?/dc:creator>陈于?/author>Wed, 30 Mar 2011 08:58:00 GMThttp://www.tkk7.com/dongbule/archive/2011/03/30/347304.htmlhttp://www.tkk7.com/dongbule/comments/347304.htmlhttp://www.tkk7.com/dongbule/archive/2011/03/30/347304.html#Feedback0http://www.tkk7.com/dongbule/comments/commentRss/347304.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/347304.html阅读全文

]]>
安装配置整理?dstathttp://www.tkk7.com/dongbule/archive/2011/03/24/346966.html陈于?/dc:creator>陈于?/author>Thu, 24 Mar 2011 09:15:00 GMThttp://www.tkk7.com/dongbule/archive/2011/03/24/346966.htmlhttp://www.tkk7.com/dongbule/comments/346966.htmlhttp://www.tkk7.com/dongbule/archive/2011/03/24/346966.html#Feedback3http://www.tkk7.com/dongbule/comments/commentRss/346966.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/346966.html
dstat可以直接可直接替换vmstat, iostat, netstat ,nfsstat, ifstat{系l工P监控cpu、disk 、mem、load、interrupt、net、proc、CS....

安装
wget http://rpmforge.sw.be/redhat/7.3/en/i386/rpmforge/RPMS/dstat-0.6.9-1.rh7.rf.noarch.rpm
rpm -ivh dstat-0.6.9-1.rh7.rf.noarch.rpm
or
apt-get install dstat
yum install dstat

安装很简单就完成Q先看看help

tech163:/usr/local/download# dstat --help
Usage: dstat 
[-afv] [options..] [delay [count]]
Versatile tool for generating system resource statistics

Dstat options:
  -c
, --cpu              enable cpu stats
     -C 
0,3,total           include cpu0, cpu3 and total
  -d
, --disk             enable disk stats
     -D total
,hda           include hda and total
  -g
, --page             enable page stats
  -i
, --int              enable interrupt stats
     -I 
5,eth2              include int5 and interrupt used by eth2
  -l
, --load             enable load stats
  -m
, --mem              enable memory stats
  -n
, --net              enable network stats
     -N eth1
,total          include eth1 and total
  -p
, --proc             enable process stats
  -s
, --swap             enable swap stats
     -S swap1
,total         include swap1 and total
  -t
, --time             enable time/date output
  -T
, --epoch            enable time counter (seconds since epoch)
  -y
, --sys              enable system stats
  --ipc                  enable ipc stats
  --lock                 enable lock stats
  --raw                  enable raw stats
  --tcp                  enable tcp stats
  --udp                  enable udp stats
  --unix                 enable unix stats

  -M stat1
,stat2         enable external stats
     --mods stat1
,stat2

  -a
, --all              equals -cdngy (default)
  -f
, --full             expand -C, -D, -I, -N and -S discovery lists
  -v
, --vmstat           equals -pmgdsc -D total

  --integer              show integer values
  --nocolor              disable colors (implies --noupdate)
  --noheaders            disable repetitive headers
  --noupdate             disable intermediate updates
  --output file          write CSV output to file

  delay is the delay in seconds between each update
  count is the number of updates to display before exiting
  The default delay is 
1 and count is unspecified (unlimited)

当执行dstat命oӞ默认它会攉cpuQdiskQnetQpagingQsystem{数据,q且每秒攉一?br /> 看一下我们常用的参数

-c, --cpu              enable cpu stats 昄cpu的情?br /> -d, --disk             enable disk stats 昄盘的情?br /> -l, --load             enable load stats 昄pȝ的负载情?br /> -m, --mem              enable memory stats 昄内存的情?br /> -n, --net              enable network stats 昄|络的情?br /> -p, --proc             enable process stats 昄q程的情?br /> -s, --swap             enable swap stats 昄swap的情?br /> -y, --sys              enable system stats 昄pȝ的情?br /> --output file          write CSV output to file 写到csv文g?br />
默认情况下dstat是每U钟收集数据一ơ,可以修改一下让它每30U收集一?br />
dstat -cdlmnpsy 30

----total-cpu-usage---- -dsk/total- ---load-avg--- ------memory-usage----- -net/total- ---procs--- -swp/total- ---system--
usr sys idl wai hiq siq| read  writ| 1m   5m  15m | used  buff  cach  free| recv  send|run blk new| used  free| int   csw 
  
0   0 100   0   0   0| 121B 4116B|   0    0    0|  79M  156M  176M  101M|   0     0 |  0   0   0| 504k 1024M|  20    19 
  
0   0 100   0   0   0|   0  8875B|   0    0    0|  79M  156M  176M  101M|1256B 1140B|  0   0   0| 504k 1024M|  31    31




]]>
房地图google map的初步应用点?2)http://www.tkk7.com/dongbule/archive/2011/03/05/345786.html陈于?/dc:creator>陈于?/author>Sat, 05 Mar 2011 08:02:00 GMThttp://www.tkk7.com/dongbule/archive/2011/03/05/345786.htmlhttp://www.tkk7.com/dongbule/comments/345786.htmlhttp://www.tkk7.com/dongbule/archive/2011/03/05/345786.html#Feedback2http://www.tkk7.com/dongbule/comments/commentRss/345786.htmlhttp://www.tkk7.com/dongbule/services/trackbacks/345786.html阅读全文

]]>
վ֩ģ壺 ѿƬ| Ůվѹۿ| ާžƷ| 51ƵѹۿƵ| aëƬ| AV| ĻۺϾƷһ| ŷ޾ƷAV| ѹaƬվ| Ƶѹۿ | Ѵվ߿| պƵ| ɫɫۺվ| һëƬaѲɫӰ | һaëһa˽ | aëƬƵ| պѹۿһëƬ| һëƬ߲Ƶ| һëƬѲ| ߲˳ëƬ| ӰһѾþþþþþþ | ޾aa߿| ҹһӰԺ| ޸Դ߹ۿ| ޹ƷȾþ| AV벻߲| ޹AVרAV| ŮͬavƬ߹ۿ | ҹƷһ鶹| ޳˸վ| ޳˸߹ۿ| һ245699 | Ʒþһ| | þþþ޾ƷŮ| ޹һ| þþþþAVר| 99riƷ| һĻ߹ۿ| ޸һƷ| ޹˱ɫ߹ۿ|