﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-于吉吉的技术博客</title><link>http://www.blogjava.net/dongbule/</link><description>建造高性能门户网</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 07:32:48 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 07:32:48 GMT</pubDate><ttl>60</ttl><item><title>《maven简介配置与私服搭建》 分享</title><link>http://www.blogjava.net/dongbule/archive/2014/03/04/410574.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Tue, 04 Mar 2014 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2014/03/04/410574.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/410574.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2014/03/04/410574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/410574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/410574.html</trackback:ping><description><![CDATA[<div>前段时间部分项目改成maven，并搭建了nexus私服，所以在组内做了一个关于maven的分享与培训，下面是这次的ppt<br /><br /><div><a href="http://www.blogjava.net/Files/dongbule/maven.zip">《maven简介配置与私服搭建》</a></div>http://www.blogjava.net/Files/dongbule/maven.zip<br /><br /><br />----------------------------------------<br />  <br />  by 陈于喆 <br />  QQ:34174409<br />  Mail: dongbule@163.com<br /></div><img src ="http://www.blogjava.net/dongbule/aggbug/410574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2014-03-04 10:49 <a href="http://www.blogjava.net/dongbule/archive/2014/03/04/410574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《mac os x选购与初步探索》 的分享</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2014/02/23/410207.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/410207.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2014/02/23/410207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/410207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/410207.html</trackback:ping><description><![CDATA[用mac系统已经一年多了，周边同事也越来越多人开始用mac，所以在公司内部做了一次mac选购和mac os x系统比较有技术细节的分享，留下2份ppt用于纪念。<br /><br />《mac的选购》对最常见的几个mac硬件 ， macbook air,macbook pro,mac mini,imac 进行对比分析，包括性能价格和针对的应用分析<br /><a href="http://www.blogjava.net/Files/dongbule/mac%20(1).pptx.zip">《mac选购》</a>&nbsp;http://www.blogjava.net/Files/dongbule/mac%20(1).pptx.zip<br />在完成分享后，以新增2个同事选购了macbook air &nbsp;^_^<br /><br />《mac os x》针对了mac的一些细节分析，为什么在05年以前苹果不能虚拟机和黑苹果，为什么在苹果改成x86系统，黑苹果横行，mac在内存管理与win有何实质的不同，，，，等等。<br /><a href="http://www.blogjava.net/Files/dongbule/mac%20os.zip">《mac os x》</a>http://www.blogjava.net/Files/dongbule/mac%20os.zip<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />----------------------------------------<img src ="http://www.blogjava.net/dongbule/aggbug/410207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2014-02-23 12:54 <a href="http://www.blogjava.net/dongbule/archive/2014/02/23/410207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cocos2dx2.0升级为3.0一些常见变化纪录</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2013/12/27/408140.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/408140.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2013/12/27/408140.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/408140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/408140.html</trackback:ping><description><![CDATA[<div>最近接手项目从cocos2dx 2.0 升级为 3.0 ，至于为什么要升级我也弄不清楚，只感觉3.0是要摆脱cocos2d-iphone的身影，这是要作死的态度吗，没时间去了解3.0的核心发生了神马变化，只为了从cocos2dx2.0经常适应到3.0做了一些纪录，以便查阅和方便正在从2.0到3.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&nbsp;&nbsp;CCCallFunc&nbsp;CCNode&nbsp;..<br />3.0<br />Sprite&nbsp;CallFunc&nbsp;Node&nbsp;..</div><br /><div><strong>2.cc***结构体改变</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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />ccp(x,y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/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&nbsp;winSize&nbsp;=&nbsp;CCDirector::sharedDirector()-&gt;getWinSize();<br />SpriteFrameCache::sharedSpriteFrameCache()<br />AnimationCache::sharedAnimationCache()<br />NotificationCenter::sharedNotificationCenter()<br />&#8230;<br /><br />3.0<br />Size&nbsp;size&nbsp;=&nbsp;Director::getInstance()-&gt;getWinSize();<br />SpriteFrameCache::getInstance()<br />AnimationCache::getInstance()<br />NotificationCenter::getInstance()<br />&#8230;</div><br /><div><strong>4.POD类别</strong></div><div>使用const为Point，Size,Rect进行常量修饰</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>&nbsp;setPoint(CCPoint&nbsp;p)<br />3.0<br /><span style="color: #0000FF; ">void</span>&nbsp;setPoint(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)</div><br /><div><strong>5.点触事件</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&nbsp;dispatcher&nbsp;=&nbsp;Director::getInstance()-&gt;getEventDispatcher();<br />auto&nbsp;touchListener&nbsp;=&nbsp;EventListenerTouchOneByOne::create();<br />touchListener-&gt;onTouchBegan&nbsp;=&nbsp;CC_CALLBACK_2(FBMainScene::onTouchBegan,<span style="color: #0000FF; ">this</span>);<br />touchListener-&gt;onTouchMoved&nbsp;=&nbsp;CC_CALLBACK_2(FBMainScene::onTouchMoved,<span style="color: #0000FF; ">this</span>);<br />touchListener-&gt;onTouchEnded&nbsp;=&nbsp;CC_CALLBACK_2(FBMainScene::onTouchEnded,&nbsp;<span style="color: #0000FF; ">this</span>);<br />dispatcher-&gt;addEventListenerWithSceneGraphPriority(touchListener,&nbsp;<span style="color: #0000FF; ">this</span>);<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;FBMainScene::onTouchBegan(Touch&nbsp;*touch,Event&nbsp;*pEvent){<br />&nbsp;&nbsp;&nbsp;&nbsp;CCLOG("onTouchBegan");<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;point&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;convertToWorldSpace(<span style="color: #0000FF; ">this</span>-&gt;convertTouchToNodeSpace(touch));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;FBMainScene::onTouchMoved(Touch&nbsp;*touch,Event&nbsp;*pEvent){<br />&nbsp;&nbsp;&nbsp;&nbsp;CCLOG("onTouchMoved");<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;FBMainScene::onTouchEnded(Touch&nbsp;*touch,Event&nbsp;*pEvent){<br />&nbsp;&nbsp;&nbsp;&nbsp;CCLOG("onTouchEnded");<br />}<br /><br />//获得触点的方法也发生了改变：<br />Point&nbsp;point&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;convertToWorldSpace(<span style="color: #0000FF; ">this</span>-&gt;convertTouchToNodeSpace(touch));<br /><br />//dispatcher控制方法：<br />dispatcher-&gt;addEventListener&#8230;<br />dispatcher-&gt;removeEventListener(listener);<br />dispatcher-&gt;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>回调函数，分别携带不同的参数，方便</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&nbsp;*item&nbsp;=&nbsp;CCMenuItemFont::create("返回上个场景",&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;menu_selector(GameScene::backScene));<br />3.0<br />MenuItemFont&nbsp;*item&nbsp;=&nbsp;MenuItemLabel::create("返回上个场景",&nbsp;CC_CALLBACK_1(GameScene::backScene,&nbsp;<span style="color: #0000FF; ">this</span>));<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;new&nbsp;callbacks&nbsp;based&nbsp;on&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#define</span>&nbsp;CC_CALLBACK_0(__selector__,__target__,&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />)&nbsp;std::bind(&amp;__selector__,__target__,&nbsp;##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span>&nbsp;CC_CALLBACK_1(__selector__,__target__,&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />)&nbsp;std::bind(&amp;__selector__,__target__,&nbsp;std::placeholders::_1,&nbsp;##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span>&nbsp;CC_CALLBACK_2(__selector__,__target__,&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />)&nbsp;std::bind(&amp;__selector__,__target__,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2,&nbsp;##__VA_ARGS__)<br /><span style="color: #0000FF; ">#define</span>&nbsp;CC_CALLBACK_3(__selector__,__target__,&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />)&nbsp;std::bind(&amp;__selector__,__target__,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2,&nbsp;std::placeholders::_3&nbsp;##__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([&amp;](){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sprite&nbsp;*sprite&nbsp;=&nbsp;Sprite::create("s");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;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&nbsp;*action&nbsp;=&nbsp;(CCMoveBy*)&nbsp;move-&gt;copy();<br />action-&gt;autorelease();<br />3.0<br />action&nbsp;=&nbsp;move-&gt;clone();<br />不需要autorelease，在clone已经实现。</div><br /><div><strong>9.Physics Integration 物理引擎</strong></div><div>暂无使用，box2d 在 3.0中可以延续使用</div><div>在3.0的Physics中需要定义 PhysicsWorld, PhysicsBody, PhysicsShape, PhysicsJoint 等，于box2d相仿，使用前需要定义CC_USE_PHYSICS</div><div></div><div>&#8230;&#8230;继续等待补充</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.blogjava.net/dongbule/aggbug/408140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2013-12-27 23:29 <a href="http://www.blogjava.net/dongbule/archive/2013/12/27/408140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>朋友要招几个java，让帮忙出点面试题目</title><link>http://www.blogjava.net/dongbule/archive/2013/07/05/401249.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Fri, 05 Jul 2013 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2013/07/05/401249.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/401249.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2013/07/05/401249.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/401249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/401249.html</trackback:ping><description><![CDATA[<div>上周朋友说要招几个高级点的java，网上那些java面试宝典已经被人背得熟透了，让帮忙出出几个面试的问题，主要看看对所使用得语言有较深入得了解，不停留在使用什么开源框架，和对自己一些项目得见解。当然还要装装B，最后问一些别人不懂得问题，好压压价钱。。。罪过，公司是他自己的</div><div></div><div>随便整理了一下，以后面试也可以用到，主要针对平时日常得应用，只要有稍微阅读过jdk源码，对数据结构有一点点了解回答应该没什么问题。</div><div></div><div>随便写了几个</div><div><br /><div></div><div><p style="margin-left:18.0pt;text-indent:-18.0pt;">1.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">当需要往一个</span>hashMap<span style="font-family:宋体;">里面</span>put<span style="font-family:宋体;">很多对象，你会怎么去</span>new <span style="font-family:宋体;">这个</span>hashmap?</p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;color:gray;">注：主要审查是否懂得</span><span style="color:gray;">hash</span><span style="font-family:宋体;color:gray;">的数据结构，是否会用</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="color:gray;">HashMap(int initialCapacity, float loadFactor) </span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;color:gray;">这个构造函数去创建一个大容积的</span><span style="color:gray;">Hash</span><span style="font-family:宋体;color:gray;">结构，懂得原理即可。如果回答正确，可深入问</span><span style="color:gray;">hashmap</span><span style="font-family:宋体;color:gray;">的扩容。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">2.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">实现一个先进先出的队列，分别有</span>arraylist<span style="font-family:宋体;">和</span>linkedlist<span style="font-family:宋体;">，选择哪个，为什么？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;color:gray;">注：主要审查是否懂得线性表和链表。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">&nbsp;</p>  <p>3. <span style="font-family:宋体;">当我们</span>new arrayList(20)<span style="font-family:宋体;">一个这样的对象后，不断往里面添加</span>add(object),<span style="font-family:宋体;">加到第</span>21<span style="font-family:宋体;">个后，内存会有什么调整。</span></p>  <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;color:gray;">注：主要审查是否懂得可变</span><span style="color:gray;">array</span><span style="font-family:宋体;color:gray;">的本质，当内存进行扩容的本质是</span></p>  <p style="margin-left:21.0pt;text-indent:0cm;"><span style="color:gray;">Arrays.copyOf(elementData, newCapacity)</span></p>  <p><span style="color:gray;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">4.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">一个类有几百个实现方法，突然有个需求：要纪录每个方法被调用的参数，时间为日志，这个怎么去实现？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体; color:gray;">注：主要审查是否使用</span><span style="color:gray;">aop</span><span style="font-family:宋体;color:gray;">等面向切面编程。</span><span style="font-family:宋体;">如果回答正确，继续追问，只对方法名开头为</span>&#8217;insert&#8217;<span style="font-family:宋体;">，</span>&#8217;update&#8217;<span style="font-family:宋体;">等方法进行日志纪录，该怎么配对<span style="color:gray;">。注：主要审查对正则表达式的掌握。</span></span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">&nbsp;</p>  <p style="margin-left:-.5pt; text-indent:-18.0pt;">&nbsp; &nbsp; &nbsp;5<span style="font-family:宋体;">．在</span>vi<span style="font-family:宋体;">的编辑下，对光标所在行进行整行删除命令是什么，将光标移到当前行</span>&nbsp;&nbsp; <span style="font-family:宋体;">第一列的命令是什么</span></p>  <p style="margin-left:-.5pt; text-indent:-18.0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="font-family:宋体;color:gray;">注：主要审查在</span><span style="color:gray;">linux</span><span style="font-family:宋体;color:gray;">下最基础的</span><span style="color:gray;">vi</span><span style="font-family:宋体;color:gray;">编辑命令，不懂</span><span style="color:gray;">vi</span><span style="font-family: 宋体;color:gray;">是否可认为无在</span><span style="color:gray;">linux</span><span style="font-family:宋体;color:gray;">真实工作？</span></p>  <p style="margin-left:-.5pt; text-indent:-18.0pt;">&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">6.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">机器出现</span>OutOfMemoryError<span style="font-family:宋体;">：</span> PermGen space <span style="font-family:宋体;">的内存溢出错误，解决思路是什么</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体; color:gray;">注：主要审查是否明白方法区或叫永久区的定义，该区是否内存回收，什么实例会存放在该区，不求具体实现方案，主要有大概思路即可。</span></p>  <p>&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">7.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">你的系统将在明天出现读的高并发，该怎么准备</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体; color:gray;">注：方法多种，主要检查思路，漫谈来观察。</span></p>  <p>&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">8.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">一台</span>linux<span style="font-family:宋体;">服务器每天定时生成一批文件，需要将这批文件同步到其他多台服务器，该怎么实现。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;">注：方法多种，如</span>rsync<span style="font-family:宋体;">，</span>nfs<span style="font-family:宋体;">，</span>scp<span style="font-family:宋体;">等等，主要检查</span>linux<span style="font-family:宋体;">下文件处理的能力，主要检查思路。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">9.<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;">为什么说尽量减小</span>synchronized <span style="font-family:宋体;">方法</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体; color:gray;">注：主要审核对同步实现方法的认识，如果能回答出&#8220;锁&#8221;的概念，</span><span style="font-family:宋体;">继续追问，如果对实例方法加</span>synchronized<span style="font-family:宋体;">，</span> <span style="font-family: 宋体;">锁的对象是什么，对静态方法加</span>synchronized <span style="font-family:宋体;">，锁的对象是什么</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">&nbsp;&nbsp;</p>  <p style="text-indent:0cm;">10<span style="font-family:宋体;">．说说单例的使用场景是什么，如</span>spring<span style="font-family:宋体;">场景中就有许多单例模式</span></p>  <p style="text-indent:0cm;"><span style="color:gray;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;color:gray;">注：答案很多，可以漫谈来观察，能回答出，让多个线程相互通信达到资源共享即可</span></p>  <p style="text-indent:0cm;">&nbsp;</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">11. <span style="font-family:宋体;">随便在</span>jdk<span style="font-family:宋体;">或</span>spring<span style="font-family:宋体;">的英文</span>api<span style="font-family:宋体;">中找一段让其翻译</span></p>  <p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体; color: gray;">注：能大概说出接口的用处即可<br /><br /><br /><br /></span>----------------------------------------<br />  <br />  by 陈于喆 <br />  QQ:34174409<br />  Mail: dongbule@163.com<br />  <br /></p></div></div><img src ="http://www.blogjava.net/dongbule/aggbug/401249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2013-07-05 17:18 <a href="http://www.blogjava.net/dongbule/archive/2013/07/05/401249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《lua &amp; ngx_lua 的介绍与应用 》</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2012/03/19/372201.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/372201.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2012/03/19/372201.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/372201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/372201.html</trackback:ping><description><![CDATA[<div>
<div>上段时间使用ngx_lua效果还真不错</div>
<div>lua这门语言让人耳目一新，跟一般的脚本语言如php，perl不同，lua被称为一种嵌入式的语言，当然lua也可以单独的进行编程，但如果你这么做的话，那么lua只是一片浮云，当然了，lua还有高执行效率和无平台无关等特点。</div>
<div>ngx_lua的搭配更是一次架构的进化，把我们的业务逻辑提前到web server，当然这样做是否合理，这个还有很大的争论，最起码taobao的量子统计使用ngx_lua取代了php还是带来了很多亮点，值得我们关注和学习。</div>
<div></div>
<div>上周做了个交流讲座，做了份ppt，参考和摘录了淘宝的《打造安全易运维的高性能web平台》http://lych.yo2.cn的《走近lua》<br />
<br />
<a href="/Files/dongbule/ngx_lua.pptx">《lua &amp; ngx_lua 的介绍与应用》</a>&nbsp;--&gt; &nbsp;ppt 下载<br />
<a href="/Files/dongbule/ngx_lua.pptx">/Files/dongbule/ngx_lua.pptx<br />
<br />
</a>
<div>
<div>目前使用lua搭配tt，和lua搭配memcached，做用户轨迹的收录的高并发工作，效率非常好，为我们解决了机器的问题还有现成开发框架一些不足的到地方，lua还有很多地方需要再进行研究，相信以后在一些高并发，小业务的方面会继续发挥作用<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.blogjava.net/dongbule/aggbug/372201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2012-03-19 16:33 <a href="http://www.blogjava.net/dongbule/archive/2012/03/19/372201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对setTimeout的误差堆积测试和简单分析</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2012/01/10/368229.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/368229.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2012/01/10/368229.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/368229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/368229.html</trackback:ping><description><![CDATA[<div><br />
<div>
<div>前段时间做了一个团购秒杀倒计时的js展现的例子（<a href="http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html">http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html</a>），倒计时的方式主要使用setTimeout的函数进行递归实现，由于是使用setTimeout，所以根据js的引擎，这其中将可能存在一定的时间误差，一个误差不要紧，两个误差无所谓，但长时间的误差堆积将出现较大的偏离值，所以根据秒杀倒计时的例子，做了一个简单的模拟的误差堆积测试，并在各个浏览器中进行测试。</div>
<div></div>
<div>鉴于秒杀倒计时都是以一秒为单位，所以下面的例子也都以1000毫秒为计算，当然各个浏览器的实现和附加代码的编写也会造成一定的时间误差，这部分误差也合并在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; ">&lt;</span><span style="color: #800000; ">div&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; ">&nbsp;style</span><span style="color: #0000FF; ">="width:500px;"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #f5f5f5; "><br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; ">&nbsp;w&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;second&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;showtime(){&nbsp;&nbsp;&nbsp;&nbsp;<br />
showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; ">&nbsp;Date();&nbsp;&nbsp;&nbsp;&nbsp;<br />
setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);&nbsp;&nbsp;&nbsp;&nbsp;<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&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;&nbsp;&nbsp;</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; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;&nbsp;&nbsp;&nbsp;&nbsp;<br />
second</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br />
}<br />
showtime();<br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span></div>
<br />
<div>可以看到在各个不同的浏览器在不同的秒数中出现不同的误差，当然这个跟我本机的浏览器和环境有关</div>
<br />
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/js/10.png" width="485" height="417" alt="" /><br />
<br />
<div>
<div>下面再将这些误差值进行叠加测试<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; ">&lt;</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; ">&nbsp;style</span><span style="color: #0000FF; ">="width:500px;"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #f5f5f5; "><br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; ">&nbsp;w&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;showtime(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; ">&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;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; ">&nbsp;&nbsp;&nbsp;</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; ">)&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;&nbsp;&nbsp;</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; ">&nbsp;<br />
<br />
&lt;br/&gt;</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br />
}<br />
showtime();<br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000ff; ">&gt;</span></div>
</div>
</div>
<br />
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/js/4.png" width="360" height="406" alt="" /><br />
<br />
<div>IE和chrome相对较为稳定，不知道是不是我本机环境的原因，firefox出现了很多大偏差，可以选择定时清空这个误差值来处理，或是采用链式的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; ">&lt;</span><span style="color: #800000; ">div&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="show"</span><span style="color: #FF0000; ">&nbsp;style</span><span style="color: #0000FF; ">="width:300px;"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #f5f5f5; "><br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; ">&nbsp;w&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;i&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;f&nbsp;;<br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; ">&nbsp;t&nbsp;;<br />
</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #f5f5f5; ">&nbsp;k&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;</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; ">&nbsp;showtime(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;showtime.curr</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #f5f5f5; ">&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">&nbsp;setTimeout('showtime()',</span><span style="background-color: #f5f5f5; ">1000</span><span style="background-color: #f5f5f5; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;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; ">&nbsp;&nbsp;&nbsp;</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; ">&nbsp;&nbsp;</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; ">)&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; ">+</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;showtime.last</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">showtime.curr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;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; ">&nbsp;round(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearTimeout(f);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showtime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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; ">&nbsp;&nbsp;clear&lt;br/&gt;</span><span style="background-color: #f5f5f5; ">"</span><span style="background-color: #f5f5f5; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w</span><span style="background-color: #f5f5f5; ">=</span><span style="background-color: #f5f5f5; ">0</span><span style="background-color: #f5f5f5; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;setTimeout('round()',</span><span style="background-color: #f5f5f5; ">10000</span><span style="background-color: #f5f5f5; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="background-color: #f5f5f5; ">++</span><span style="background-color: #f5f5f5; ">;<br />
}<br />
showtime();<br />
round();<br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span></div>
<br />
<div>
<div>其实为什么javascript的定时器会出现所谓的不可靠或偏差的情况，这是可以理解的，最主要的问题是它们并不是所谓的线程，其实</div>
<div>javascript是运行于单线程的环境中，而定时器只是计划代码在未来某个执行的时间，执行的时间点是不能被保证的，因为在页面的生命周期中，不同时间可能存在其他代码，或各个浏览器的内核控制住javascript进程。<br />
<br />
<div>
<div><strong>settimeout几个见解</strong></div>
<div>1、setTimeOut &nbsp;!= &nbsp;thread | 时间片的并发调用</div>
<div>2、javascript以单线程的方式运行于浏览器的javascript引擎中</div>
<div>3、setTimeout 只是把要执行的代码在设定的时间点插入js引擎维护的代码队列</div>
<div>4、setTimeout 插入代码队列并不意味着代码就会立马执行的</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); &nbsp; &nbsp; //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 -&gt; 200毫秒后通知浏览器有队列插入 &nbsp; -&gt; &nbsp; Code 2 &nbsp; -&gt; &nbsp; showtime() &nbsp;-&gt; &nbsp; &nbsp;&#8230;</div>
<div></div>
<div>这个种重复递归可能会造成2个问题：</div>
<div>1 . 时间间隔可能小于定时调用的代码的执行时间</div>
<div>2 . 时间间隔或许会跳过</div>
</div>
<br />
<div><span style="color: red; ">时间间隔或许会跳过</span></div>
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/js/9.png" width="597" height="261" alt="" /><br />
<br />
<div>
<div>5ms : code1 代码执行完毕，200ms后有定时器进入队列</div>
<div>205ms : 定时器进入队列，code2继续</div>
<div>300ms : function代码结束，定时器从队列中取出，执行</div>
<div>405ms : 第二个定时器进入队列,第一个定时器的代码在执行中</div>
<div>605ms : 第三个定时器意图进入队列失败，这个点的settimeout丢失</div>
</div>
<br />
<div>
<div>为了避免这2个问题，可以采用链式setTimeOut()进行调用</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>这个模式链式条用setTimeOut(),每次函数执行的时候都会创建一个新的定时器，第二个setTimeOut调用使用了arguments.callee来获取当前执行的函数引用，并为其设置另外一个定时器，这样的好处在于，在前一个定时器执行完之前不会向队列中插入新的定时器代码，确保不会有任何的确实间隔，而且它可以保证在下一次定时器代码执行前，至少等待指定的间隔，避免连续的运行。<br /><br /><br /><br />
</div>
<div>//-------------//</div>
<div>秒杀的定时器已经通过检测正式运行了，博客记录得不好，表达不是很清楚，关于setTimeOut的函数主要参考了《JavaScript高级程序设计(第2版)》的第18章。</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div><img src ="http://www.blogjava.net/dongbule/aggbug/368229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2012-01-10 15:15 <a href="http://www.blogjava.net/dongbule/archive/2012/01/10/368229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript 实现'秒杀，团购'倒计时展示的记录</title><link>http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Tue, 06 Dec 2011 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/365687.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/365687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/365687.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近做了一个房产的秒杀，团购的电子商务网站(房子也有秒杀，出手不小啊)，其中里面有一个秒杀的倒计时展示，主要是判断当前时间距离秒杀开始还有多少时间，还有秒杀开始和秒杀结束的各种展示。其中最主要的一点就是所谓的当前时间不能使用浏览器通过new Date()获取的客户端时间，这样只要用户修改了自己的机器时间那么倒计时就会乱透了，所以这个当前时间必须使用的是服务器时间，所以采用的是静态缓存页面所以这个当...&nbsp;&nbsp;<a href='http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html'>阅读全文</a><img src ="http://www.blogjava.net/dongbule/aggbug/365687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-12-06 16:22 <a href="http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单分析cglib引起的PermSize Space内存溢出</title><link>http://www.blogjava.net/dongbule/archive/2011/08/21/356987.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Sun, 21 Aug 2011 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/08/21/356987.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/356987.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/08/21/356987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/356987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/356987.html</trackback:ping><description><![CDATA[<div><font class="Apple-style-span" face="Arial" size="2"><span class="Apple-style-span" style="line-height: 18px;"><br /></span></font>上段时间有台机器发生了 java.lang.OutOfMemoryError: PermGen space 内存溢出的异常，当时大概判断了原因后就把 MaxPermSize 配置调高后，就把问题解决了，不过空下时间后还是需要继续把review代码。<br /><br /><span>一般来说PermSize Space OOM的话，第一种可能就是方法区溢出，第二种就是运行时常量池溢出，第二种查看后基本排除掉，问题就应该出现在方法区的溢出，方法区用于存放class的相关信息，如类名，访问修饰符，常量池，字段描述，方法描述等等，对于这个区域的溢出，基本上都是运行时产生大量的类填满了整个方法区，直到溢出。<br /></span><br /><span>spring aop中都是使用到了cglib这类字节码的技术，动态代理的类越多，就需要越多的方法区来保证动态生成的class可以加载入到内存中去，</span><div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Arial; line-height: 18px; ">不过spring框架导致的不会因为这种原因。<strong>撑爆perm的应该是各种methodaccessorX和constructoracccessorX等等</strong>。本来这些accessor也有缓存，但它们使用内存大小敏感的reference引用着的，且使用的是堆内存。当你堆内存吃紧的时候，这些缓存就摧毁了，就必然会不断产生新的methodAccessor字节码，是这个撑爆了perm。<strong>所以除增大permsize还应该看看平时运行时堆内存是不是经常用光</strong>。</span><br /><br />下面的例使用cglib直接进行动态代理产生大量的动态类，然后使用jconsole进行观察。<br /><br />首先将本机的jvm配置为 -XX:PermSize=64M -XX:MaxPermSize=64M ，给到PermSize最大为64M的内存</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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PermgenOOM&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enhancer&nbsp;enhancer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Enhancer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(Product.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setUseCache(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;关闭CGLib缓存，否则总是生成同一个类</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MethodInterceptor()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;intercept(Object&nbsp;obj,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodProxy&nbsp;methodproxy)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;methodproxy.invokeSuper(obj,args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.create();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><div>很快，系统就抛出了 java.lang.OutOfMemoryError: PermGen space<br />内存池peimgen的情况</div><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/permsize/1.jpg" width="837" height="441" /><br /><div>加载类的情况</div><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/permsize/2.jpg" width="396" height="303" /><br /><br /><div>并且在方法区中，一个类如果要被垃圾收集器回收掉，判断的条件是非常苛刻的，很多人都把方法区称为&#8220;永久区&#8221;(Permanent Generation),但据说2者在本质上是不一致的，另外还有称呼为&#8220;非堆区&#8221;，不纠结这个了。<br /><br />再看看enhancer.setUseCache(false)，如果选择为true的话，那么就使用和更新一类具有相同属性生成的类的静态缓存，而不会在同一个类文件还继续被动态加载并视为不同的类，这个其实跟类的equals()和hashCode()有关，它们是与cglib内部的class cache的key相关的。<br /><br />将上面的程序 enhancer.setUseCache(false) 改为 enhancer.setUseCache(ture)</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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PermgenOOM&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enhancer&nbsp;enhancer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Enhancer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(Product.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setUseCache(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;或者不写，默认值就是true</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MethodInterceptor()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;intercept(Object&nbsp;obj,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodProxy&nbsp;methodproxy)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;methodproxy.invokeSuper(obj,args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.create();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><div>内存池peimgen的情况</div><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/permsize/3.jpg" width="851" height="440" /><br /><div>加载类的情况</div><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/permsize/4.jpg" width="392" height="302" /><br /><br /><div>可以发现内存池peimgen和加载类的情况并没有呈现直线上涨，已经他们一直都使用者动态类生成类的静态缓存，但是这种动态创建类使用静态缓存在一些情况下并不适合需求。<br /><br /><font class="Apple-style-span" face="Arial" size="2"><span class="Apple-style-span" style="line-height: 18px;"><br /></span></font></div><img src ="http://www.blogjava.net/dongbule/aggbug/356987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-08-21 15:55 <a href="http://www.blogjava.net/dongbule/archive/2011/08/21/356987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java编程中'为了性能'一些尽量做到的地方</title><link>http://www.blogjava.net/dongbule/archive/2011/08/15/356577.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Mon, 15 Aug 2011 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/08/15/356577.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/356577.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/08/15/356577.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/356577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/356577.html</trackback:ping><description><![CDATA[<div><div><br /><br />最近的机器内存又爆满了，出了新增机器内存外，还应该好好review一下我们的代码，有很多代码编写过于随意化，这些不好的习惯或对程序语言的不了解是应该好好打压打压了。</div><div>下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方<br />-</div><div></div><div><strong>1.尽量在合适的场合使用单例</strong></div><div>使用单例可以减轻加载的负担，缩短加载的时间，提高加载的效率，但并不是所有地方都适用于单例，简单来说，单例主要适用于以下三个方面</div><div>第一，控制资源的使用，通过线程同步来控制资源的并发访问</div><div>第二，控制实例的产生，以达到节约资源的目的</div><div>第三，控制数据共享，在不建立直接关联的条件下，让多个不相关的进程或线程之间实现通信<br />-<br /><strong>2.尽量避免随意使用静态变量</strong></div><div>要知道，当某个对象被定义为stataic变量所引用，那么gc通常是不会回收这个对象所占有的内存，如</div><div>public class A{</div><div><span style="white-space: pre;">	</span>static B b = new B();</div><div>}</div><div>此时静态变量b的生命周期与A类同步，如果A类不会卸载，那么b对象会常驻内存，直到程序终止。<br />-</div><div></div><div><strong>3.尽量避免过多过常的创建java对象</strong></div><div>尽量避免在经常调用的方法，循环中new对象，由于系统不仅要花费时间来创建对象，而且还要花时间对这些对象进行垃圾回收和处理，在我们可以控制的范围内，最</div><div></div><div>大限度的重用对象，最好能用基本的数据类型或数组来替代对象。<br /><div>-</div></div><div></div><div><strong>4.尽量使用final修饰符</strong></div><div>带有final修饰符的类是不可派生的。在Java核心API中，有许多应用final的例子，例如java.lang.String。为String类指定final防止了使用者覆盖length()方法。另外，如果一个类是final的，则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。<br /><div>-</div></div><div></div><div><strong>5.尽量使用局部变量</strong></div><div>调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中，速度较快。其他变量，如静态变量，实例变量等，都在堆(Heap)中创建，速度较慢。<br />-</div><div></div><div><strong>6.尽量处理好包装类型和基本类型两者的使用场所</strong></div><div>虽然包装类型和基本类型在使用过程中是可以相互转换，但它们两者所产生的内存区域是完全不同的，基本类型数据产生和处理都在栈中处理，包装类型是对象，是在堆中产生实例。</div><div>在集合类对象，有对象方面需要的处理适用包装类型，其他的处理提倡使用基本类型。<br />-</div><div></div><div><strong>7.慎用synchronized，尽量减小synchronize的方法</strong></div><div>都知道，实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。synchronize方法被调用时，直接会把当前对象锁了，在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小，并且应尽量使用方法同步代替代码块同步。<br />-</div><div></div><div><strong>8.尽量使用StringBuilder和StringBuffer进行字符串连接</strong></div><div>这个就不多讲了<br />-</div><div></div><div><strong>9.尽量不要使用finalize方法</strong></div><div>实际上，将资源清理放在finalize方法中完成是非常不好的选择，由于GC的工作量很大，尤其是回收Young代内存时，大都会引起应用程序暂停，所以再选择使用finalize方法进行资源清理，会导致GC负担更大，程序运行效率更差。<br /><div>-</div></div><div></div><div><strong>10.尽量使用基本数据类型代替对象</strong></div><div>String str = "hello";</div><div>上面这种方式会创建一个&#8220;hello&#8221;字符串，而且JVM的字符缓存池还会缓存这个字符串；</div><div>String str = new String("hello");</div><div>此时程序除创建字符串外，str所引用的String对象底层还包含一个char[]数组，这个char[]数组依次存放了h,e,l,l,o<br /><div>-</div></div><div></div><div><strong>11.单线程应尽量使用HashMap, ArrayList</strong></div><div>HashTable,Vector等使用了同步机制，降低了性能。<br /><div>-</div></div><div></div><div><strong>12.尽量合理的创建HashMap</strong></div><div>当你要创建一个比较大的hashMap时，充分利用另一个构造函数</div><div>public HashMap(int initialCapacity, float loadFactor)</div><div>避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事，在默认中initialCapacity只有16，而loadFactor是0.75，需要多大的容量，你最好能准确的估计你所需要的最佳大小，同样的Hashtable，Vectors也是一样的道理。<br /><div>-</div></div><div></div><div><strong>13.尽量减少对变量的重复计算</strong></div><div>如</div><div>for(int i=0;i&lt;list.size();i++)</div><div>应该改为</div><div>for(int i=0,len=list.size();i&lt;len;i++)</div><div>并且在循环中应该避免使用复杂的表达式，在循环中，循环条件会被反复计算，如果不使用复杂表达式，而使循环条件值不变的话，程序将会运行的更快。&nbsp;<br /><div>-</div></div><div></div><div><strong>14.尽量避免不必要的创建</strong></div><div>如</div><div>A a = new A();</div><div>if(i==1){list.add(a);}</div><div>应该改为</div><div>if(i==1){</div><div>A a = new A();</div><div>list.add(a);}<br /><div>-</div></div><div></div><div><strong>15.尽量在finally块中释放资源</strong></div><div>程序中使用到的资源应当被释放，以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何，finally块总是会执行的，以确保资源的正确关闭。&nbsp;<br /><div>-</div></div><div></div><div><strong>16.尽量使用移位来代替'a/b'的操作</strong></div><div>"/"是一个代价很高的操作，使用移位的操作将会更快和更有效</div><div>如</div><div>int num = a / 4;</div><div>int num = a / 8;</div><div>应该改为</div><div>int num = a &gt;&gt; 2;</div><div>int num = a &gt;&gt; 3;</div><div>但注意的是使用移位应添加注释，因为移位操作不直观，比较难理解<br /><div>-</div></div><div></div><div><strong>17.尽量使用移位来代替'a*b'的操作</strong></div><div>同样的，对于'*'操作，使用移位的操作将会更快和更有效</div><div>如</div><div>int num = a * 4;</div><div>int num = a * 8;</div><div>应该改为</div><div>int num = a &lt;&lt; 2;</div><div>int num = a &lt;&lt; 3;<br /><div>-</div></div><div></div><div><strong>18.尽量确定StringBuffer的容量</strong></div><div>StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中，如果超出这个大小，就会重新分配内存，创建一个更大的数组，并将原先的数组复制过来，再丢弃旧的数组。在大多数情况下，你可以在创建 StringBuffer的时候指定大小，这样就避免了在容量不够的时候自动增长，以提高性能。&nbsp;</div><div>如：StringBuffer buffer = new StringBuffer(1000); &nbsp;<br /><div>-</div></div><div></div><div><strong>19.尽量早释放无用对象的引用</strong></div><div>大部分时，方法局部引用变量所引用的对象 会随着方法结束而变成垃圾，因此，大部分时候程序无需将局部，引用变量显式设为null。</div><div>例如：</div><div>Public void test(){</div><div>Object obj = new Object();</div><div>&#8230;&#8230;</div><div>Obj=null;</div><div>}</div><div>上面这个就没必要了，随着方法test()的执行完成，程序中obj引用变量的作用域就结束了。但是如果是改成下面：</div><div>Public void test(){</div><div>Object obj = new Object();</div><div>&#8230;&#8230;</div><div>Obj=null;</div><div>//执行耗时，耗内存操作；或调用耗时，耗内存的方法</div><div>&#8230;&#8230;</div><div>}</div><div>这时候就有必要将obj赋值为null，可以尽早的释放对Object对象的引用。<br /><div>-</div></div><div></div><div><strong>20.尽量避免使用二维数组</strong></div><div>二维数据占用的内存空间比一维数组多得多，大概10倍以上。<br /><div>-</div></div><div></div><div><strong>21.尽量避免使用split</strong></div><div>除非是必须的，否则应该避免使用split，split由于支持正则表达式，所以效率比较低，如果是频繁的几十，几百万的调用将会耗费大量资源，如果确实需要频繁的调用split，可以考虑使用apache的StringUtils.split(string,char)，频繁split的可以缓存结果。<br /><div>-</div></div><div></div><div><strong>22.ArrayList &amp; LinkedList</strong></div><div>一个是线性表，一个是链表，一句话，随机查询尽量使用ArrayList，ArrayList优于LinkedList，LinkedList还要移动指针，添加删除的操作LinkedList优于ArrayList，ArrayList还要移动数据，不过这是理论性分析，事实未必如此，重要的是理解好2者得数据结构，对症下药。<br /><div>-</div></div><div></div><div><strong>23.尽量使用System.arraycopy ()代替通过来循环复制数组</strong></div><div>System.arraycopy() 要比通过循环来复制数组快的多&nbsp;<br /><div>-</div></div><div></div><div><strong>24.尽量缓存经常使用的对象</strong></div><div>尽可能将经常使用的对象进行缓存，可以使用数组，或HashMap的容器来进行缓存，但这种方式可能导致系统占用过多的缓存，性能下降，推荐可以使用一些第三方的开源工具，如EhCache，Oscache进行缓存，他们基本都实现了FIFO/FLU等缓存算法。<br /><div>-</div></div><div></div><div><strong>25.尽量避免非常大的内存分配</strong></div><div>有时候问题不是由当时的堆状态造成的，而是因为分配失败造成的。分配的内存块都必须是连续的，而随着堆越来越满，找到较大的连续块越来越困难。<br /><div>-</div></div><div></div><div><strong>26.慎用异常</strong></div><div>当创建一个异常时，需要收集一个栈跟踪(stack track)，这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照，正是这一部分开销很大。当需要创建一个 Exception 时，JVM 不得不说：先别动，我想就您现在的样子存一份快照，所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素，而是包含这个栈中的每一个元素。</div><div>如果您创建一个 Exception ，就得付出代价。好在捕获异常开销不大，因此可以使用 try-catch 将核心内容包起来。从技术上讲，您甚至可以随意地抛出异常，而不用花费很大的代价。招致性能损失的并不是 throw 操作&#8212;&#8212;尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是，好的编程习惯已教会我们，不应该不管三七二十一就抛出异常。异常是为异常的情况而设计的，使用时也应该牢记这一原则。<br /><br />文章主要是为了抛砖引玉，希望有更多牛人的指点<br /><br />谢谢的&nbsp;<div style="display: inline-block;"></div><span class="Apple-style-span" style="font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-size: 13px; line-height: normal; background-color: #f5f5f5;"><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" target="_blank"><strong>xuanyuan </strong>的建议：</a></span><br />===================================================<br /><span class="Apple-style-span" style="font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">7.慎用synchronized，尽量减小synchronize的方法<br />re：同意，不过文中有个地方说错了，使用synchronized关键字并不一定都是锁定当前对象的，要看具体的锁是什么。如果是在方法上加的synchronized，则是以对象本身为锁的，如果是静态方法则锁的粒度是类。<br />---------------<br />9.尽量不要使用finalize方法<br />re：同意，其实不推荐用finalize方法的根本原因在于，JVM的规范并不保证何时执行该方法，所以用这个方法来释放资源很不合适，有可能造成长时间资源得不到释放。<br />---------------<br />16.尽量使用移位来代替'a/b'的操作；17.尽量使用移位来代替'a*b'的操作<br />re：个人不太同意这两条。这样做确实有更好的性能，但是却牺牲了可读性。这两个操作符对很多程序员来说并不直观。我认为在如今硬件价格不那么昂贵的情况下，略微牺牲一些性能，换来更好的可读性和可维护性是好的选择。<br /></span>===================================================<br /><div><a id="AjaxHolder_Comments_CommentList_ctl09_NameLink" target="_blank"><strong>wuzhengju</strong> 的建议：<br /><div>===================================================</div></a></div><div><span style="font-size: 10pt;">19.尽量早释放无用对象的引用</span><br /><span style="font-size: 10pt;">大部分时，方法局部引用变量所引用的对象 会随着方法结束而变成垃圾，因此，大部分时候程序无需将局部，引用变量显式设为null。</span><br /><span style="font-size: 10pt;">例如：</span><br /><span style="font-size: 10pt;">Public void test(){</span><br /><span style="font-size: 10pt;">Object obj = new Object();</span><br /><span style="font-size: 10pt;">&#8230;&#8230;</span><br /><span style="font-size: 10pt;">Obj=null;</span><br /><span style="font-size: 10pt;">}</span><br /><span style="font-size: 10pt;">上面这个就没必要了，随着方法test()的执行完成，程序中obj引用变量的作用域就结束了。但是如果是改成下面：</span><br /><span style="font-size: 10pt;">Public void test(){</span><br /><span style="font-size: 10pt;">Object obj = new Object();</span><br /><span style="font-size: 10pt;">&#8230;&#8230;</span><br /><span style="font-size: 10pt;">Obj=null;</span><br /><span style="font-size: 10pt;">//执行耗时，耗内存操作；或调用耗时，耗内存的方法</span><br /><span style="font-size: 10pt;">&#8230;&#8230;</span><br /><span style="font-size: 10pt;">}   </span><br /><span style="font-size: 10pt;">如果Object obj = new Object();  如果这对象并不是大对象，这有必要吗？Obj=null;只是告诉jvm这个对象已经成为垃圾，至于什么时候回收，还不能确定！   这可读性也不好！</span></div><div>===================================================</div></div><div></div></div><img src ="http://www.blogjava.net/dongbule/aggbug/356577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-08-15 16:51 <a href="http://www.blogjava.net/dongbule/archive/2011/08/15/356577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅述MongoDB的管理操作</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2011/07/30/355409.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/355409.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/07/30/355409.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/355409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/355409.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp; 不知不觉房产系统已经使用MongoDB一年多了，记得一年多以前，正是NOSQL被热炒时，MongoDB更是作为NOSQL中的佼佼者，被炒得火烫，也应该就在当时被这股火烫着了，所以义无反顾的选择了MongoDB，现在想想当时确实有些冲动了，当时MongoDB的资料还是比较少，更别说中文资料了，后来还出现使用MongoDB成功应用的范例Foursquare的宕机事件。现在确实应该很感谢MongoDB为我们的系统服务了一年了，在这一年的时间里，确实出现过不少的小问题，特别是在管理操作上，我想这大概也是因为MongoDB在系统维护上不如Mysql那样有着各种的业界实践，往往就只能通过管理员自己去摸索。<br />
下面将在这一年的一些简单的管理操作做一下记录<br /><br /><div><div>&nbsp;&nbsp;&nbsp; <a href="#x1">Starting and Stopping Mongo</a></div> <div>&nbsp;&nbsp;&nbsp; <a href="#x2">Security and Authentication</a></div> <div>&nbsp;&nbsp;&nbsp; <a href="#x3">Monitoring and Diagnostics</a></div> <div>&nbsp;&nbsp;&nbsp; <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>对了，MongoDB在linux下是无需安装的，从官网上下载下安装包后解压，直接执行mongod，就可以启动MongoDB服务器，当然mongod还有很多的启动选择项，运行mongod --help就可以查看所有的选择项。<br />
<br />
-f [ --config ] arg&nbsp;&nbsp; configuration file specifying additional options<br />
一般来说，启动选择项可以直接写在在mongod后面，也可以指定配置文件，用文件来加载各种启动项，如<br />
/home/mongodb/bin/mongod --config /home/mongodb/conf/mongod.conf</div>
<strong><br />
</strong></div>
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/1.jpg" alt="" width="725" border="0" height="195" /></div>
<div>上面是一台测试机的启动选择项。<br />
<br />
dbpath = /home/mongodb/data<br />
&nbsp;&nbsp;&nbsp; 指定数据库的存储目录，如果不设置则以mongodb的根目录为目录，当MongoDB启动之后，在数据库的存储目录下会创建一个mongod.lock文件，它是用来记录当前的mongod的进程号，同时也用于区分各个mongod的进程实例，所以不同的mongod进程实例是不能用相同的dbpath。<br />
logpath = /home/mongodb/mongodb.log<br />
&nbsp;&nbsp;&nbsp; 指定日志输出的路径，如果没有设置logappend = true，系统会清除原来的日志记录，把已有的文件进行覆盖。<br />
logappend = true<br />
&nbsp;&nbsp;&nbsp; 日志以追加的方式进行记录<br />
bind_ip = 192.168.86.111<br />
&nbsp;&nbsp;&nbsp; 指定对外服务的绑定ip，这里指定内网的ip方式，如果外网无特殊的处理方式是无法进行连接。<br />
port = 27017<br />
&nbsp;&nbsp;&nbsp; 指定服务器的监听端口号，默认是27017，如果单个机器要运行多个mongod进程，则需要给每个进程指定不同的端口号。<br />
fork = true<br />
&nbsp;&nbsp;&nbsp; 指定以守护进程的方式来启动MongoDB，如果不指定，在启动mongod命令是加&#8220;&amp;&#8221;也是可以的。<br />
auth = true<br />
&nbsp;&nbsp;&nbsp; 启动mongodb客户端登录的认证机制。<br />
master = true<br />
&nbsp;&nbsp;&nbsp; 指定该机器为主从模式下的主机器。<br />
配置完配置文件后启栋mongod，启动时要盯着日志文件看，因为日志通常会告诉我们一些错误或警告的信息，这样能够更好的帮助我们了解和避免错误。<br />
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/2.jpg" alt="" width="729" border="0" height="94" /><br />
<br />
<div>这里给出了个提示，使用的是32位的Mongodb，所以MongoDB只是存储最大为2GB的数据。其实这个跟MongoDB的mmap机制有关，如果是64位则不会存在这种限制。<br />
请注意一定要盯着日志看<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&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">100f&nbsp;</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 -9去关闭mongod！这样数据库会不理一切直接杀死该进程，会使得数据文件损坏。<br />
稳妥的方法是使用kill -2 pid去关闭mongod，也就是当mongod进程接受到关闭指令后会等待当前运行操作或文件分配等操作完毕后，关闭所有打开的连接，并将缓存的数据刷新到磁盘后才正式关闭。<br />
最稳妥的方式是使用shutdown命令来结束<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;">&gt;</span><span style="color: #000000;">&nbsp;use&nbsp;admin<br />
switched&nbsp;to&nbsp;db&nbsp;admin<br />
</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;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文档，第一句话就是 Running Without Security(Trusted Environment)，跟我们强调世界上没有什么百分百安全的环境，最好的安全是放在一个安全的环境中运行，这么无底气的话语未免也让人为它的安全担心，不过事实上MongoDB还是有安全认证模式的，只不过跟mysql对比起来有一点简陋。<br />
<br />
<span style="background-color: #ccffcc;">MongoDB的安全</span><br />
MongoDB目前只支持最基本的安全认证，如果我们开启了安全性检查，则只有数据库认证用户才能进行读写操作，当然我们还可以创建读写权限用户和只读权限用户，如果我们在admin的数据库中进行创建用户，那么admin中的用户就会被当作超级用户，超级用户可以读写所有的数据库，并且还可以进行特殊的管理操作，比如可以再创建其他用户关闭进程等操作。<br />
<br />
<span style="background-color: #ccffcc;">配置MongoDb用户认证</span><br />
根据官网上的例子，我们也来创建一个超级用户，一个test库中具有读写操作的普通用户，一个test库中只有读操作的普通用户。</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;">&gt;&nbsp;use&nbsp;admin<br />
switched&nbsp;to&nbsp;db&nbsp;admin<br />
&gt;&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">_id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;false</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">8658a5bf469e005b047560619ef0d51c</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
}<br />
&gt;&nbsp;use&nbsp;test<br />
switched&nbsp;to&nbsp;db&nbsp;test<br />
&gt;&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;false</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">7a597bef551027cc2161d5e0efe4049e</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
}<br />
&gt;&nbsp;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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;true</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</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>这里cyz是在admin库中创建，属于超级用户，可以对所有库进行操作，在test库中创建的cyz001和cyz002属于test库的操作人员，只能对test库进行相应操作，记得要为安全验证生效需要将启动项auth设置为true。<br />
<br />
<span style="background-color: #ccffcc;">查看用户</span><br />
所有的用户信息都存储在每个数据库的db.system.users中，可以使用find()进行查看<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;">&gt;&nbsp;use&nbsp;admin<br />
switched&nbsp;to&nbsp;db&nbsp;admin<br />
&gt;&nbsp;db.system.users.find()<br />
{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">_id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;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;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</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;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">readOnly</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;false</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">pwd</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;<br />
<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">8658a5bf469e005b047560619ef0d51c</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;}</span></div>
<br />
其中的pwd是根据用户名和用户密码生成的散列值。<br />
<br />
<span style="background-color: #ccffcc;">修改用户</span><br />
不管是添加用户，修改用户密码，修改用户操作权限都使用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;">&gt;&nbsp;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的安全认证其实还是简陋的，所以我们还是有其他很多的安全考虑。<br />
1.比如说MongoDB传输协议是不加密的，如果需要加密的话，我们可以考虑使用ssh隧道或是他们的技术来对客户端和服务端之间的通讯进行加密。<br />
2.将MongoDB部署在只有客户端服务器才能访问到的环境，比如内网，vpn网络中，可以使用 bind_ip = 本机或内网 。<br />
3.如果确实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES等技术进行访问限制。<br />
<br />
<div><strong>Monitoring and Diagnostics</strong><a name='x3' id='x3'></a><br />
<br />
<div>官网首先给我们推荐了mongostat监控工具，基本上mongostat可以作为一个外部观测MongoDB内部状态指标的工具，并且一秒更新一次，如果出现一些性能问题可以用这里入手进行分析。<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/3.jpg" alt="" width="1144" border="0" height="122" /></div>
<br />
<div>这里的属性都可以通过mongostat --help进行查看，有几个列需要解释一下，可以帮助到我们发生性能问题时比较准备的找到定位。<br />
<br />
faults：这是一个重要的性能指标，显示你的机器每秒页面故障的数量，这个是mongoDB映射到虚拟地址空间，而不是物理内存，这个值如果飙高的话，可能意味着你的机器没有足够的内存来存储数据和磁盘的访问。<br />
flushes：每秒做了多少次fsync，表面多少次数据被刷新进了磁盘。<br />
mapped：是指mmap有多少数据量，也就是服务器的内存映射，其中包含了虚拟内存和常驻内存。<br />
locked：这个值表面全局写入锁占用了机器多少时间， 当放生全局写入锁时，所有的查询操作都将等待，直到写入锁的解锁，如果这个锁飙高有可能是你的程序那部分出现问题。<br />
idx miss：B树未命中的比例，这个应该是我们查询的命中的实时指数，一般在特定查询中会有用到。<br />
qr | qw：如果有太多的查询进行处理，它们就以一个队列的方式进行，如果这个值飙高的话，那么查询也会变得很慢，因为后面的队列必须等待前面的队列执行完毕，高并发时，一般队列值会升高。<br />
另外我们还可以在mongodb shell中进行检查，使用db.serverStatus()</div>
</div>
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/4.jpg" alt="" width="683" border="0" height="376" /></div>
<br />
<div>基本上db.serverStatus()跟mongostat 差不多，不过它显示的数据更为具体，它也有一个缺陷就是它的数据是静态的，不是实时的。<br />
<br />
<span style="background-color: #ccffcc;">Http Console</span><br />
其实mongodb还提供了一个跟直观的检测工具，在默认情况下，启动mongodb的同时还会启动一个http的服务器，用网页展示的信息比前两个工具来得更加直观，启动默认的监听端口为28017 http：//ip:28017<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/5.jpg" alt="" width="1178" border="0" height="385" /></div>
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/6.jpg" alt="" width="1151" border="0" height="236" /><br />
基本上我们可以看到查询，复制，锁等等这些的情况，具体的参数还是上官网looklook，http://www.mongodb.org/display/DOCS/Http+Interface<br />
<div>当然了，我们还可以使用其他的专业监控软件进行监控，如nagios，cacti，这些都有mongodb的插件。<br />
<br />
<div><strong>Backups</strong><a name='x4' id='x4'></a><br />
MongoDB的备份机制还是不错的，备份的方式也是很多，这个并不比mysql要差。<br />
<br />
Shutdown and Backup<br />
关闭服务，直接把dbpath参数的目录进行备份，只需把所有的文件进行复制到其他地方就可以，不过如果这个备份是在服务启动时候做的话，有可能备份的文件会被损坏，虽然这种关闭服务的备份很有效也很安全，都效果相当不理想。<br />
<br />
mongodump &amp; mongorestore<br />
mongodump简直就是mysqldump的另一版，如果你使用过mysqldump那就再熟悉不过了，mongodbdump可以使用在各个客户端，对正在运行的mongodb服务做出查询，然后将所有查到的文本写入到客户端的磁盘。</div>
</div>
<img src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/7.jpg" alt="" width="704" border="0" height="257" /><br />
<br />
<div><br />
除了mongodump，MongoDB还提供了从备份中恢复数据的工具mongorestore，mongorestore从mongodump获取结果，并将备份的数据插入到运行的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&nbsp;--db&nbsp;test&nbsp;--collection&nbsp;user&nbsp;--out&nbsp;-&nbsp;&gt;&nbsp;/home/chenyz/cyz.bson<br />
./mongorestore&nbsp;--db&nbsp;test&nbsp;--collection&nbsp;user&nbsp;--directoryperdb&nbsp;/home/chenyz/cyz.bson&nbsp;--drop&nbsp;cyz.bson</span></div>
<br />
<div>上面的例子中，指定了要备份的db和要备份的collection，--drop表明要在恢复前删除集合，否则，数据将和现有的集合数据合并。<br />
<br />
<span style="background-color: #ccffcc;">主从备份</span><br />
上面说的几种备份数据方式已经很灵活了，但都不及在从服务器上备份来得方便，从服务器的数据几乎是于主服务器进行同步，涉及到主从方面还有很多，从服务器备份就不放在这里讲了。<br />
<br />
<span style="background-color: #ccffcc;">修复</span><br />
遇到一些停电，或非法关闭mongodb，不合理备份文件的操作，往往会出现文件损毁的提示，幸好，mongodb内置的修复功能会试着去恢复损坏的文件。<br />
操作很简单，只需在启动mongod 加入 --repair启动项，系统就会将所有的文件导入忽略那些无效的文档然后进行导入，完成之后，会重新建立索引，数据量大的话需要花费很长的时间，因为所有的文件都需要进行验证，所有的索引都需要重建，另外修复数据库还能起到压缩数据的作用，闲置的空间，碎片在修复后会被重新回收进行使用。<br />
<br />
另外在shell中也可以直接进行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;">&gt;&nbsp;db.repairDatabase()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ok</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
}</span></div>
</div><img src ="http://www.blogjava.net/dongbule/aggbug/355409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-07-30 18:23 <a href="http://www.blogjava.net/dongbule/archive/2011/07/30/355409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java数据结构-Comparable&amp;Comparator</title><link>http://www.blogjava.net/dongbule/archive/2011/06/15/352361.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Wed, 15 Jun 2011 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/06/15/352361.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/352361.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/06/15/352361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/352361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/352361.html</trackback:ping><description><![CDATA[<div>在深入了解TreeMap之前，有两个接口要先弄清楚，分别是Comparable和Comparator<br />
<br />
<strong>Comparable &amp; Comparator</strong><br />
<br />
<strong>Comparable</strong><br />
Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序，类的 compareTo 方法被称为它的自然比较方法。对象本身就已经支持自比较所需要实现的接口（如 String、Integer 自己就可以完成比较大小操作）。<br />
<br />
它只有一个方法,int compareTo(T o),用来比较当前对象和传入的参数，查看jdk api，共有这一批类实现了此接口，见下图<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/o_treemap1.png" /><br />
<br />
<div>打开实现了该接口的Integer包装类查看源码</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: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Integer&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Number&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Comparable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Integer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;compareTo(Integer&nbsp;anotherInteger)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;thisVal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;anotherVal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;anotherInteger.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(thisVal</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">anotherVal&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;:&nbsp;(thisVal</span><span style="color: #000000; ">==</span><span style="color: #000000; ">anotherVal&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
<br />
<div>可以看到该方法通过当前的Integer对象的值是否大于传入的参数来得到返回值，Integer的compareTo实现是按数字大小的自然排序，再找另一个例子String</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; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;String<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;java.io.Serializable,&nbsp;Comparable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">,&nbsp;CharSequence<br />
{<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;compareTo(String&nbsp;anotherString)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;anotherString.count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.min(len1,&nbsp;len2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;v1[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;v2[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;anotherString.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;offset;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;anotherString.offset;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;j)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;lim&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(k&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;lim)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v1[k];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v2[k];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(c1&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;c2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;c1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;c2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(n</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v1[i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v2[j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(c1&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;c2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;c1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;c2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;len2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<div>可以看出String的compareTo实现是按字符串中字符的Unicode值进行排序的，也真是因为各种类实现的不同，所以只有在相互可比的类才能进行排序，否则会抛出java.lang.ClassCastException的异常。应该说Comparable是集合内部实现的排序，想要进行集合外的排序就需要Comparator接口。<br />
<br />
<strong>Comparator</strong><br />
如果一个类不能实现Comparable接口，那么我们自己可以提供Comparator的排序，如果你不喜欢缺省的Comparator行为，照样可以编写自己的Comparator。<br />
<br />
Comparator只有2个方法，分别为int compare(T o1, T o2) 和boolean equals(Object obj) <br />
<br />
Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似，如果排序第一个元素出现在第二个元素之前，则返回一个负值，如果第一个元素出现在第二个元素后面，返回一个正值，再否则，返回零。与Comparable不同的是Comparator是由用户自行决定处理。<br />
通过一个小例子可以比较明确的看出</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; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ComparatorTest&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Comparator{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;compare(Object&nbsp;u1,&nbsp;Object&nbsp;u2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;uname1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((User)u1).getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;uname2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((User)u2).getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;uname1.compareTo(uname2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;User&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getName(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><div>Comparator比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法（如 Collections.sort），从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构（如 TreeSet 或 TreeMap）的顺序。</div><img src ="http://www.blogjava.net/dongbule/aggbug/352361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-06-15 15:07 <a href="http://www.blogjava.net/dongbule/archive/2011/06/15/352361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说说MongoDB的ObjectId</title><link>http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Sun, 12 Jun 2011 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/352138.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/352138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/352138.html</trackback:ping><description><![CDATA[<div>前段时间有个朋友问我，分布式主键生成策略在我们这边是怎么实现的，当时我给的答案是sequence，当然这在不高并发的情况下是没有任何问题，实际上，我们的主键生成是可控的，但如果是在分布式高并发的情况下，那肯定是有问题的。<br /><br />突然想起mongodb的objectid，记得以前看过文档，objectid是一种轻量型的，不同的机器都能用全局唯一的同种方法轻量的生成它，而不是采用传统的自增的主键策略，因为在多台服务器上同步自动增加主键既费力又费时，不得不佩服，mongodb从开始设计就被定义为分布式数据库。<br />下面深入一点来翻翻这个Objectid的底细，在mongodb集合中的每个document中都必须有一个"_id"建，这个键的值可以是任何类型的，在默认的情况下是个Objectid对象。<br />当我们让一个collection中插入一条不带_id的记录，系统会自动地生成一个_id的key</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;">&gt;&nbsp;db.t_test.insert({"name":"cyz"})<br />&gt;&nbsp;db.t_test.findOne({"name":"cyz"})<br />{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("4df2dcec2cdcd20936a8b817"),&nbsp;"name"&nbsp;:&nbsp;"cyz"&nbsp;}</span></div><br /><div>可以发现这里多出一个Objectid类型的_id，当然了，这个_id是系统默认生成的，你也可以为其指定一个值，不过在同一collections中该值必须是唯一的<br /><br />把 ObjectId("4df2dcec2cdcd20936a8b817")这串值拿出来并对照官网的解析来深入分析。<br /><br />"4df2dcec2cdcd20936a8b817" 以这段字符串为例来进行解析，这是一个24位的字符串，看起来很长，很难理解，实际上它是由ObjectId(string)所创建的一组十六进制的字符，每个字节两位的十六进制数字，总共使用了12字节的存储空间，可能有些朋友会感到很奇怪，居然是用了12个字节，而mysql的INT类型也只有4个字节，不过按照现在的存储设备，多出来的这点字节也应该不会成为什么瓶颈，实际上，mongodb在设计上无处不在的体现着用空间换时间的思想，接下看吧<br /><br />下面是官网指定Bson中ObjectId的详细规范<br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/o_111.PNG" /><br /><br /><div><strong>TimeStamp</strong><br />前4位是一个unix的时间戳，是一个int类别，我们将上面的例子中的objectid的前4位进行提取&#8220;4df2dcec&#8221;，然后再将他们安装十六进制专为十进制：&#8220;1307761900&#8221;，这个数字就是一个时间戳，为了让效果更佳明显，我们将这个时间戳转换成我们习惯的时间格式</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;">$&nbsp;date&nbsp;-d&nbsp;'1970-01-01&nbsp;UTC&nbsp;1307761900&nbsp;&nbsp;sec'&nbsp;&nbsp;-u<br />2011年&nbsp;06月&nbsp;11日&nbsp;星期六&nbsp;03:11:40&nbsp;UTC</span></div><br /><div>前4个字节其实隐藏了文档创建的时间，并且时间戳处在于字符的最前面，这就意味着ObjectId大致会按照插入进行排序，这对于某些方面起到很大作用，如作为索引提高搜索效率等等。使用时间戳还有一个好处是，某些客户端驱动可以通过ObjectId解析出该记录是何时插入的，这也解答了我们平时快速连续创建多个Objectid时，会发现前几位数字很少发现变化的现实，因为使用的是当前时间，很多用户担心要对服务器进行时间同步，其实这个时间戳的真实值并不重要，只要其总不停增加就好。</div><br /><div><strong>Machine </strong><br />接下来的三个字节，就是 2cdcd2 ,这三个字节是所在主机的唯一标识符，一般是机器主机名的散列值，这样就确保了不同主机生成不同的机器hash值，确保在分布式中不造成冲突，这也就是在同一台机器生成的objectid中间的字符串都是一模一样的原因。<br /><br /><strong>pid</strong><br />上面的Machine是为了确保在不同机器产生的objectid不冲突，而pid就是为了在同一台机器不同的mongodb进程产生了objectid不冲突，接下来的0936两位就是产生objectid的进程标识符。<br /><br /><strong>increment</strong><br />前面的九个字节是保证了一秒内不同机器不同进程生成objectid不冲突，这后面的三个字节a8b817，是一个自动增加的计数器，用来确保在同一秒内产生的objectid也不会发现冲突，允许256的3次方等于16777216条记录的唯一性。</div><br /><div><strong>客户端生成</strong><br />mongodb产生objectid还有一个更大的优势，就是mongodb可以通过自身的服务来产生objectid，也可以通过客户端的驱动程序来产生，如果你仔细看文档你会感叹，mongodb的设计无处不在的使<br /><br />用空间换时间的思想，比较objectid是轻量级，但服务端产生也必须开销时间，所以能从服务器转移到客户端驱动程序完成的就尽量的转移，必须将事务扔给客户端来完成，减低服务端的开销，另还有一点原因就是扩展应用层比扩展数据库层要变量得多。<br /><br />好吧，既然我们了解到我们的程序产生objectid是在客户端完成，那再继续，进一步了解，打开<strong>mongodb java driver源码</strong>，无源码可以到mongodb官网进行下载，下面摘录部分代码<br /><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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ObjectId&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Comparable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ObjectId</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;,&nbsp;java.io.Serializable&nbsp;{<br /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_time;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_machine;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_inc;<br /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ObjectId(&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;b&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;b.length&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalArgumentException(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">need&nbsp;12&nbsp;bytes</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;bb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ByteBuffer.wrap(&nbsp;b&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bb.getInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_machine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bb.getInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bb.getInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_new&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ObjectId(&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;time&nbsp;,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;machine&nbsp;,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;inc&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;time;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_machine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;machine;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;inc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_new&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ObjectId(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;(System.currentTimeMillis()&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_machine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_genmachine;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_nextInc.getAndIncrement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_new&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />（完整代码请查看源码）</span></div><br /><div>这里可以发现ObjectId的构建可以有多种方式，可以由自己制定字节，也可以指定时间，机器码和自增值，这里重点看看驱动程序默认的构建，也就是public ObjectId()<br />可以看到objectid主要由_time _machine _inc 所组成，其中 _time直接由(System.currentTimeMillis() / 1000)计算出所谓的时间戳，这里很简单，接下来是重点，主要看看<strong>机器码和进程码</strong>的构建</div></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;">&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_genmachine;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;machinePiece;</span><span style="color: #008000;">//</span><span style="color: #008000;">机器码块</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">NetworkInterface</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NetworkInterface.getNetworkInterfaces();</span><span style="color: #008000;">//</span><span style="color: #008000;">NetworkInterface此类表示一个由名称和分配给此接口的&nbsp;IP&nbsp;地址列表组成的网络接口，它用于标识将多播组加入的本地接口，这里通过NetworkInterface此机器上所有的接口</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;e.hasMoreElements()&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetworkInterface&nbsp;ni&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;e.nextElement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&nbsp;ni.toString()&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;machinePiece&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sb.toString().hashCode()&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将得到所有接口的字符串进行取散列值</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.fine(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">machine&nbsp;piece&nbsp;post:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;Integer.toHexString(&nbsp;machinePiece&nbsp;)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;processPiece;</span><span style="color: #008000;">//</span><span style="color: #008000;">进程块</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;processId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.util.Random().nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode();</span><span style="color: #008000;">//</span><span style="color: #008000;">RuntimeMXBean是Java虚拟机的运行时系统的管理接口，这里是返回表示正在运行的&nbsp;Java&nbsp;虚拟机的名称，并进行取散列值。</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(&nbsp;Throwable&nbsp;t&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader&nbsp;loader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ObjectId.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;loaderId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;loader&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;System.identityHashCode(loader)&nbsp;:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(Integer.toHexString(processId));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(Integer.toHexString(loaderId));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processPiece&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sb.toString().hashCode()&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xFFFF</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.fine(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">process&nbsp;piece:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;Integer.toHexString(&nbsp;processPiece&nbsp;)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_genmachine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;machinePiece&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;processPiece;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">最后将机器码块的散列值与进程块的散列值进行位或运算，得到&nbsp;_genmachine&nbsp;</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.fine(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">machine&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;Integer.toHexString(&nbsp;_genmachine&nbsp;)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(&nbsp;java.io.IOException&nbsp;ioe&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(&nbsp;ioe&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div><br /><div><strong>&nbsp;Enumeration&lt;NetworkInterface&gt; e = NetworkInterface.getNetworkInterfaces();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( e.hasMoreElements() ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetworkInterface ni = e.nextElement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append( ni.toString() );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;machinePiece = sb.toString().hashCode() &lt;&lt; 16;</strong><br />这里的NetworkInterface.getNetworkInterfaces();取得的接口通常是按名称（如 "le0"）区分的，大约是下面的类型</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;">name:lo&nbsp;(Software&nbsp;Loopback&nbsp;Interface&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;index:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;addresses:<br /></span><span style="color: #000000;">/</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br /></span><span style="color: #000000;">/</span><span style="color: #000000;">127.0</span><span style="color: #000000;">.</span><span style="color: #000000;">0.1</span><span style="color: #000000;">;<br />name:net0&nbsp;(WAN&nbsp;Miniport&nbsp;(SSTP))&nbsp;index:&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;addresses:<br />name:net1&nbsp;(WAN&nbsp;Miniport&nbsp;(IKEv2))&nbsp;index:&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;addresses:<br />name:net2&nbsp;(WAN&nbsp;Miniport&nbsp;(L2TP))&nbsp;index:&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;addresses:<br />name:net3&nbsp;(WAN&nbsp;Miniport&nbsp;(PPTP))&nbsp;index:&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;addresses:<br />name:ppp0&nbsp;(WAN&nbsp;Miniport&nbsp;(PPPOE))&nbsp;index:&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;addresses:</span></div><br /><div>这里为什么要采取这样方面进行取散列值，感觉有些不太理解，应该网络接口本身相对而言是并不稳定的<br /><br /><div><strong>int processId = new java.util.Random().nextInt();<br />&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processId = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode();<br />&nbsp;}<br />&nbsp;catch ( Throwable t ){<br />}</strong><br />RuntimeMXBean是Java虚拟机的运行时系统的管理接口，这里是返回表示正在运行的 Java 虚拟机的名称，并进行取散列值，如果在这过程中出现异常，processId 将以随机数的方式继续计算<br /><br /><strong>_genmachine = machinePiece | processPiece;</strong><br /><div>最后将机器码块的散列值与进程块的散列值进行位或运算，当然这里是十进制，你把这里的十进制专为十六进制，就会发现这块的值就是生产objectid中间部分的值，这里的构建跟服务端的构建是有些不一样的，不过最基本的构建元素还是一致的，就是<strong>TimeStamp，Machine ，pid，increment</strong>。<br /><br />mongodb的ObejctId生产思想在很多方面挺值得我们借鉴的，特别是在大型分布式的开发，如何构建轻量级的生产，如何将生产的负载进行转移，如何以空间换取时间提高生产的最大优化等等。</div></div>----------------------------------------<br />  <br />  by 陈于喆 <br />  QQ:34174409<br />  Mail: dongbule@163.com<br /></div><img src ="http://www.blogjava.net/dongbule/aggbug/352138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-06-12 18:30 <a href="http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js全局/局部变量的乌龙问题</title><link>http://www.blogjava.net/dongbule/archive/2011/06/02/351608.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Thu, 02 Jun 2011 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/06/02/351608.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/351608.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/06/02/351608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/351608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/351608.html</trackback:ping><description><![CDATA[<div>今天在写个一段js代码出现了变量值出现异常的问题，把代码做了提取，简单的如下面</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; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #F5F5F5; color: #000000; "><br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a1(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">},{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">},{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">3</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">}];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">(i</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">;i</span><span style="background-color: #F5F5F5; color: #000000; ">&lt;</span><span style="background-color: #F5F5F5; color: #000000; ">a.length;i</span><span style="background-color: #F5F5F5; color: #000000; ">++</span><span style="background-color: #F5F5F5; color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;first</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a2(a[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;second</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a2(obj){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(i&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">in</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">hello</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />}<br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">body&nbsp;</span><span style="color: #FF0000; ">onload</span><span style="color: #0000FF; ">="a1();"</span><span style="color: #0000FF; ">&gt;</span></div><br /><br /><div>在第一次alert(i)是 0 first<br />在第二次alert(i)是 name second<br /><br />为什么会出现这样的情况，明明在a2函数传进去的是实参，并且也没有对参数a[i]进行改写<br />在反复查看问题后发现是i变量的问题，在函数a1()中，i被定义成为了全局变量，而在函数a2()中，i又是一个全局变量，所以在a2的for (i in obj) 循环中i被重新赋值成"name"<br />这个乌龙是没有养成在一些临时函数定义成局部变量造成的，特别是在一些for，while，if的操作中，临时变量必须定义成局部变量否则会出现全局变量被改写的情况。<br /><br />再回顾一下定义全局变量／局部变量的规则<br />在函数外部，使用var，或直接使用变量，如var a=1;或 a=1; 就定义了全局变量<br />在函数内部，直接使用变量，如a=1;也定义了全局变量<br />在函数内部，使用var进行定义就是局部变量<br /><br />修改一下上面的代码</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; ">&lt;</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #F5F5F5; color: #000000; "><br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a1(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">},{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">},{</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">name</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">:</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">3</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">}];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">(</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;i</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">;i</span><span style="background-color: #F5F5F5; color: #000000; ">&lt;</span><span style="background-color: #F5F5F5; color: #000000; ">a.length;i</span><span style="background-color: #F5F5F5; color: #000000; ">++</span><span style="background-color: #F5F5F5; color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;first</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a2(a[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;second</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a2(obj){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;i&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">in</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">hello</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />}<br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">body&nbsp;</span><span style="color: #FF0000; ">onload</span><span style="color: #0000FF; ">="a1();"</span><span style="color: #0000FF; ">&gt;</span></div><img src ="http://www.blogjava.net/dongbule/aggbug/351608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-06-02 16:11 <a href="http://www.blogjava.net/dongbule/archive/2011/06/02/351608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>房产地图google map的初步应用点滴.4)</title><link>http://www.blogjava.net/dongbule/archive/2011/06/02/351597.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Thu, 02 Jun 2011 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/06/02/351597.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/351597.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/06/02/351597.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/351597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/351597.html</trackback:ping><description><![CDATA[<div><a id="Editor_Results_rprSelectionList_ctl09_LinkTitle" href="../archive/2011/02/12/344141.html">房产地图google map的初步应用点滴.1)</a> </div><div><a id="Editor_Results_rprSelectionList_ctl07_LinkTitle" href="../archive/2011/03/05/345786.html">房产地图google map的初步应用点滴.2)</a></div><div><a id="Editor_Results_rprSelectionList_ctl05_LinkTitle" href="../archive/2011/03/30/347304.html">房产地图google map的初步应用点滴.3)</a></div><div><a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" href="../archive/2011/06/02/351597.html">房产地图google map的初步应用点滴.4)</a></div><br /><div><strong>google map测距的实现和分析</strong><br /><br />不断有传闻google map在今年的7月1号之后在大陆停止运营，具体原因是因为天朝的牌照问题，这个就不多讲了，可以发现现在搜房网的地图，和安居客等的地图纷纷都撤下 google map，而重新选择了mapabc或baidu，当然网易房产地图也不例外，现在也在使用mapabc作为网易房产地图的开发，预计将在6月底前上线，到 时再跟大家分享一下mapabc的一些开发实践。<br /><br />还是说回google map的开发，自从上次建了个qq群就有不少人在问测距怎么实现，当然很多人想的是拿来主义的，当时是拿http://xf.house.163.com /gz/map/000B.html的例子出来，但确实页面上进行了封装也写得比较乱，所以还是比较难以抽离，先给个简单实现的例子：</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: #0000FF; ">&lt;!</span><span style="color: #FF00FF; ">DOCTYPE&nbsp;html</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">html</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">head</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">meta&nbsp;</span><span style="color: #FF0000; ">http-equiv</span><span style="color: #0000FF; ">="content-type"</span><span style="color: #FF0000; ">&nbsp;content</span><span style="color: #0000FF; ">="text/html;&nbsp;charset=GBK"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">163网易房产</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #FF0000; ">&nbsp;src</span><span style="color: #0000FF; ">="http://maps.google.com/maps/api/js?sensor=false"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">script&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text/javascript"</span><span style="color: #0000FF; ">&gt;</span><span style="background-color: #F5F5F5; color: #000000; "><br />&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;map;<br />&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;initialize()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;myLatlng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;google.maps.LatLng(</span><span style="background-color: #F5F5F5; color: #000000; ">23.116193</span><span style="background-color: #F5F5F5; color: #000000; ">,</span><span style="background-color: #F5F5F5; color: #000000; ">113.374525</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;myOptions&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoom:&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">15</span><span style="background-color: #F5F5F5; color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;center:&nbsp;myLatlng,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapTypeId:&nbsp;google.maps.MapTypeId.ROADMAP<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;google.maps.Map(document.getElementById(</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">map_canvas</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">),&nbsp;myOptions);<br />&nbsp;&nbsp;}<br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;polyline;<br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;polylinesArray&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[];<br /></span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">距离标记数组</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lenArray&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[];&nbsp;<br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;rule&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">null</span><span style="background-color: #F5F5F5; color: #000000; ">;&nbsp;<br />&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">距离</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;getDistance(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">启动整个地图的click侦听</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;rule&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;google.maps.event.addListener(map,</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">click</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">,</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">(event){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMarker(event.latLng);<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />}<br /></span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">添加新标记</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;addMarker(location){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">标记选项</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;myOptions&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;:&nbsp;location,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draggable&nbsp;:</span><span style="background-color: #F5F5F5; color: #0000FF; ">false</span><span style="background-color: #F5F5F5; color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;:&nbsp;map,<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;marker&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;google.maps.Marker(myOptions);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">将标记压入数组</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;lenArray.push(marker);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">计算距离&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;drawOverlay();<br />}<br /></span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">画出路径覆盖层</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;drawOverlay(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">路线数组</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;flightPlanCoordinates&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">将坐标压入路线数组</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">if</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(lenArray)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(i&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">in</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lenArray)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flightPlanCoordinates.push(lenArray[i].getPosition());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">路径选项</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;polylineOptions&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;:&nbsp;flightPlanCoordinates,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;:&nbsp;map,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strokeColor&nbsp;:&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">#FF0000</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strokeOpacity&nbsp;:&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">1.0</span><span style="background-color: #F5F5F5; color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strokeWeight&nbsp;:&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;polyline&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">new</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;google.maps.Polyline(polylineOptions);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #008000; ">//</span><span style="background-color: #F5F5F5; color: #008000; ">清除原有折线路径</span><span style="background-color: #F5F5F5; color: #008000; "><br /></span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">if</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(polylinesArray)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(i&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">in</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;polylinesArray)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polylinesArray[i].setMap(</span><span style="background-color: #F5F5F5; color: #0000FF; ">null</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polylinesArray&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;polyline.setMap(map);<br />&nbsp;&nbsp;&nbsp;&nbsp;polylinesArray.push(polyline);<br />&nbsp;&nbsp;&nbsp;&nbsp;alert((polyline.getLength()</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">1000</span><span style="background-color: #F5F5F5; color: #000000; ">).toFixed(</span><span style="background-color: #F5F5F5; color: #000000; ">3</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">km</span><span style="background-color: #F5F5F5; color: #000000; ">"</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />}<br />google.maps.LatLng.prototype.distanceFrom&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">(latlng)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lat&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[</span><span style="background-color: #F5F5F5; color: #0000FF; ">this</span><span style="background-color: #F5F5F5; color: #000000; ">.lat(),&nbsp;latlng.lat()]<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[</span><span style="background-color: #F5F5F5; color: #0000FF; ">this</span><span style="background-color: #F5F5F5; color: #000000; ">.lng(),&nbsp;latlng.lng()]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;R&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">6378137</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;dLat&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(lat[</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">]&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">-</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lat[</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">])&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.PI&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">180</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;dLng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(lng[</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">]&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">-</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;lng[</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">])&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.PI&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">180</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.sin(dLat&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.sin(dLat&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.cos(lat[</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">]&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.PI&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">180</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.cos(lat[</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">]&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.PI&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">180</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.sin(dLng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.sin(dLng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">/</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;c&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">2</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.atan2(Math.sqrt(a),&nbsp;Math.sqrt(</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">-</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;a));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;d&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;R&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">*</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;Math.round(d);<br />}&nbsp;<br />google.maps.Marker.prototype.distanceFrom&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">(marker)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">this</span><span style="background-color: #F5F5F5; color: #000000; ">.getPosition().distanceFrom(marker.getPosition());<br />}<br />google.maps.Polyline.prototype.getLength&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">function</span><span style="background-color: #F5F5F5; color: #000000; ">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;d&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;path&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">this</span><span style="background-color: #F5F5F5; color: #000000; ">.getPath();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;latlng;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">for</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;(</span><span style="background-color: #F5F5F5; color: #0000FF; ">var</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;i&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">;&nbsp;i&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">&lt;</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;path.getLength()&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">-</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">;&nbsp;i</span><span style="background-color: #F5F5F5; color: #000000; ">++</span><span style="background-color: #F5F5F5; color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latlng&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;[path.getAt(i),&nbsp;path.getAt(i&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">+</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">)];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="background-color: #F5F5F5; color: #000000; ">+=</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;latlng[</span><span style="background-color: #F5F5F5; color: #000000; ">0</span><span style="background-color: #F5F5F5; color: #000000; ">].distanceFrom(latlng[</span><span style="background-color: #F5F5F5; color: #000000; ">1</span><span style="background-color: #F5F5F5; color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #F5F5F5; color: #0000FF; ">return</span><span style="background-color: #F5F5F5; color: #000000; ">&nbsp;d;<br />}<br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">head</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">body&nbsp;</span><span style="color: #FF0000; ">onload</span><span style="color: #0000FF; ">="initialize()"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">div&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="map_canvas"</span><span style="color: #FF0000; ">&nbsp;style</span><span style="color: #0000FF; ">="width:&nbsp;500px;&nbsp;height:&nbsp;400px"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">div</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="#this"</span><span style="color: #FF0000; ">&nbsp;onclick</span><span style="color: #0000FF; ">="getDistance();"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">开始测距</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">body</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">html</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span></div><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/dongbule/46046/r_r.png" height="433" width="512" /><br /><br /><div>例子给完了，其中测距的计算是抄了google的示例，想简单拿来应用的到这里就可以结束了，还有点兴趣的可以看看下面的简单分析：</div><br /><div>说到测距无非就是线的计算，根据google map api，测距的线性实现我们采用<strong>Polyline</strong>类，<strong>Polyline</strong>是折线是地图上的连接线段的线性叠加层，扩展自MVCObject。</div><br /><div>测距是由线组成，然后根据一组线的长短计算出线的启动和终点线的距离，根据这个思路，我们定义出<br />var <strong>polyline</strong>;<br />var <strong>polylinesArray </strong>= [];<br />其中polyline是当前画出来这条线，polylinesArray是一个数组，当每话出一条线就将这条线push到polylinesArray这个数组中去。</div><br /><div>另外一条线其实是由两个点，始点和终点所组成，所以我们也定义一个<br />var lenArray = []; <br />lenArray是一个数组，用来记录鼠标点过的每一个点的信息<br />也就是说整个测距是由每一条线所组成，而一条线是由2个点组成。<br /><br />思路理清楚了，接着一步一步看<br /><br />当我们点击了开始测距时，就需要启动一个事件的监听，对整个map的click事件监听<br />&nbsp;&nbsp; &nbsp;rule = google.maps.event.addListener(map,"click",function(event){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;addMarker(event.latLng);<br />&nbsp;&nbsp; &nbsp;});<br />当我们在地图上进行点击时，就会新增一个maker点，并且将这个maker压入lenArray数组，以便于后面的计算<br />function addMarker(location){<br />...<br />marker = new google.maps.Marker(myOptions);<br />...<br />lenArray.push(marker);<br />drawOverlay();<br />接着会调用drawOverlay();使用polyline来画线<br />&nbsp;&nbsp; &nbsp;var flightPlanCoordinates = [];<br />&nbsp;&nbsp; &nbsp;//将坐标压入路线数组<br />&nbsp;&nbsp; &nbsp;if (lenArray) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (i in lenArray) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;flightPlanCoordinates.push(lenArray[i].getPosition());<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;var polylineOptions = {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;path : flightPlanCoordinates,<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map : map,<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strokeColor : "#FF0000",<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strokeOpacity : 1.0,<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strokeWeight : 2<br />&nbsp;&nbsp; &nbsp;};<br />&nbsp;&nbsp; &nbsp;polyline = new google.maps.Polyline(polylineOptions);</div><br /><div>其中<strong>polylineOptions</strong>的path参数是折线坐标的有序序列。可以使用一个简单的 LatLng 数组或者 LatLng 的 MVCArray 指定此路径。请注意，如果您传<br /><br />递简单的数组，则它会转换为 MVCArray。在 MVCArray 中插入或删除 LatLng 将自动更新地图上的折线。<br />flightPlanCoordinates数组用于存储在上面我们定义的lenArray数组的坐标值，每点击一次就压入一对坐标值。<br />strokeColor和strokeOpacity，strokeWeight是一些样式的参数，如指定线条的宽度等等。<br />最后我们将定义的polyline进行setMap，在地图上展现，并将polyline压入到polylinesArray数组中去。<br />&nbsp;&nbsp; &nbsp;polyline.setMap(map);<br />&nbsp;&nbsp; &nbsp;polylinesArray.push(polyline);<br />到这里，线和点的展现已经完成了，接下来是需要将这些点线转换成我们需要的距离值。<br /><br />google.maps.Polyline.prototype.getLength = function() {<br />&nbsp;&nbsp; &nbsp;var d = 0;<br />&nbsp;&nbsp; &nbsp;var path = this.getPath();<br />&nbsp;&nbsp; &nbsp;var latlng;<br />&nbsp;&nbsp; &nbsp;for (var i = 0; i &lt; path.getLength() - 1; i++) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;latlng = [path.getAt(i), path.getAt(i + 1)];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;d += latlng[0].distanceFrom(latlng[1]);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return d;<br />}</div><br /><div>这里需要讲明的是this.getPath();它的说明是检索第一条路径。并且返回值是一组MVCArray.&lt;LatLng&gt;，也就是实际存储了一条线的坐标值，在这里取出这些坐标的数组，并且进行循环distanceFrom计算<br /><br />google.maps.LatLng.prototype.distanceFrom = function(latlng) {<br />&nbsp;&nbsp; &nbsp;var lat = [this.lat(), latlng.lat()]<br />&nbsp;&nbsp; &nbsp;var lng = [this.lng(), latlng.lng()] <br />&nbsp;&nbsp; &nbsp;var R = 6378137;<br />&nbsp;&nbsp; &nbsp;var dLat = (lat[1] - lat[0]) * Math.PI / 180;<br />&nbsp;&nbsp; &nbsp;var dLng = (lng[1] - lng[0]) * Math.PI / 180;<br />&nbsp;&nbsp; &nbsp;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);<br />&nbsp;&nbsp; &nbsp;var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));<br />&nbsp;&nbsp; &nbsp;var d = R * c;<br />&nbsp;&nbsp; &nbsp;return Math.round(d);<br />} <br />这段计算实际上是抄自google map示例的，是将我们的坐标值转换成我们需要计算的距离值，这里就不分析，有兴趣可以玩玩，没兴趣就直接抄过去吧。<br /><br />结果出来了，这个就是我们需要的测距的距离，当然你也可以用其他方式进行展现<br /><br /><strong>alert((polyline.getLength()/1000).toFixed(3) + "km");</strong><br /><div>只要阅读google api和自己思路清楚，一个测距的demo很快就完成了，稍加装饰基本就可以应用于生产上</div><br /><div>如果你也在进行google map的开发，欢迎赐教和讨论，建了个qq群：11029590</div></div><img src ="http://www.blogjava.net/dongbule/aggbug/351597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-06-02 14:01 <a href="http://www.blogjava.net/dongbule/archive/2011/06/02/351597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解答一下几道笔试题</title><link>http://www.blogjava.net/dongbule/archive/2011/04/21/348723.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Thu, 21 Apr 2011 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/04/21/348723.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/348723.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/04/21/348723.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/348723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/348723.html</trackback:ping><description><![CDATA[有朋友去一家大型的互联网公司参加了java程序员的笔试，抄下了一些笔试题，可能有的抄的并不全，试了解答一下，有些还真的答不出来<br />
<br />
&nbsp;&nbsp;&nbsp; 1.cookie和session的作用以及他们的应用场合<br />
&nbsp;&nbsp;&nbsp; 2.怎样让jvm加载一个Class的同时执行一段代码<br />
&nbsp;&nbsp;&nbsp; 3.post和get区别<br />
&nbsp;&nbsp;&nbsp; 4.事务的属性有哪些？写出spring或jdbc管理事务的例子<br />
&nbsp;&nbsp;&nbsp; 5.实现一个高并发、高性能的hashmap。写出伪代码<br />
&nbsp;&nbsp;&nbsp; 6.解析一段xml，拼接成一个url。<br />
&nbsp;&nbsp;&nbsp; 7.怎么解决并发？怎么解决集群环境下的并发?<br />
&nbsp;&nbsp;&nbsp; 8.java GC的原理.<br />
&nbsp;&nbsp;&nbsp; 9.mysql支持事务吗？mysql存储引擎有哪些？<br />
&nbsp;&nbsp;&nbsp; 10.数据库数据查找比较慢的时候，如何解决？<br />
&nbsp;&nbsp;&nbsp; 11.学生 课程 选课的一个sql语句书写<br />
&nbsp;&nbsp;&nbsp; 12.查找日志文件中某一个信息出现的次数<br />
&nbsp;&nbsp;&nbsp; 13.32位linux操作系统中，最多支持多少个线程？<br />
&nbsp;&nbsp;&nbsp; 14.关于TreeMap操作的<br />
&nbsp;&nbsp;&nbsp; 15.重写类A的equals和hascode方法。类A有个属性private B b；<br />
&nbsp;&nbsp;&nbsp; 16.实现一个mysql的sequence。<br />
<br />
下面是我的一点解答，也不知道对不对，现在的笔试要你白纸黑字写出这些东西真是难啊！<br />
<br />
<strong>1)cookie和session的作用以及他们的应用场合</strong><br />
两者都是记录用户访问网站信息，但他们的保持状态不同，cookie是采用客户端保持，而session是采用服务端保持，一般来说cookie不是很安全，因为别人可以分析本地的cookie进行cookie欺骗，考虑到安全的问题应该使用session，session是保持在服务端，但当访问增多时，会增加服务器的压力。<br />
在应用场合中，建议建用户登录，交易重要信息存放session，其他信息可以存放在cookie中，根据实际需求两者可以交替搭配使用。<br />
<br />
<strong>2)怎样让jvm加载一个Class的同时执行一段代码</strong><br />
使用Class.forName()动态加载类（题目中有"同时"，是否启用另一线程？）<br />
<br />
<strong>3)post和get区别</strong><br />
从http动词协议来看，get是从服务器获取数据，post是向服务器上传数据<br />
get方式会把数据出现在url中，post则不会<br />
get提交的数据有大小限制，post则无<br />
<br />
<strong>4)事务的属性有哪些？写出spring或jdbc管理事务的例子</strong><br />
有原子性，一致性，隔离性，持久性<br />
spring提供了丰富的事务模型，主要是针对jdbc事务，jta事务，还有一些自定义事务（如果有人能从一张白纸写出spring transaction的例子，那真是佩服之极）<br />
还是写一个简单jdbc事务<br />
try{<br />
class.forName("***");<br />
...<br />
conn=DriverManager.getConnection(url,user,password);<br />
conn.createStartement().executeUpdate("****");//更新操作<br />
conn.commit();//事务提交<br />
}catch(Exception e){<br />
..<br />
conn.rollback();//事务回滚<br />
..<br />
}<br />
<br />
<strong>5)实现一个高并发、高性能的hashmap。写出伪代码</strong><br />
什么叫做高性能，高并发的hashmap? 是要考hashmap的数据结构??<br />
<br />
<strong>6)解析一段xml，拼接成一个url</strong><br />
xml,url???这两者有什么联系吗?<br />
<br />
<strong>7)怎么解决并发？怎么解决集群环境下的并发?</strong><br />
（有很多点可以并发，web请求可以并发，数据库请求可以并发，怎么那么空泛）<br />
高并发最重要的还是考虑到锁的问题，如数据库该用表锁用表锁，该用排他锁用排它锁，程序中要注意非线程安全的问题<br />
高并发还有带来性能问题，缓存，负载均衡，这些看情况而定<br />
<br />
<strong>8)java GC的原理.</strong><br />
又来，不回答你<br />
<br />
<strong>9)mysql支持事务吗？mysql存储引擎有哪些？</strong><br />
支持，常用的是inndb和myisam<br />
<br />
<strong>10)数据库数据查找比较慢的时候，如何解决？</strong><br />
假如是mysql<br />
1.漏了索引,用explain看看查询语句是不是没使用索引或者索引使用有问题<br />
2.使用show processlist看看是不是有sql卡住了<br />
3.还有一种情况就是sql写得过于复杂，如goroupby，多表关联等等，使用desc来进行分析<br />
4.还有就是配置的问题，如key_buffer等参数，这个看文档吧<br />
5.最后一种就是机器负荷过高，调整结构来解决吧，比如使用mysql-proxy代理等等<br />
<br />
<strong>11)学生 课程 选课的一个sql语句书写</strong><br />
??<br />
<br />
<strong>12)查找日志文件中某一个信息出现的次数</strong><br />
cat 日志 | grep 信息 | wc -l<br />
<br />
<strong>13) 32位linux操作系统中，最多支持多少个线程？</strong><br />
上网查了，写得很复杂，附上文章<br />
http://www.517sou.net/Article/Linux-maximum-number-of-threads-and-the-maximum-number-of-processes.aspx<br />
<br />
<strong>14)关于TreeMap操作的</strong><br />
TreeMap就是一颗平衡排序二叉树，操作的。。后面是什么??<br />
<br />
<strong>15)重写类A的equals和hascode方法。类A有个属性private B b；</strong><br />
??<br />
<br />
<strong>16)实现一个mysql的sequence</strong><br />
mysql的last_insert_id()大致可以满足，如果不行就写触发器吧<br />
<br />
<img src ="http://www.blogjava.net/dongbule/aggbug/348723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-04-21 17:23 <a href="http://www.blogjava.net/dongbule/archive/2011/04/21/348723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在debian安装nfs-server出现的bug处理</title><link>http://www.blogjava.net/dongbule/archive/2011/04/06/347718.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Wed, 06 Apr 2011 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/04/06/347718.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/347718.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/04/06/347718.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/347718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/347718.html</trackback:ping><description><![CDATA[<br />
<a id="viewpost1_TitleUrl" href="../archive/2011/04/06/347716.html">nfs安装与配置（debian）</a><br />
好吧，这个错误浪费了我今天几个小时的时间，必须把它记录下来。<br />
问题是这样的，在启动更新了portmap，exportfs，一些没问题后，在做/etc/init.d/nfs-kernel-server restart 出现<br />
<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;">/etc/init.d/nfs-kernel-server&nbsp;start<br />
Exporting&nbsp;directories&nbsp;for&nbsp;NFS&nbsp;kernel&nbsp;daemon<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />exportfs:&nbsp;/etc/exports&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">1</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">:<br />
Neither&nbsp;'subtree_check'&nbsp;or&nbsp;'no_subtree_check'&nbsp;specified&nbsp;for&nbsp;export<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">foobar</span><span style="color: #000000;">"</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;Assuming&nbsp;default&nbsp;behaviour&nbsp;('no_subtree_check').<br />
&nbsp;&nbsp;NOTE:&nbsp;this&nbsp;default&nbsp;has&nbsp;changed&nbsp;since&nbsp;nfs-utils&nbsp;version&nbsp;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">.x<br />
<br />
.<br />
Starting&nbsp;NFS&nbsp;kernel&nbsp;daemon:&nbsp;nfsd<br />
Not&nbsp;starting:&nbsp;portmap&nbsp;daemon&nbsp;is&nbsp;not&nbsp;running&nbsp;(warning).</span></div>
<br />
<br />
警告提示portmap is not running<br />
<br />
好吧，检查一下portmap<br />
<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;">/home/mnt/index#&nbsp;ps&nbsp;aux&nbsp;|&nbsp;grep&nbsp;portmap<br />
daemon&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">31478</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">0.0</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">0.0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2052</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">624</span><span style="color: #000000;">&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ss&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">:</span><span style="color: #000000;">59</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;">&nbsp;/sbin/portmap</span></div>
<br />
<br />
portmap的状态已经是running，在googling后，发现网上有人说是<br />
This is the problem, portmap is not actually running, causing rpc.statd<br />
<br />
看来问题还是出现rpc上，最主要的进程rpc.mountd无法启动<br />
<br />
好吧，接下来打开/etc/init.d/nfs-kernel-server这个启动脚本进行查看<br />
<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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;See&nbsp;if&nbsp;portmap&nbsp;or&nbsp;rpcbind&nbsp;are&nbsp;running<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cat&nbsp;&lt;/dev/null&nbsp;&gt;/dev/tcp/localhost/</span><span style="color: #000000;">111</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&gt;/dev/null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET</span><span style="color: #000000;">=</span><span style="color: #000000;">$?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;$RET&nbsp;!=&nbsp;0&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #008000;">;</span><span style="color: #008000;">&nbsp;then</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_warning_msg&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Not&nbsp;starting:&nbsp;portmap&nbsp;daemon&nbsp;is&nbsp;not&nbsp;running</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi</span></div>
<br />
<br />
看来问题就出来这个，什么叫&#8220;/dev/tcp/localhost/111&#8221;，还是googling，网上有人说<br />
<br />
I find that this is a bashism, but the init-script is marked as a bash script at the<br />
top:<br />
!/bin/bash<br />
再man Bash，发现<br />
Bash, as packaged for Debian, does not support using the /dev/tcp and /dev/udp files<br />
<br />
应该很清楚了，如果按照这里的分析，那么我们需要对上面的这个启动脚本进行一下修改就可以完成我们的目的，最直接的就是把exit 0注释掉，另外说一点，这个脚本也有些写得不大合理，既然是log_warning_msg，一个warning，就不应该直接的exit 0<br />
<br />
<br />
<img src ="http://www.blogjava.net/dongbule/aggbug/347718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-04-06 17:13 <a href="http://www.blogjava.net/dongbule/archive/2011/04/06/347718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nfs安装与配置（debian）</title><link>http://www.blogjava.net/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.blogjava.net/dongbule/archive/2011/04/06/347716.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/347716.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/04/06/347716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/347716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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 />
portmap： 192.168.0.<br />
lockd：&nbsp;&nbsp; 192.168.0.<br />
rquotad： 192.168.0.<br />
mountd：&nbsp; 192.168.0.<br />
statd：&nbsp;&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&nbsp;&nbsp; 重启portmap daemon<br />
<br />
vi /etc/exports<br />
/home/zp/share&nbsp; 220.181.8.*(rw,sync,no_root_squash)&nbsp;&nbsp; 若更改了/etc/exports， 运行 $sudo exportfs -r 更新<br />
<br />
/etc/init.d/nfs-kernel-server restart &nbsp;<br />
（可以到/var/log/messages里面查看是否正确激活）<br />
<br />
showmount -e ip&nbsp; 查看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 挂起<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&nbsp; 挂起<br />
<br />
umount /home/mnt 撤销
<img src ="http://www.blogjava.net/dongbule/aggbug/347716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-04-06 17:09 <a href="http://www.blogjava.net/dongbule/archive/2011/04/06/347716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>房产地图google map的初步应用点滴.3)</title><link>http://www.blogjava.net/dongbule/archive/2011/03/30/347304.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Wed, 30 Mar 2011 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/03/30/347304.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/347304.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/03/30/347304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/347304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/347304.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3)房产地图google map的初步应用点滴.4)google Map的交互基本都是事件驱动的，这表示js是通过生成时间来响应交互的，并且处于监听我们设定的事件，每个 Google Maps API 对象都可导出大量已命名的事件。如果程序想要...&nbsp;&nbsp;<a href='http://www.blogjava.net/dongbule/archive/2011/03/30/347304.html'>阅读全文</a><img src ="http://www.blogjava.net/dongbule/aggbug/347304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-03-30 16:58 <a href="http://www.blogjava.net/dongbule/archive/2011/03/30/347304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装配置整理之 dstat</title><link>http://www.blogjava.net/dongbule/archive/2011/03/24/346966.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Thu, 24 Mar 2011 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/03/24/346966.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/346966.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/03/24/346966.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/346966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/346966.html</trackback:ping><description><![CDATA[在微博看到介绍的一款linux系统信息神器，dstat，收藏一下<br />
<br />
dstat可以直接可直接替换vmstat, iostat, netstat ,nfsstat, ifstat等系统工具，监控cpu、disk 、mem、load、interrupt、net、proc、CS.... <br />
<br />
<strong>安装 </strong><br />
wget http://rpmforge.sw.be/redhat/7.3/en/i386/rpmforge/RPMS/dstat-0.6.9-1.rh7.rf.noarch.rpm<br />
rpm -ivh dstat-0.6.9-1.rh7.rf.noarch.rpm<br />
or<br />
apt-get install dstat<br />
yum install dstat<br />
<br />
安装很简单就完成，先看看help<br />
<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;">tech163:/usr/local/download#&nbsp;dstat&nbsp;--help<br />
Usage:&nbsp;dstat&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">-afv</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">options..</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">delay&nbsp;[count</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">]<br />
Versatile&nbsp;tool&nbsp;for&nbsp;generating&nbsp;system&nbsp;resource&nbsp;statistics<br />
<br />
Dstat&nbsp;options:<br />
&nbsp;&nbsp;-c</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--cpu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;cpu&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-C&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;cpu0</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;cpu3&nbsp;and&nbsp;total<br />
&nbsp;&nbsp;-d</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--disk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;disk&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-D&nbsp;total</span><span style="color: #000000;">,</span><span style="color: #000000;">hda&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;hda&nbsp;and&nbsp;total<br />
&nbsp;&nbsp;-g</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;page&nbsp;stats<br />
&nbsp;&nbsp;-i</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;interrupt&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-I&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">eth2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;int5&nbsp;and&nbsp;interrupt&nbsp;used&nbsp;by&nbsp;eth2<br />
&nbsp;&nbsp;-l</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--load&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;load&nbsp;stats<br />
&nbsp;&nbsp;-m</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;memory&nbsp;stats<br />
&nbsp;&nbsp;-n</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--net&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;network&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-N&nbsp;eth1</span><span style="color: #000000;">,</span><span style="color: #000000;">total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;eth1&nbsp;and&nbsp;total<br />
&nbsp;&nbsp;-p</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--proc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;process&nbsp;stats<br />
&nbsp;&nbsp;-s</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--swap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;swap&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-S&nbsp;swap1</span><span style="color: #000000;">,</span><span style="color: #000000;">total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;swap1&nbsp;and&nbsp;total<br />
&nbsp;&nbsp;-t</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;time/date&nbsp;output<br />
&nbsp;&nbsp;-T</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--epoch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;time&nbsp;counter&nbsp;(seconds&nbsp;since&nbsp;epoch)<br />
&nbsp;&nbsp;-y</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;system&nbsp;stats<br />
&nbsp;&nbsp;--ipc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;ipc&nbsp;stats<br />
&nbsp;&nbsp;--lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;lock&nbsp;stats<br />
&nbsp;&nbsp;--raw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;raw&nbsp;stats<br />
&nbsp;&nbsp;--tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;tcp&nbsp;stats<br />
&nbsp;&nbsp;--udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;udp&nbsp;stats<br />
&nbsp;&nbsp;--unix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;unix&nbsp;stats<br />
<br />
&nbsp;&nbsp;-M&nbsp;stat1</span><span style="color: #000000;">,</span><span style="color: #000000;">stat2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;external&nbsp;stats<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--mods&nbsp;stat1</span><span style="color: #000000;">,</span><span style="color: #000000;">stat2<br />
<br />
&nbsp;&nbsp;-a</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals&nbsp;-cdngy&nbsp;(default)<br />
&nbsp;&nbsp;-f</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--full&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expand&nbsp;-C</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;-D</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;-I</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;-N&nbsp;and&nbsp;-S&nbsp;discovery&nbsp;lists<br />
&nbsp;&nbsp;-v</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;--vmstat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals&nbsp;-pmgdsc&nbsp;-D&nbsp;total<br />
<br />
&nbsp;&nbsp;--integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show&nbsp;integer&nbsp;values<br />
&nbsp;&nbsp;--nocolor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disable&nbsp;colors&nbsp;(implies&nbsp;--noupdate)<br />
&nbsp;&nbsp;--noheaders&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disable&nbsp;repetitive&nbsp;headers<br />
&nbsp;&nbsp;--noupdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disable&nbsp;intermediate&nbsp;updates<br />
&nbsp;&nbsp;--output&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write&nbsp;CSV&nbsp;output&nbsp;to&nbsp;file<br />
<br />
&nbsp;&nbsp;delay&nbsp;is&nbsp;the&nbsp;delay&nbsp;in&nbsp;seconds&nbsp;between&nbsp;each&nbsp;update<br />
&nbsp;&nbsp;count&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;updates&nbsp;to&nbsp;display&nbsp;before&nbsp;exiting<br />
&nbsp;&nbsp;The&nbsp;default&nbsp;delay&nbsp;is&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;and&nbsp;count&nbsp;is&nbsp;unspecified&nbsp;(unlimited)</span></div>
<br />
当执行dstat命令时，默认它会收集cpu，disk，net，paging，system等数据，并且每秒收集一次<br />
看一下我们常用的参数<br />
<br />
-c, --cpu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable cpu stats 显示cpu的情况<br />
-d, --disk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable disk stats 显示硬盘的情况<br />
-l, --load&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable load stats 显示系统的负载情况<br />
-m, --mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable memory stats 显示内存的情况<br />
-n, --net&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable network stats 显示网络的情况<br />
-p, --proc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable process stats 显示进程的情况<br />
-s, --swap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable swap stats 显示swap的情况<br />
-y, --sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable system stats 显示系统的情况<br />
--output file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write CSV output to file 写到csv文件中<br />
<br />
默认情况下dstat是每秒钟就收集数据一次，可以修改一下让它每30秒收集一次<br />
<br />
dstat -cdlmnpsy 30<br />
<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;">----total-cpu-usage----&nbsp;-dsk/total-&nbsp;---load-avg---&nbsp;------memory-usage-----&nbsp;-net/total-&nbsp;---procs---&nbsp;-swp/total-&nbsp;---system--<br />
usr&nbsp;sys&nbsp;idl&nbsp;wai&nbsp;hiq&nbsp;siq|&nbsp;read&nbsp;&nbsp;writ|&nbsp;1m&nbsp;&nbsp;&nbsp;5m&nbsp;&nbsp;15m&nbsp;|&nbsp;used&nbsp;&nbsp;buff&nbsp;&nbsp;cach&nbsp;&nbsp;free|&nbsp;recv&nbsp;&nbsp;send|run&nbsp;blk&nbsp;new|&nbsp;used&nbsp;&nbsp;free|&nbsp;int&nbsp;&nbsp;&nbsp;csw&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;121B&nbsp;4116B|&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;&nbsp;79M&nbsp;&nbsp;156M&nbsp;&nbsp;176M&nbsp;&nbsp;101M|&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;|&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;504k&nbsp;1024M|&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">19</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;8875B|&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;&nbsp;79M&nbsp;&nbsp;156M&nbsp;&nbsp;176M&nbsp;&nbsp;101M|1256B&nbsp;1140B|&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">|&nbsp;504k&nbsp;1024M|&nbsp;&nbsp;</span><span style="color: #000000;">31</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">31</span><span style="color: #000000;"> <br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/dongbule/aggbug/346966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-03-24 17:15 <a href="http://www.blogjava.net/dongbule/archive/2011/03/24/346966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>房产地图google map的初步应用点滴.2)</title><link>http://www.blogjava.net/dongbule/archive/2011/03/05/345786.html</link><dc:creator>陈于喆</dc:creator><author>陈于喆</author><pubDate>Sat, 05 Mar 2011 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/dongbule/archive/2011/03/05/345786.html</guid><wfw:comment>http://www.blogjava.net/dongbule/comments/345786.html</wfw:comment><comments>http://www.blogjava.net/dongbule/archive/2011/03/05/345786.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dongbule/comments/commentRss/345786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongbule/services/trackbacks/345786.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3)房产地图google map的初步应用点滴.4)本来是想将房产地图google map的应用记录一个系列，但继1)记录完之后总找不到时间继续记录下去，1)中主要解决了Google Maps JavaScript API V3 与 Googl...&nbsp;&nbsp;<a href='http://www.blogjava.net/dongbule/archive/2011/03/05/345786.html'>阅读全文</a><img src ="http://www.blogjava.net/dongbule/aggbug/345786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongbule/" target="_blank">陈于喆</a> 2011-03-05 16:02 <a href="http://www.blogjava.net/dongbule/archive/2011/03/05/345786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>