<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    #

    工廠方法模式:
    一個抽象產品類,可以派生出多個具體產品類。
    一個抽象工廠類,可以派生出多個具體工廠類。
    每個具體工廠類只能創建一個具體產品類的實例。

    抽象工廠模式:
    多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
    一個抽象工廠類,可以派生出多個具體工廠類。
    每個具體工廠類可以創建多個具體產品類的實例。

    區別:
    工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
    工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。



    工廠方法模式: 一個抽象產品類,可以派生出多個具體產品類。 一個抽象工廠類,可以派生出多個具體工廠類。 每個具體工廠類只能創建一個具體產品類的實例。 抽象工廠模式: 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。 一個抽象工廠類,可以派生出多個具體工廠類。 每個具體工廠類可以創建多個具體產品類的實例。 區別: 工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。 工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。


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

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



    年輕代又分成3個部分,一個eden區和兩個相同的survior區。剛開始創建的對象都是放置在eden區的。分成這樣3個部分,主要是為了生命周期短的對象盡量留在年輕帶。當eden區申請不到空間的時候,進行minorGC,把存活的對象拷貝到survior。年老代主要存放生命周期比較長的對象,比如緩存對象。具體jvm內存回收過程描述如下(可以結合上圖):

    1、對象在Eden區完成內存分配
    2、當Eden區滿了,再創建對象,會因為申請不到空間,觸發minorGC,進行young(eden+1survivor)區的垃圾回收
    3、minorGC時,Eden不能被回收的對象被放入到空的survivor(Eden肯定會被清空),另一個survivor里不能被GC回收的對象也會被放入這個survivor,始終保證一個survivor是空的
    4、當做第3步的時候,如果發現survivor滿了,則這些對象被copy到old區,或者survivor并沒有滿,但是有些對象已經足夠Old,也被放入Old區 XX:MaxTenuringThreshold
    5、當Old區被放滿的之后,進行fullGC

    在知道垃圾回收機制以后,大家可以在對jvm中堆的各個參數進行優化設置,來提高性能。









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

        哈希(hash)是一種非??斓牟檎曳椒?,一般情況下查找的時間復雜度為O(1)。常用于連接(join)操作,如SQL Server和Oracle中的哈希連接(hash join)。但是SQL Server和Oracle等常見的數據庫并不支持哈希索引(hash index)。MySQL的Heap存儲引擎默認的索引類型為哈希,而InnoDB存儲引擎提出了另一種實現方法,自適應哈希索引(adaptive hash index)。

    InnoDB存儲引擎會監控對表上索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引,所以稱之為自適應(adaptive)的。自適應哈希索引通過緩沖池的B+樹構造而來,因此建立的速度很快。而且不需要將整個表都建哈希索引,InnoDB存儲引擎會自動根據訪問的頻率和模式來為某些頁建立哈希索引。

    根據InnoDB的官方文檔顯示,啟用自適應哈希索引后,讀取和寫入速度可以提高2倍;對于輔助索引的連接操作,性能可以提高5倍。在我看來,自適應哈希索引是非常好的優化模式,其設計思想是數據庫自優化(self-tuning),即無需DBA對數據庫進行調整。

    通過命令SHOW ENGINE INNODB STATUS可以看到當前自適應哈希索引的使用狀況,如下所示:

    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. ...... 

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

    由于自適應哈希索引是由InnoDB存儲引擎控制的,所以這里的信息只供我們參考。不過我們可以通過參數innodb_adaptive_hash_index來禁用或啟動此特性,默認為開啟。

     

     

    轉自http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html

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

    通過什么方法來排查是否linux服務器的負載過大?

    通過top命令來查看服務器負載

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

         一個單核的處理器可以形象得比喻成一條單車道。如果前面沒有車輛在等待,那么你可以告訴后面的司機通過。如果車輛眾多,那么需要告知他們可能需要稍等一會。

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

    從上圖的top命令可以了解到,Linux服務器運行了5天23小時20分,在load average的數據來看,這臺快吧Linux無盤服務器可以說是壓力為零,運行十分流暢。 

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

    說明:%util:一秒中有百分之多少的時間用于I/O操作,或者說一秒中有多少時間I/O隊列是非空的。
    即delta(use)/s/1000 (因為use的單位為毫秒)
    如果%util接近100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。

    方法三:

    如果玩游戲很卡,可以用hdparm –t /dev/磁盤名稱來測試磁盤性能是否達標,下圖是單個希捷1T的盤測試的結果說明:sd表示硬盤是SATA,SCSI或者SAS,a表示串口的第一塊硬盤

     本文轉摘自:http://www.flybaaa.com/help/69_1.html



     

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

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

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

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

    邏輯CPU的個數如下:

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

    按理說物理CPU個數×核數就應該等于邏輯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 閱讀(479) | 評論 (0)編輯 收藏

    JVM在裝載class文件的時候,會有一步是將符號引用解析為直接引用的過程。

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

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

    指向實例變量、實例方法的直接引用都是偏移量實例變量的直接引用可能是從對象的映像開始算起到這個實例變量位置的偏移量。實例方法的直接引用可能是方法表的偏移量。

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

    書中第199頁說,通過“接口引用”來調用一個方法,jvm必須搜索對象的類的方法表才能找到一個合適的方法。這是因為實現同一個接口的這些類中,不一定所有的接口中的方法在類方法區中的偏移量都是一樣的。他們有可能會不一樣。這樣的話可能就要搜索方法表才能確認要調用的方法在哪里。

    而通過“類引用”來調用一個方法的時候,直接通過偏移量就可以找到要調用的方法的位置了?!疽驗樽宇愔械姆椒ǖ钠屏扛割愔械钠屏渴且恢碌摹?/span>

    所以,通過接口引用調用方法會比類引用慢一些。

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

    interface A{void say();}

    class B implements A{}

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

    在上面的第三行代碼中,就是用“接口引用”來調用方法。

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

    符號引用:

    符號引用是一個字符串,它給出了被引用的內容的名字并且可能會包含一些其他關于這個被引用項的信息——這些信息必須足以唯一的識別一個類、字段、方法。這樣,對于其他類的符號引用必須給出類的全名。對于其他類的字段,必須給出類名、字段名以及字段描述符。對于其他類的方法的引用必須給出類名、方法名以及方法的描述符。



    總結:JVM對于直接引用和符號引用的處理是有區別的,可以看到符號引用時,JVM將使用StringBuilder來完成字符串的  添加,而直接引用時則直接使用String來完成;直接引用永遠比符號引用效率更快,但實際應用開發中不可能全用直接引用,要提高效能可以考慮按虛擬機的思維來編寫你的程序。

    1.0 直接引用:

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

    反編譯后的:

    F:\java\res\字節碼>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 符號引用:

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

    反編譯后的:

    F:\java\res\字節碼>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 閱讀(1889) | 評論 (0)編輯 收藏

    MySQL 的默認設置下,當一個連接的空閑時間超過8小時后,MySQL 就會斷開該連接,而 c3p0 連接池則以為該被斷開的連接依然有效。在這種情況下,如果客戶端代碼向 c3p0 連接池請求連接的話,連接池就會把已經失效的連接返回給客戶端,客戶端在使用該失效連接的時候即拋出異常。
    解決這個問題的辦法有三種:
    1. 增加 MySQL 的 wait_timeout 屬性的值。
    修改 /etc/mysql/my.cnf 文件,在 [mysqld] 節中設置:
    # Set a connection to wait 8 hours in idle status.
    wait_timeout 
    = 86400
    2. 減少連接池內連接的生存周期,使之小于上一項中所設置的 wait_timeout 的值。
    修改 c3p0 的配置文件,設置:
    # 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. 定期使用連接池內的連接,使得它們不會因為閑置超時而被 MySQL 斷開。
    修改 c3p0 的配置文件,設置:
    # 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 文件中的屬性設置轉換成為 applicationContext.xml 中 數據庫連接池 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 閱讀(746) | 評論 (0)編輯 收藏

     java.lang.OutOfMemoryError: unable to create new native thread
    引發此問題的原因有兩個:

    1.線程數超過了操作系統的限制。

    * 使用top命令查看系統資源,如果發現剩余內存很多,而又出現此異常,則基本可以肯定是由于操作系統線程數限制引起的。

    [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下,可以通過 ulimit -a 查看系統限制

    [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即系統可創建最大線程數。

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

    正確的修改方式是修改/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.系統內存不足
    如果通過top命令確認到是內存不足,則可以通過java啟動參數 -Xss修改每個線程棧大小。減小此參數,可以提高最大線程數。當然,要保證你的線程使用的內存不會超過這個數。

    當然,如果不是因為系統級別的問題,那就的優化程序了,檢查有沒有泄露的內存,有沒有業務邏輯存在大量并發等等。
    posted @ 2014-12-15 12:08 abin 閱讀(441) | 評論 (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.


      對于如何達到“無碎片”的目的,理解上可能有些困難,下面我把新生代回收機制詳細解釋一下:

      注意,兩個survivor是交替使用的,在任意一個時刻,必定有一個survivor為空,一個survivor中存放著對象(連續存放,無碎片)?;厥者^程如下:

      S1、GC,將eden中的live對象放入當前不為空的survivor中,將eden中的非live對象回收。如果survivor滿了,下次回收執行S2;如果survivor未滿,下次回收仍然以S1的方式回收;

      S2、GC,將eden和存放著對象的survivor中的live對象放入當前為空的survivor中,將非live對象回收。

      可以看到,上述的新生代回收機制保證了一個survivor為空,另一個非空survivor中無碎片。

      在執行一定次數的minor GC后,會通過Full GC將新生代的survivor中的對象移入老年代。


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

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

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

     1、抓取包含172.16.1.122的數據包
    # tcpdump -i eth0 -vnn host 172.16.1.122
     
    2、抓取包含172.16.1.0/24網段的數據包
    # tcpdump -i eth0 -vnn net 172.16.1.0/24
     
    3、抓取包含端口22的數據包
    # tcpdump -i eth0 -vnn port 22
     
    4、抓取udp協議的數據包
    # tcpdump -i eth0 -vnn  udp
     
    5、抓取icmp協議的數據包
    # tcpdump -i eth0 -vnn icmp

    6、抓取arp協議的數據包
    # tcpdump -i eth0 -vnn arp
     
    7、抓取ip協議的數據包
    # tcpdump -i eth0 -vnn ip
     
    8、抓取源ip是172.16.1.122數據包。
    # tcpdump -i eth0 -vnn src host 172.16.1.122
     
    9、抓取目的ip是172.16.1.122數據包
    # tcpdump -i eth0 -vnn dst host 172.16.1.122
     
    10、抓取源端口是22的數據包
    # tcpdump -i eth0 -vnn src port 22
     
    11、抓取源ip是172.16.1.253且目的ip是22的數據包
    # tcpdump -i eth0 -vnn src host 172.16.1.253 and dst port 22
                   
    12、抓取源ip是172.16.1.122或者包含端口是22的數據包
    # tcpdump -i eth0 -vnn src host 172.16.1.122 or port 22
     
    13、抓取源ip是172.16.1.122且端口不是22的數據包
    [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的數據包。
    # 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的數據包。
    # 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、把抓取的數據包記錄存到/tmp/fill文件中,當抓取100個數據包后就退出程序。
    # tcpdump –i eth0 -vnn -w  /tmp/fil1 -c 100
     
    17、從/tmp/fill記錄中讀取tcp協議的數據包
    # tcpdump –i eth0 -vnn -r  /tmp/fil1 tcp
     
    18、從/tmp/fill記錄中讀取包含172.16.1.58的數據包
    # tcpdump –i eth0 -vnn -r  /tmp/fil1 host  172.16.1.58


    tcpdump抓包并保存成cap文件

    首選介紹一下tcpdump的常用參數

    tcpdump采用命令行方式,它的命令格式為:
      tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]
              [ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ]
              [ -T 類型 ] [ -w 文件名 ] [表達式 ]

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

    當網絡出現故障時,由于直接用tcpdump抓包分析有點困難,而且當網絡中數據比較多時更不容易分析,使用tcpdump的-w參數+ethereal分析會很好的解決這個問題,具體參數如下:

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

    -i eth1 只抓eth1口的數據

    -c 2000代表數據包的個數,也就是只抓2000個數據包

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

    抓完數據包后ftp到你的FTP服務器,put一下,然后用ethereal軟件打開就可以很直觀的分析了

    注:有時將.cap文件上傳到FTP服務器后,發現用ethreal打開時提示數據包大于65535個,這是你在ftp上傳或者下載的時候沒有用bin的模式上傳的原因。

    另:有的網站提示在tcpdump中用-s 0命令,例如 tcpdump -i eth1 -c 2000 -s0 -w eth1.cap,可實際運行該命令時系統卻提示無效的參數,去掉-s 0參數即可

    例子:

    [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 的抓包保存到文件的命令參數是-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大小分割保存文件, 超過100m另開一個文件 -C 100m 
    抓10000個包后退出 -c 10000 
    后臺抓包, 控制臺退出也不會影響: 
    nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & 
    抓下來的文件可以直接用ethereal 或者wireshark打開。 wireshark就是新版的ethereal,程序換名了




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


    轉載自:

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

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

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

    這是算法導論上面的一道題目:

    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 閱讀(451) | 評論 (0)編輯 收藏

    僅列出標題
    共50頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 Last 
    主站蜘蛛池模板: 青娱乐免费视频在线观看| 日韩视频免费在线观看| 国产gav成人免费播放视频| 99热在线观看免费| 黄 色一级 成 人网站免费| 亚洲AV无码AV日韩AV网站| 亚洲男人电影天堂| 国产精品深夜福利免费观看| 免费的黄色的网站| 亚洲免费精彩视频在线观看| 亚洲精品国产V片在线观看| 99久久久国产精品免费牛牛| 中文在线观看永久免费| 人妻仑刮八A级毛片免费看| 亚洲国产精品18久久久久久| 亚洲人成网站色在线观看| 亚洲欧洲日产国码一级毛片| 国产资源免费观看| 日韩中文字幕免费| 天天摸天天操免费播放小视频 | 日本一卡精品视频免费| a级毛片毛片免费观看久潮| 国产精品极品美女自在线观看免费 | 成人免费福利电影| 国产在线观看xxxx免费| 九九免费精品视频在这里| 美女啪啪网站又黄又免费| 九九精品国产亚洲AV日韩| 亚洲视频在线播放| 精品亚洲国产成AV人片传媒| 亚洲AV成人精品日韩一区18p| 91久久精品国产免费直播| 亚洲视频在线免费| A毛片毛片看免费| 国产日韩一区二区三免费高清| 最近免费字幕中文大全| 91视频免费网站| 无码国产精品一区二区免费3p| 免费在线观看一区| 中文字幕不卡免费视频| 日韩精品无码免费一区二区三区|