少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #

          工廠方法模式:
          一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。
          一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
          每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。

          抽象工廠模式:
          多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。
          一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。
          每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。

          區(qū)別:
          工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。
          工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。



          工廠方法模式: 一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。 每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。 抽象工廠模式: 多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。 區(qū)別: 工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。 工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。


          GOF《設(shè)計(jì)模式》寫(xiě)的很清楚,工廠方法是由子類自行決定實(shí)例化那個(gè)類,而抽象工廠是自己決定實(shí)例化哪個(gè)類。至于是組合還是繼承還是實(shí)現(xiàn)接口都無(wú)所謂。根本區(qū)別在于是自己實(shí)例化還是子類實(shí)例化。
          posted @ 2014-12-28 22:06 abin 閱讀(1814) | 評(píng)論 (0)編輯 收藏

              在jvm中堆空間劃分為三個(gè)代:年輕代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation)。年輕代和年老代是存儲(chǔ)動(dòng)態(tài)產(chǎn)生的對(duì)象。永久帶主要是存儲(chǔ)的是java的類信息,包括解析得到的方法、屬性、字段等等。永久帶基本不參與垃圾回收。我們這里討論的垃圾回收主要是針對(duì)年輕代和年老代。具體如下圖。



          年輕代又分成3個(gè)部分,一個(gè)eden區(qū)和兩個(gè)相同的survior區(qū)。剛開(kāi)始創(chuàng)建的對(duì)象都是放置在eden區(qū)的。分成這樣3個(gè)部分,主要是為了生命周期短的對(duì)象盡量留在年輕帶。當(dāng)eden區(qū)申請(qǐng)不到空間的時(shí)候,進(jìn)行minorGC,把存活的對(duì)象拷貝到survior。年老代主要存放生命周期比較長(zhǎng)的對(duì)象,比如緩存對(duì)象。具體jvm內(nèi)存回收過(guò)程描述如下(可以結(jié)合上圖):

          1、對(duì)象在Eden區(qū)完成內(nèi)存分配
          2、當(dāng)Eden區(qū)滿了,再創(chuàng)建對(duì)象,會(huì)因?yàn)樯暾?qǐng)不到空間,觸發(fā)minorGC,進(jìn)行young(eden+1survivor)區(qū)的垃圾回收
          3、minorGC時(shí),Eden不能被回收的對(duì)象被放入到空的survivor(Eden肯定會(huì)被清空),另一個(gè)survivor里不能被GC回收的對(duì)象也會(huì)被放入這個(gè)survivor,始終保證一個(gè)survivor是空的
          4、當(dāng)做第3步的時(shí)候,如果發(fā)現(xiàn)survivor滿了,則這些對(duì)象被copy到old區(qū),或者survivor并沒(méi)有滿,但是有些對(duì)象已經(jīng)足夠Old,也被放入Old區(qū) XX:MaxTenuringThreshold
          5、當(dāng)Old區(qū)被放滿的之后,進(jìn)行fullGC

          在知道垃圾回收機(jī)制以后,大家可以在對(duì)jvm中堆的各個(gè)參數(shù)進(jìn)行優(yōu)化設(shè)置,來(lái)提高性能。









          posted @ 2014-12-24 23:41 abin 閱讀(415) | 評(píng)論 (0)編輯 收藏

              哈希(hash)是一種非??斓牟檎曳椒ǎ话闱闆r下查找的時(shí)間復(fù)雜度為O(1)。常用于連接(join)操作,如SQL Server和Oracle中的哈希連接(hash join)。但是SQL Server和Oracle等常見(jiàn)的數(shù)據(jù)庫(kù)并不支持哈希索引(hash index)。MySQL的Heap存儲(chǔ)引擎默認(rèn)的索引類型為哈希,而InnoDB存儲(chǔ)引擎提出了另一種實(shí)現(xiàn)方法,自適應(yīng)哈希索引(adaptive hash index)。

          InnoDB存儲(chǔ)引擎會(huì)監(jiān)控對(duì)表上索引的查找,如果觀察到建立哈希索引可以帶來(lái)速度的提升,則建立哈希索引,所以稱之為自適應(yīng)(adaptive)的。自適應(yīng)哈希索引通過(guò)緩沖池的B+樹(shù)構(gòu)造而來(lái),因此建立的速度很快。而且不需要將整個(gè)表都建哈希索引,InnoDB存儲(chǔ)引擎會(huì)自動(dòng)根據(jù)訪問(wèn)的頻率和模式來(lái)為某些頁(yè)建立哈希索引。

          根據(jù)InnoDB的官方文檔顯示,啟用自適應(yīng)哈希索引后,讀取和寫(xiě)入速度可以提高2倍;對(duì)于輔助索引的連接操作,性能可以提高5倍。在我看來(lái),自適應(yīng)哈希索引是非常好的優(yōu)化模式,其設(shè)計(jì)思想是數(shù)據(jù)庫(kù)自優(yōu)化(self-tuning),即無(wú)需DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)整。

          通過(guò)命令SHOW ENGINE INNODB STATUS可以看到當(dāng)前自適應(yīng)哈希索引的使用狀況,如下所示:

          1. mysql> show engine innodb status\G;  
          2. *************************** 1. row ***************************  
          3. Status:   
          4. =====================================  
          5. 090922 11:52:51 INNODB MONITOR OUTPUT 
          6. =====================================  
          7. Per second averages calculated from the last 15 seconds  
          8. ......  
          9. -------------------------------------  
          10. INSERT BUFFER AND ADAPTIVE HASH INDEX  
          11. -------------------------------------  
          12. Ibuf: size 2249, free list len 3346, seg size 5596,  
          13. 374650 inserts, 51897 merged recs, 14300 merges  
          14. Hash table size 4980499, node heap has 1246 buffer(s)  
          15. 1640.60 hash searches/s, 3709.46 non-hash searches/s  
          16. ...... 

          現(xiàn)在可以看到自適應(yīng)哈希索引的使用信息了,包括自適應(yīng)哈希索引的大小、使用情況、每秒使用自適應(yīng)哈希索引搜索的情況。值得注意的是,哈希索引只能用來(lái)搜索等值的查詢,如select * from table where index_col = 'xxx',而對(duì)于其他查找類型,如范圍查找,是不能使用的。因此,這里出現(xiàn)了non-hash searches/s的情況。用hash searches : non-hash searches命令可以大概了解使用哈希索引后的效率。

          由于自適應(yīng)哈希索引是由InnoDB存儲(chǔ)引擎控制的,所以這里的信息只供我們參考。不過(guò)我們可以通過(guò)參數(shù)innodb_adaptive_hash_index來(lái)禁用或啟動(dòng)此特性,默認(rèn)為開(kāi)啟。

           

           

          轉(zhuǎn)自http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html

          posted @ 2014-12-24 18:25 abin 閱讀(1179) | 評(píng)論 (0)編輯 收藏

          通過(guò)什么方法來(lái)排查是否linux服務(wù)器的負(fù)載過(guò)大?

          通過(guò)top命令來(lái)查看服務(wù)器負(fù)載

           再對(duì)此Linux服務(wù)器性能分析之前,先了解下Linux系統(tǒng)Load average負(fù)載的知識(shí),負(fù)載均值在uptime 或者top 命令中可以看到,它們可能會(huì)顯示成這個(gè)樣子:load average: 0.15, 0.14, 0.11
          很多人會(huì)這樣理解負(fù)載均值:三個(gè)數(shù)分別代表不同時(shí)間段的系統(tǒng)平均負(fù)載(一分鐘、五分鐘、以及十五分鐘),它們的數(shù)字當(dāng)然是越小越好。數(shù)字越高,說(shuō)明服務(wù)器的負(fù)載越大,這也可能是服務(wù)器出現(xiàn)某種問(wèn)題的信號(hào)。

               一個(gè)單核的處理器可以形象得比喻成一條單車道。如果前面沒(méi)有車輛在等待,那么你可以告訴后面的司機(jī)通過(guò)。如果車輛眾多,那么需要告知他們可能需要稍等一會(huì)。

          因此,需要些特定的代號(hào)表示目前的車流情況,例如:
            0.00 表示目前橋面上沒(méi)有任何的車流。實(shí)際上這種情況與0.00 和1.00 之間是相同的,總而言之很通暢,過(guò)往的車輛可以絲毫不用等待的通過(guò)。
            1.00 表示剛好是在這座橋的承受范圍內(nèi)。這種情況不算糟糕,只是車流會(huì)有些堵,不過(guò)這種情況可能會(huì)造成交通越來(lái)越慢。
            超過(guò)1.00,那么說(shuō)明這座橋已經(jīng)超出負(fù)荷,交通嚴(yán)重的擁堵。那么情況有多糟糕?例如2.00 的情況說(shuō)明車流已經(jīng)超出了橋所能承受的一倍,那么將有多余過(guò)橋一倍的車輛正在焦急的等待。3.00 的話情況就更不妙了,說(shuō)明這座橋基本上已經(jīng)快承受不了,還有超出橋負(fù)載兩倍多的車輛正在等待。
              上面的情況和處理器的負(fù)載情況非常相似。一輛汽車的過(guò)橋時(shí)間就好比是處理器處理某線程的實(shí)際時(shí)間。Unix 系統(tǒng)定義的進(jìn)程運(yùn)行時(shí)長(zhǎng)為所有處理器內(nèi)核的處理時(shí)間加上線程在隊(duì)列中等待的時(shí)間。
              和收過(guò)橋費(fèi)的管理員一樣,你當(dāng)然希望你的汽車(操作)不會(huì)被焦急的等待。所以,理想狀態(tài)下,都希望負(fù)載平均值小于1.00 。當(dāng)然不排除部分峰值會(huì)超過(guò)1.00,但長(zhǎng)此以往保持這個(gè)狀態(tài),就說(shuō)明會(huì)有問(wèn)題,這時(shí)候你應(yīng)該會(huì)很焦急。
                “所以你說(shuō)的理想負(fù)荷為1.00 ?”
              嗯,這種情況其實(shí)并不完全正確。負(fù)荷1.00 說(shuō)明系統(tǒng)已經(jīng)沒(méi)有剩余的資源了。在實(shí)際情況中,有經(jīng)驗(yàn)的系統(tǒng)管理員都會(huì)將這條線劃在0.70:
                “需要進(jìn)行調(diào)查法則”:如果長(zhǎng)期你的系統(tǒng)負(fù)載在0.70 上下,那么你需要在事情變得更糟糕之前,花些時(shí)間了解其原因。
                “現(xiàn)在就要修復(fù)法則”:1.00 。如果你的服務(wù)器系統(tǒng)負(fù)載長(zhǎng)期徘徊于1.00,那么就應(yīng)該馬上解決這個(gè)問(wèn)題。否則,你將半夜接到你上司的電話,這可不是件令人愉快的事情。
                “凌晨三點(diǎn)半鍛煉身體法則”:5.00。如果你的服務(wù)器負(fù)載超過(guò)了5.00 這個(gè)數(shù)字,那么你將失去你的睡眠,還得在會(huì)議中說(shuō)明這情況發(fā)生的原因,總之千萬(wàn)不要讓它發(fā)生。
              那么多個(gè)處理器呢?我的均值是3.00,但是系統(tǒng)運(yùn)行正常!哇喔,你有四個(gè)處理器的主機(jī)?那么它的負(fù)載均值在3.00 是很正常的。在多處理器系統(tǒng)中,負(fù)載均值是基于內(nèi)核的數(shù)量決定的。以100% 負(fù)載計(jì)算,1.00 表示單個(gè)處理器,而2.00 則說(shuō)明有兩個(gè)雙處理器,那么4.00 就說(shuō)明主機(jī)具有四個(gè)處理器。
            回到我們上面有關(guān)車輛過(guò)橋的比喻。1.00 我說(shuō)過(guò)是“一條單車道的道路”。那么在單車道1.00 情況中,說(shuō)明這橋梁已經(jīng)被車塞滿了。而在雙處理器系統(tǒng)中,這意味著多出了一倍的負(fù)載,也就是說(shuō)還有50% 的剩余系統(tǒng)資源- 因?yàn)檫€有另外條車道可以通行。
          所以,單處理器已經(jīng)在負(fù)載的情況下,雙處理器的負(fù)載滿額的情況是2.00,它還有一倍的資源可以利用。
           

          從上圖的top命令可以了解到,Linux服務(wù)器運(yùn)行了5天23小時(shí)20分,在load average的數(shù)據(jù)來(lái)看,這臺(tái)快吧Linux無(wú)盤(pán)服務(wù)器可以說(shuō)是壓力為零,運(yùn)行十分流暢。 

          方法二:輸入iostat -x -k -t 

          說(shuō)明:%util:一秒中有百分之多少的時(shí)間用于I/O操作,或者說(shuō)一秒中有多少時(shí)間I/O隊(duì)列是非空的。
          即delta(use)/s/1000 (因?yàn)閡se的單位為毫秒)
          如果%util接近100%,說(shuō)明產(chǎn)生的I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷,該磁盤(pán)可能存在瓶頸。

          方法三:

          如果玩游戲很卡,可以用hdparm –t /dev/磁盤(pán)名稱來(lái)測(cè)試磁盤(pán)性能是否達(dá)標(biāo),下圖是單個(gè)希捷1T的盤(pán)測(cè)試的結(jié)果說(shuō)明:sd表示硬盤(pán)是SATA,SCSI或者SAS,a表示串口的第一塊硬盤(pán)

           本文轉(zhuǎn)摘自:http://www.flybaaa.com/help/69_1.html



           

          一直以來(lái)以為通過(guò)top然后按數(shù)字1鍵,查到的cpu個(gè)數(shù)是服務(wù)器的物理cpu個(gè)數(shù),今天在看服務(wù)器的硬件配置清單中發(fā)現(xiàn)一服務(wù)器的物理cpu個(gè)數(shù)是4個(gè),我就奇怪了,這臺(tái)機(jī)子我的影響很深,明明是48啊,當(dāng)時(shí)通過(guò)top 1查看cpu信息還提示 “Sorry ,terminal is not big enough”。想當(dāng)初服務(wù)器只能識(shí)別到32個(gè)。還是重新編譯內(nèi)核搞定的。后來(lái)經(jīng)過(guò)查詢?cè)瓉?lái)不是這樣滴,top 1查看的是邏輯cpu個(gè)數(shù),一下為記。
          查看Linux服務(wù)器的CPU詳細(xì)情況
          判斷Linux服務(wù)器CPU情況的依據(jù)如下:
          具有相同core id的CPU是同一個(gè)core的超線程。(Any cpu with the same core id are hyperthreads in the same core.)
          具有相同physical id的CPU是同一個(gè)CPU封裝的線程或核心。(Any cpu with the same physical id are threads or cores in the same physical socket.)
          下面舉例說(shuō)明。
          物理CPU個(gè)數(shù)如下:

          [root@dbabc.net ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 4

          每個(gè)物理CPU中core的個(gè)數(shù)(即核數(shù))如下:

          [root@dbabc.net ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq cpu cores       : 12

          邏輯CPU的個(gè)數(shù)如下:

          [root@dbabc.net ~]#cat /proc/cpuinfo| grep "processor"| wc -l 48

          按理說(shuō)物理CPU個(gè)數(shù)×核數(shù)就應(yīng)該等于邏輯CPU的


          Dbabc.Net [http://dbabc.net]
          本文鏈接:http://dbabc.net/archives/2012/02/13/linux-cpu-info-count.shtml

          posted @ 2014-12-24 13:34 abin 閱讀(483) | 評(píng)論 (0)編輯 收藏

          JVM在裝載class文件的時(shí)候,會(huì)有一步是將符號(hào)引用解析為直接引用的過(guò)程。

          那么這里的直接引用到底是什么呢?

          對(duì)于指向“類型”【Class對(duì)象】、類變量、類方法的直接引用可能是指向方法區(qū)的本地指針。

          指向?qū)嵗兞?、?shí)例方法的直接引用都是偏移量實(shí)例變量的直接引用可能是從對(duì)象的映像開(kāi)始算起到這個(gè)實(shí)例變量位置的偏移量。實(shí)例方法的直接引用可能是方法表的偏移量。

          在《深入java虛擬機(jī)》書(shū)的第197頁(yè)我們可以看到,子類中方法表的偏移量和父類中的方法表的偏移量是一致的。比如說(shuō)父類中有一個(gè)say()方法的偏移量是7,那么子類中say方法的偏移量也是7。

          書(shū)中第199頁(yè)說(shuō),通過(guò)“接口引用”來(lái)調(diào)用一個(gè)方法,jvm必須搜索對(duì)象的類的方法表才能找到一個(gè)合適的方法。這是因?yàn)?span style="background-color: #ffccff;">實(shí)現(xiàn)同一個(gè)接口的這些類中,不一定所有的接口中的方法在類方法區(qū)中的偏移量都是一樣的。他們有可能會(huì)不一樣。這樣的話可能就要搜索方法表才能確認(rèn)要調(diào)用的方法在哪里。

          而通過(guò)“類引用”來(lái)調(diào)用一個(gè)方法的時(shí)候,直接通過(guò)偏移量就可以找到要調(diào)用的方法的位置了。【因?yàn)樽宇愔械姆椒ǖ钠屏扛割愔械钠屏渴且恢碌摹?/span>

          所以,通過(guò)接口引用調(diào)用方法會(huì)比類引用慢一些。

          下面介紹下什么是接口引用。

          interface A{void say();}

          class B implements A{}

          class C{public static void main(String []s){A a=new B();a.say()}}

          在上面的第三行代碼中,就是用“接口引用”來(lái)調(diào)用方法。

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

          符號(hào)引用:

          符號(hào)引用是一個(gè)字符串,它給出了被引用的內(nèi)容的名字并且可能會(huì)包含一些其他關(guān)于這個(gè)被引用項(xiàng)的信息——這些信息必須足以唯一的識(shí)別一個(gè)類、字段、方法。這樣,對(duì)于其他類的符號(hào)引用必須給出類的全名。對(duì)于其他類的字段,必須給出類名、字段名以及字段描述符。對(duì)于其他類的方法的引用必須給出類名、方法名以及方法的描述符。



          總結(jié):JVM對(duì)于直接引用和符號(hào)引用的處理是有區(qū)別的,可以看到符號(hào)引用時(shí),JVM將使用StringBuilder來(lái)完成字符串的  添加,而直接引用時(shí)則直接使用String來(lái)完成;直接引用永遠(yuǎn)比符號(hào)引用效率更快,但實(shí)際應(yīng)用開(kāi)發(fā)中不可能全用直接引用,要提高效能可以考慮按虛擬機(jī)的思維來(lái)編寫(xiě)你的程序。

          1.0 直接引用:

          public class StringAndStringBuilder{
             public static void main(String[] args){    
                 System.out.println ("s=" + "asdfa");
             }
          }

          反編譯后的:

          F:\java\res\字節(jié)碼>javap -c StringAndStringBuilder
          Compiled from "StringAndStringBuilder.java"
          public class StringAndStringBuilder extends java.lang.Object{
          public StringAndStringBuilder();
            Code:
             0:   aload_0
             1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
             4:   return

          public static void main(java.lang.String[]);
            Code:
             0:   ldc     #2; //String asdfa
             2:   astore_1
             3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
             6:   ldc     #4; //String s=asdfa
             8:   invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
          ing;)V
             11:  return

          }

           

          2.0 符號(hào)引用:

          public class StringAndStringBuilder{
             public static void main(String[] args){    
                String s="asdfa";
                  System.out.println ("s=" + s);
             }
          }

          反編譯后的:

          F:\java\res\字節(jié)碼>javap -c StringAndStringBuilder
          Compiled from "StringAndStringBuilder.java"
          public class StringAndStringBuilder extends java.lang.Object{
          public StringAndStringBuilder();
            Code:
             0:   aload_0
             1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
             4:   return

          public static void main(java.lang.String[]);
            Code:
             0:   ldc     #2; //String asdfa
             2:   astore_1
             3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
             6:   new     #4; //class java/lang/StringBuilder
             9:   dup
             10:  invokespecial   #5; //Method java/lang/StringBuilder."<init>":()V
             13:  ldc     #6; //String s=
             15:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
          String;)Ljava/lang/StringBuilder;
             18:  aload_1
             19:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
          String;)Ljava/lang/StringBuilder;
             22:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
          ng/String;
             25:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/Str
          ing;)V
             28:  return

          }


          posted @ 2014-12-16 20:14 abin 閱讀(1892) | 評(píng)論 (0)編輯 收藏

          MySQL 的默認(rèn)設(shè)置下,當(dāng)一個(gè)連接的空閑時(shí)間超過(guò)8小時(shí)后,MySQL 就會(huì)斷開(kāi)該連接,而 c3p0 連接池則以為該被斷開(kāi)的連接依然有效。在這種情況下,如果客戶端代碼向 c3p0 連接池請(qǐng)求連接的話,連接池就會(huì)把已經(jīng)失效的連接返回給客戶端,客戶端在使用該失效連接的時(shí)候即拋出異常。
          解決這個(gè)問(wèn)題的辦法有三種:
          1. 增加 MySQL 的 wait_timeout 屬性的值。
          修改 /etc/mysql/my.cnf 文件,在 [mysqld] 節(jié)中設(shè)置:
          # Set a connection to wait 8 hours in idle status.
          wait_timeout 
          = 86400
          2. 減少連接池內(nèi)連接的生存周期,使之小于上一項(xiàng)中所設(shè)置的 wait_timeout 的值。
          修改 c3p0 的配置文件,設(shè)置:
          # How long to keep unused connections around(in seconds)
          # Note: MySQL times out idle connections after 
          8 hours(28,800 seconds)
          # so ensure this value is below MySQL idle timeout
          cpool.maxIdleTime
          =25200
          在 Spring 的配置文件中:
          <bean id="dataSource"
              class
          ="com.mchange.v2.c3p0.ComboPooledDataSource">
              
          <property name="maxIdleTime" value="${cpool.maxIdleTime}" />
              
          <!-- other properties -->
          </bean>
          3. 定期使用連接池內(nèi)的連接,使得它們不會(huì)因?yàn)殚e置超時(shí)而被 MySQL 斷開(kāi)。
          修改 c3p0 的配置文件,設(shè)置:
          # Prevent MySQL raise exception after a long idle time
          cpool.preferredTestQuery
          ='SELECT 1'
          cpool.idleConnectionTestPeriod
          =18000
          cpool.testConnectionOnCheckout
          =true
          修改 Spring 的配置文件:
          <bean id="dataSource"
              class
          ="com.mchange.v2.c3p0.ComboPooledDataSource">
              
          <property name="preferredTestQuery"
                  value
          ="${cpool.preferredTestQuery}" />
              
          <property name="idleConnectionTestPeriod"
                  value
          ="${cpool.idleConnectionTestPeriod}" />
              
          <property name="testConnectionOnCheckout"
                  value
          ="${cpool.testConnectionOnCheckout}" />
              
          <!-- other properties -->
          </bean>

          附:以下 awk 腳本可以用以將 c3p0.properties 文件中的屬性設(shè)置轉(zhuǎn)換成為 applicationContext.xml 中 數(shù)據(jù)庫(kù)連接池 DataSource 所需的 XML 元素形式。
          #!/bin/awk

          BEGIN {
              FS
          ="=";
          }
          {
              
          if (NF == 2) {
                  
          if ((x=index($1, ".")) > 0) {
                      property_name 
          = substr($1, x+1, length($1));
                  } 
          else {
                      property_name 
          = $1;
                  }
                  printf
          ("<property name="%s" value="${%s}"/> ", property_name, $1);
              }
          }
          posted @ 2014-12-15 20:15 abin 閱讀(750) | 評(píng)論 (0)編輯 收藏

           java.lang.OutOfMemoryError: unable to create new native thread
          引發(fā)此問(wèn)題的原因有兩個(gè):

          1.線程數(shù)超過(guò)了操作系統(tǒng)的限制。

          * 使用top命令查看系統(tǒng)資源,如果發(fā)現(xiàn)剩余內(nèi)存很多,而又出現(xiàn)此異常,則基本可以肯定是由于操作系統(tǒng)線程數(shù)限制引起的。

          [root@jack ~]# top
          top - 11:36:52 up 5 days,  1:34,  4 users,  load average: 0.00, 0.00, 0.07
          Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
          Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
          Mem:   3821320k total,  3122236k used,   699084k free,   112636k buffers
          Swap:  6062072k total,   571760k used,  5490312k free,   840728k cached


          * 在linux下,可以通過(guò) ulimit -a 查看系統(tǒng)限制

          [root@jack ~]# ulimit -a
          core file size          (blocks, -c) 0
          data seg size           (kbytes, -d) unlimited
          scheduling priority             (-e) 0
          file size               (blocks, -f) unlimited
          pending signals                 (-i) 29644
          max locked memory       (kbytes, -l) 64
          max memory size         (kbytes, -m) unlimited
          open files                      (-n) 1024
          pipe size            (512 bytes, -p) 8
          POSIX message queues     (bytes, -q) 819200
          real-time priority              (-r) 0
          stack size              (kbytes, -s) 10240
          cpu time               (seconds, -t) unlimited
          max user processes              (-u) 1024
          virtual memory          (kbytes, -v) unlimited
          file locks                      (-x) unlimited

          max user process即系統(tǒng)可創(chuàng)建最大線程數(shù)。

          * 可以使用 ulimit -u 4096 修改max user processes的值,但是只能在當(dāng)前終端的這個(gè)session里面生效,重新登錄后仍然是使用系統(tǒng)默認(rèn)值。

          正確的修改方式是修改/etc/security/limits.d/90-nproc.conf文件中的值。


          [root@jack ~]# cat /etc/security/limits.d/90-nproc.conf
          # Default limit for number of user's processes to prevent
          # accidental fork bombs.
          # See rhbz #432903 for reasoning.

          *          soft    nproc     1024

          2.系統(tǒng)內(nèi)存不足
          如果通過(guò)top命令確認(rèn)到是內(nèi)存不足,則可以通過(guò)java啟動(dòng)參數(shù) -Xss修改每個(gè)線程棧大小。減小此參數(shù),可以提高最大線程數(shù)。當(dāng)然,要保證你的線程使用的內(nèi)存不會(huì)超過(guò)這個(gè)數(shù)。

          當(dāng)然,如果不是因?yàn)橄到y(tǒng)級(jí)別的問(wèn)題,那就的優(yōu)化程序了,檢查有沒(méi)有泄露的內(nèi)存,有沒(méi)有業(yè)務(wù)邏輯存在大量并發(fā)等等。
          posted @ 2014-12-15 12:08 abin 閱讀(443) | 評(píng)論 (0)編輯 收藏

           StackOverflow上面給出的解釋是:

          The reason for the HotSpot JVM's two survivor spaces is to reduce the need to deal with fragmentation. New objects are allocated in eden space. All well and good. When that's full, you need a GC, so kill stale objects and move live ones to a survivor space, where they can mature for a while before being promoted to the old generation. Still good so far. The next time we run out of eden space, though, we have a conundrum. The next GC comes along and clears out some space in both eden and our survivor space, but the spaces aren't contiguous. So is it better to

          1. Try to fit the survivors from eden into the holes in the survivor space that were cleared by the GC?
          2. Shift all the objects in the survivor space down to eliminate the fragmentation, and then move the survivors into it?
          3. Just say "screw it, we're moving everything around anyway," and copy all of the survivors from both spaces into a completely separate space--the second survivor space--thus leaving you with a clean eden and survivor space where you can repeat the sequence on the next GC?

          Sun's answer to the question is obvious.


            對(duì)于如何達(dá)到“無(wú)碎片”的目的,理解上可能有些困難,下面我把新生代回收機(jī)制詳細(xì)解釋一下:

            注意,兩個(gè)survivor是交替使用的,在任意一個(gè)時(shí)刻,必定有一個(gè)survivor為空,一個(gè)survivor中存放著對(duì)象(連續(xù)存放,無(wú)碎片)?;厥者^(guò)程如下:

            S1、GC,將eden中的live對(duì)象放入當(dāng)前不為空的survivor中,將eden中的非live對(duì)象回收。如果survivor滿了,下次回收?qǐng)?zhí)行S2;如果survivor未滿,下次回收仍然以S1的方式回收;

            S2、GC,將eden和存放著對(duì)象的survivor中的live對(duì)象放入當(dāng)前為空的survivor中,將非live對(duì)象回收。

            可以看到,上述的新生代回收機(jī)制保證了一個(gè)survivor為空,另一個(gè)非空survivor中無(wú)碎片。

            在執(zhí)行一定次數(shù)的minor GC后,會(huì)通過(guò)Full GC將新生代的survivor中的對(duì)象移入老年代。


            對(duì)于理解GC的整個(gè)機(jī)制,推薦一篇非常好的文章http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/

          posted @ 2014-12-09 14:16 abin 閱讀(1024) | 評(píng)論 (0)編輯 收藏

          下面的例子全是以抓取eth0接口為例,如果不加”-i eth0”是表示抓取所有的接口包括lo。
          首先安裝tcpdump包:yum install -y tcpdump

           1、抓取包含172.16.1.122的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn host 172.16.1.122
           
          2、抓取包含172.16.1.0/24網(wǎng)段的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn net 172.16.1.0/24
           
          3、抓取包含端口22的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn port 22
           
          4、抓取udp協(xié)議的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn  udp
           
          5、抓取icmp協(xié)議的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn icmp

          6、抓取arp協(xié)議的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn arp
           
          7、抓取ip協(xié)議的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn ip
           
          8、抓取源ip是172.16.1.122數(shù)據(jù)包。
          # tcpdump -i eth0 -vnn src host 172.16.1.122
           
          9、抓取目的ip是172.16.1.122數(shù)據(jù)包
          # tcpdump -i eth0 -vnn dst host 172.16.1.122
           
          10、抓取源端口是22的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn src port 22
           
          11、抓取源ip是172.16.1.253且目的ip是22的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn src host 172.16.1.253 and dst port 22
                         
          12、抓取源ip是172.16.1.122或者包含端口是22的數(shù)據(jù)包
          # tcpdump -i eth0 -vnn src host 172.16.1.122 or port 22
           
          13、抓取源ip是172.16.1.122且端口不是22的數(shù)據(jù)包
          [root@ ftp]# tcpdump -i eth0 -vnn src host 172.16.1.122 and not port 22

          14、抓取源ip是172.16.1.2且目的端口是22,或源ip是172.16.1.65且目的端口是80的數(shù)據(jù)包。
          # tcpdump -i eth0 -vnn \( src host 172.16.1.2 and dst port 22 \) or   \( src host 172.16.1.65 and dst port 80 \)
           
          15、抓取源ip是172.16.1.59且目的端口是22,或源ip是172.16.1.68且目的端口是80的數(shù)據(jù)包。
          # tcpdump -i  eth0 -vnn 'src host 172.16.1.59 and dst port 22' or  ' src host 172.16.1.68 and dst port 80 '
           
          16、把抓取的數(shù)據(jù)包記錄存到/tmp/fill文件中,當(dāng)抓取100個(gè)數(shù)據(jù)包后就退出程序。
          # tcpdump –i eth0 -vnn -w  /tmp/fil1 -c 100
           
          17、從/tmp/fill記錄中讀取tcp協(xié)議的數(shù)據(jù)包
          # tcpdump –i eth0 -vnn -r  /tmp/fil1 tcp
           
          18、從/tmp/fill記錄中讀取包含172.16.1.58的數(shù)據(jù)包
          # tcpdump –i eth0 -vnn -r  /tmp/fil1 host  172.16.1.58


          tcpdump抓包并保存成cap文件

          首選介紹一下tcpdump的常用參數(shù)

          tcpdump采用命令行方式,它的命令格式為:
            tcpdump [ -adeflnNOpqStvx ] [ -c 數(shù)量 ] [ -F 文件名 ]
                    [ -i 網(wǎng)絡(luò)接口 ] [ -r 文件名] [ -s snaplen ]
                    [ -T 類型 ] [ -w 文件名 ] [表達(dá)式 ]

          1. tcpdump的選項(xiàng)介紹
             -a    將網(wǎng)絡(luò)地址和廣播地址轉(zhuǎn)變成名字;
             -d    將匹配信息包的代碼以人們能夠理解的匯編格式給出;
             -dd    將匹配信息包的代碼以c語(yǔ)言程序段的格式給出;
             -ddd    將匹配信息包的代碼以十進(jìn)制的形式給出;
             -e    在輸出行打印出數(shù)據(jù)鏈路層的頭部信息;
             -f    將外部的Internet地址以數(shù)字的形式打印出來(lái);
             -l    使標(biāo)準(zhǔn)輸出變?yōu)榫彌_行形式;
             -n    不把網(wǎng)絡(luò)地址轉(zhuǎn)換成名字;
             -t    在輸出的每一行不打印時(shí)間戳;
             -v    輸出一個(gè)稍微詳細(xì)的信息,例如在ip包中可以包括ttl和服務(wù)類型的信息;
             -vv    輸出詳細(xì)的報(bào)文信息;
             -c    在收到指定的包的數(shù)目后,tcpdump就會(huì)停止;
             -F    從指定的文件中讀取表達(dá)式,忽略其它的表達(dá)式;
             -i    指定監(jiān)聽(tīng)的網(wǎng)絡(luò)接口;
             -r    從指定的文件中讀取包(這些包一般通過(guò)-w選項(xiàng)產(chǎn)生);
             -w    直接將包寫(xiě)入文件中,并不分析和打印出來(lái);
             -T    將監(jiān)聽(tīng)到的包直接解釋為指定的類型的報(bào)文,常見(jiàn)的類型有rpc(遠(yuǎn)程過(guò)程
                    調(diào)用)和snmp(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議;)

          當(dāng)網(wǎng)絡(luò)出現(xiàn)故障時(shí),由于直接用tcpdump抓包分析有點(diǎn)困難,而且當(dāng)網(wǎng)絡(luò)中數(shù)據(jù)比較多時(shí)更不容易分析,使用tcpdump的-w參數(shù)+ethereal分析會(huì)很好的解決這個(gè)問(wèn)題,具體參數(shù)如下:

          tcpdump -i eth1 -c 2000 -w eth1.cap

          -i eth1 只抓eth1口的數(shù)據(jù)

          -c 2000代表數(shù)據(jù)包的個(gè)數(shù),也就是只抓2000個(gè)數(shù)據(jù)包

          -w eth1.cap 保存成cap文件,方便用ethereal分析

          抓完數(shù)據(jù)包后ftp到你的FTP服務(wù)器,put一下,然后用ethereal軟件打開(kāi)就可以很直觀的分析了

          注:有時(shí)將.cap文件上傳到FTP服務(wù)器后,發(fā)現(xiàn)用ethreal打開(kāi)時(shí)提示數(shù)據(jù)包大于65535個(gè),這是你在ftp上傳或者下載的時(shí)候沒(méi)有用bin的模式上傳的原因。

          另:有的網(wǎng)站提示在tcpdump中用-s 0命令,例如 tcpdump -i eth1 -c 2000 -s0 -w eth1.cap,可實(shí)際運(yùn)行該命令時(shí)系統(tǒng)卻提示無(wú)效的參數(shù),去掉-s 0參數(shù)即可

          例子:

          [root@localhost cdr]#tcpdump -i eth0 -t tcp -s 60000 -w diaoxian.cap 
          [root@localhost cdr]# tcpdump host 58.240.72.195 -s 60000 -w x.cap

           

          tcpdump 的抓包保存到文件的命令參數(shù)是-w xxx.cap
          抓eth1的包 
          tcpdump -i eth1 -w /tmp/xxx.cap 
          抓 192.168.1.123的包 
          tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap 
          抓192.168.1.123的80端口的包 
          tcpdump -i eth1 host 192.168.1.123 and port 80 -w /tmp/xxx.cap 
          抓192.168.1.123的icmp的包 
          tcpdump -i eth1 host 192.168.1.123 and icmp -w /tmp/xxx.cap 
          抓192.168.1.123的80端口和110和25以外的其他端口的包 
          tcpdump -i eth1 host 192.168.1.123 and ! port 80 and ! port 25 and ! port 110 -w /tmp/xxx.cap 
          抓vlan 1的包 
          tcpdump -i eth1 port 80 and vlan 1 -w /tmp/xxx.cap 
          抓pppoe的密碼 
          tcpdump -i eth1 pppoes -w /tmp/xxx.cap 
          以100m大小分割保存文件, 超過(guò)100m另開(kāi)一個(gè)文件 -C 100m 
          抓10000個(gè)包后退出 -c 10000 
          后臺(tái)抓包, 控制臺(tái)退出也不會(huì)影響: 
          nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & 
          抓下來(lái)的文件可以直接用ethereal 或者wireshark打開(kāi)。 wireshark就是新版的ethereal,程序換名了




          sudo tcpdump -s0 -A host 192.168.234.249
          sudo tcpdump -i eth0 -vnn port 8100


          轉(zhuǎn)載自:

          http://blog.sina.com.cn/s/blog_4a071ed80100sv13.html

          posted @ 2014-12-06 17:28 abin 閱讀(12868) | 評(píng)論 (0)編輯 收藏

          設(shè)x[1…n],y[1…n]為兩個(gè)數(shù)組,每個(gè)包含n個(gè)已知的排好序的數(shù),給出一個(gè)數(shù)組x和y中所有2n個(gè)元素的中位數(shù),要求時(shí)間復(fù)雜度為O(lgN)

          這是算法導(dǎo)論上面的一道題目:

          public class FindMedianTwoSortedArray {
          public static int median(int[] arr1, int l1, int h1, int[] arr2, int l2, int h2)
              {
          System.out.println("-----------");
                  int mid1 = (h1 + l1 ) / 2;
                  int mid2 = (h2 + l2 ) / 2;
                  if (h1 - l1 == 1)
                      return (Math.max(arr1[l1] , arr2[l2]) + Math.min(arr1[h1] , arr2[h2]))/2;
                  else if (arr1[mid1] > arr2[mid2])
                      return median(arr1, l1, mid1 , arr2, mid2 , h2);    
                  else
                      return median(arr1, mid1 , h1, arr2, l2 , mid2 );    
              }     
          public static void main(String[] args) {
          int[] a = new int[]{0,1,2};
          int[] b = new int[]{1,2,3};
          int result = median(a, 0, a.length-1,b,0,b.length-1);
          System.out.println(result);
          }
          }


          posted @ 2014-11-17 21:47 abin 閱讀(457) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共50頁(yè): First 上一頁(yè) 7 8 9 10 11 12 13 14 15 下一頁(yè) Last 
          主站蜘蛛池模板: 石渠县| 凤庆县| 金寨县| 弋阳县| 新营市| 聂荣县| 库伦旗| 宝丰县| 五家渠市| 长岛县| 济宁市| 正安县| 蒲城县| 广西| 康平县| 龙岩市| 禹城市| 无为县| 黑山县| 开鲁县| 留坝县| 许昌县| 汾西县| 昌乐县| 鄂托克前旗| 乳山市| 彩票| 梁河县| 抚宁县| 彭水| 九江市| 册亨县| 连南| 太和县| 长沙县| 东丽区| 嘉荫县| 甘南县| 宁都县| 津市市| 拜城县|