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

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

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

    搜索引擎選型調研文檔

    Elasticsearch簡介*

    Elasticsearch是一個實時的分布式搜索和分析引擎。它可以幫助你用前所未有的速度去處理大規模數據。

    它可以用于全文搜索,結構化搜索以及分析,當然你也可以將這三者進行組合。

    Elasticsearch是一個建立在全文搜索引擎 Apache Lucene™ 基礎上的搜索引擎,可以說Lucene是當今最先進,最高效的全功能開源搜索引擎框架。

    但是Lucene只是一個框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的學習了解,才能明白它是如何運行的,Lucene確實非常復雜。

    Elasticsearch使用Lucene作為內部引擎,但是在使用它做全文搜索時,只需要使用統一開發好的API即可,而不需要了解其背后復雜的Lucene的運行原理。

    當然Elasticsearch并不僅僅是Lucene這么簡單,它不但包括了全文搜索功能,還可以進行以下工作:

    • 分布式實時文件存儲,并將每一個字段都編入索引,使其可以被搜索。

    • 實時分析的分布式搜索引擎。

    • 可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。

    這么多的功能被集成到一臺服務器上,你可以輕松地通過客戶端或者任何你喜歡的程序語言與ES的RESTful API進行交流。

    Elasticsearch的上手是非常簡單的。它附帶了很多非常合理的默認值,這讓初學者很好地避免一上手就要面對復雜的理論,

    它安裝好了就可以使用了,用很小的學習成本就可以變得很有生產力。

    隨著越學越深入,還可以利用Elasticsearch更多高級的功能,整個引擎可以很靈活地進行配置。可以根據自身需求來定制屬于自己的Elasticsearch。

    使用案例:

    • 維基百科使用Elasticsearch來進行全文搜做并高亮顯示關鍵詞,以及提供search-as-you-type、did-you-mean等搜索建議功能。

    • 英國衛報使用Elasticsearch來處理訪客日志,以便能將公眾對不同文章的反應實時地反饋給各位編輯。

    • StackOverflow將全文搜索與地理位置和相關信息進行結合,以提供more-like-this相關問題的展現。

    • GitHub使用Elasticsearch來檢索超過1300億行代碼。

    • 每天,Goldman Sachs使用它來處理5TB數據的索引,還有很多投行使用它來分析股票市場的變動。

    但是Elasticsearch并不只是面向大型企業的,它還幫助了很多類似DataDog以及Klout的創業公司進行了功能的擴展。

    Elasticsearch的優缺點**:

    優點

    1. Elasticsearch是分布式的。不需要其他組件,分發是實時的,被叫做”Push replication”。
    2. Elasticsearch 完全支持 Apache Lucene 的接近實時的搜索。
    3. 處理多租戶(multitenancy)不需要特殊配置,而Solr則需要更多的高級設置。
    4. Elasticsearch 采用 Gateway 的概念,使得完備份更加簡單。
    5. 各節點組成對等的網絡結構,某些節點出現故障時會自動分配其他節點代替其進行工作。

    缺點

    1. 只有一名開發者(當前Elasticsearch GitHub組織已經不只如此,已經有了相當活躍的維護者)
    2. 還不夠自動(不適合當前新的Index Warmup API)

    Solr簡介*

    Solr(讀作“solar”)是Apache Lucene項目的開源企業搜索平臺。其主要功能包括全文檢索、命中標示、分面搜索、動態聚類、數據庫集成,以及富文本(如Word、PDF)的處理。Solr是高度可擴展的,并提供了分布式搜索和索引復制。Solr是最流行的企業級搜索引擎,Solr4 還增加了NoSQL支持。

    Solr是用Java編寫、運行在Servlet容器(如 Apache Tomcat 或Jetty)的一個獨立的全文搜索服務器。 Solr采用了 Lucene Java 搜索庫為核心的全文索引和搜索,并具有類似REST的HTTP/XML和JSON的API。Solr強大的外部配置功能使得無需進行Java編碼,便可對 其進行調整以適應多種類型的應用程序。Solr有一個插件架構,以支持更多的高級定制。

    因為2010年 Apache Lucene 和 Apache Solr 項目合并,兩個項目是由同一個Apache軟件基金會開發團隊制作實現的。提到技術或產品時,Lucene/Solr或Solr/Lucene是一樣的。

    Solr的優缺點

    優點

    1. Solr有一個更大、更成熟的用戶、開發和貢獻者社區。
    2. 支持添加多種格式的索引,如:HTML、PDF、微軟 Office 系列軟件格式以及 JSON、XML、CSV 等純文本格式。
    3. Solr比較成熟、穩定。
    4. 不考慮建索引的同時進行搜索,速度更快。

    缺點

    1. 建立索引時,搜索效率下降,實時索引搜索效率不高。

    Elasticsearch與Solr的比較*

    當單純的對已有數據進行搜索時,Solr更快。

    Search Fesh Index While Idle

    當實時建立索引時, Solr會產生io阻塞,查詢性能較差, Elasticsearch具有明顯的優勢。

    search_fresh_index_while_indexing

    隨著數據量的增加,Solr的搜索效率會變得更低,而Elasticsearch卻沒有明顯的變化。

    search_fresh_index_while_indexing

    綜上所述,Solr的架構不適合實時搜索的應用。

    實際生產環境測試*

    下圖為將搜索引擎從Solr轉到Elasticsearch以后的平均查詢速度有了50倍的提升。

    average_execution_time

    Elasticsearch 與 Solr 的比較總結

    • 二者安裝都很簡單;
    • Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協調管理功能;
    • Solr 支持更多格式的數據,而 Elasticsearch 僅支持json文件格式;
    • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高級功能多有第三方插件提供;
    • Solr 在傳統的搜索應用中表現好于 Elasticsearch,但在處理實時搜索應用時效率明顯低于 Elasticsearch。

    Solr 是傳統搜索應用的有力解決方案,但 Elasticsearch 更適用于新興的實時搜索應用。

    其他基于Lucene的開源搜索引擎解決方案*

    1. 直接使用 Lucene

    說明:Lucene 是一個 JAVA 搜索類庫,它本身并不是一個完整的解決方案,需要額外的開發工作。

    優點:成熟的解決方案,有很多的成功案例。apache 頂級項目,正在持續快速的進步。龐大而活躍的開發社區,大量的開發人員。它只是一個類庫,有足夠的定制和優化空間:經過簡單定制,就可以滿足絕大部分常見的需求;經過優化,可以支持 10億+ 量級的搜索。

    缺點:需要額外的開發工作。所有的擴展,分布式,可靠性等都需要自己實現;非實時,從建索引到可以搜索中間有一個時間延遲,而當前的“近實時”(Lucene Near Real Time search)搜索方案的可擴展性有待進一步完善

    說明:基于 Lucene 的,支持分布式,可擴展,具有容錯功能,準實時的搜索方案。

    優點:開箱即用,可以與 Hadoop 配合實現分布式。具備擴展和容錯機制。

    缺點:只是搜索方案,建索引部分還是需要自己實現。在搜索功能上,只實現了最基本的需求。成功案例較少,項目的成熟度稍微差一些。因為需要支持分布式,對于一些復雜的查詢需求,定制的難度會比較大。

    說明:Map/Reduce 模式的,分布式建索引方案,可以跟 Katta 配合使用。

    優點:分布式建索引,具備可擴展性。

    缺點:只是建索引方案,不包括搜索實現。工作在批處理模式,對實時搜索的支持不佳。

    說明:基于 Lucene 的一系列解決方案,包括 準實時搜索 zoie ,facet 搜索實現 bobo ,機器學習算法 decomposer ,摘要存儲庫 krati ,數據庫模式包裝 sensei 等等

    優點:經過驗證的解決方案,支持分布式,可擴展,豐富的功能實現

    缺點:與 linkedin 公司的聯系太緊密,可定制性比較差

    說明:基于 Lucene,索引存在 cassandra 數據庫中

    優點:參考 cassandra 的優點

    缺點:參考 cassandra 的缺點。另外,這只是一個 demo,沒有經過大量驗證

    說明:基于 Lucene,索引存在 HBase 數據庫中

    優點:參考 HBase 的優點

    缺點:參考 HBase 的缺點。另外,在實現中,lucene terms 是存成行,但每個 term 對應的 posting lists 是以列的方式存儲的。隨著單個 term 的 posting lists 的增大,查詢時的速度受到的影響會非常大

     

    轉載:http://blog.csdn.net/jameshadoop/article/details/44905643

    posted @ 2016-03-17 15:16 小馬歌 閱讀(428) | 評論 (0)編輯 收藏
     
         摘要: 快的打車從2013年年底到2014年下半年,系統訪問量迅速膨脹,很多復雜的問題要在短時間內解決,且不能影響線上業務,這是比較大的挑戰,本文將會闡述快的打車架構演變過程遇到的一些有代表性的問題和解決方案。LBS的瓶頸和方案先看看基本的系統模型,如圖1所示。圖1 系統模型示意圖司機每隔幾秒鐘上報一次經緯度,存儲在MongoDB里;乘客發單時,通過MongoDB圈選出附近司機;將訂單通過長連接服務推送給...  閱讀全文
    posted @ 2016-03-11 14:57 小馬歌 閱讀(487) | 評論 (0)編輯 收藏
     

    0.以下在系統CentOS 6.3 x86_64上操作

    1.試圖運行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系統的glibc版本太低,軟件編譯時使用了較高版本的glibc引起的:

    1. [ghui@StuOS bin]$ pwd  
    2. /var/VMdisks/cross/mingw32/bin  
    3. [ghui@StuOS bin]$ ls  
    4. lrelease     QtCore4.dll         QtNetwork4.dll      QtSql4.dll     QtXml4.dll  
    5. moc          QtDeclarative4.dll  QtOpenGL4.dll       QtSvg4.dll     rcc  
    6. phonon4.dll  QtGui4.dll          QtScript4.dll       QtTest4.dll    uic  
    7. qmake        QtMultimedia4.dll   QtScriptTools4.dll  QtWebKit4.dll  
    8. [ghui@StuOS bin]$ ./qmake   
    9. ./qmake: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./qmake)  
    [ghui@StuOS bin]$ pwd /var/VMdisks/cross/mingw32/bin [ghui@StuOS bin]$ ls lrelease     QtCore4.dll         QtNetwork4.dll      QtSql4.dll     QtXml4.dll moc          QtDeclarative4.dll  QtOpenGL4.dll       QtSvg4.dll     rcc phonon4.dll  QtGui4.dll          QtScript4.dll       QtTest4.dll    uic qmake        QtMultimedia4.dll   QtScriptTools4.dll  QtWebKit4.dll [ghui@StuOS bin]$ ./qmake  ./qmake: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./qmake)  

     

    2.查看系統glibc支持的版本:
    1. [ghui@StuOS bin]$ strings /lib64/libc.so.6 |grep GLIBC_  
    2. GLIBC_2.2.5  
    3. GLIBC_2.2.6  
    4. GLIBC_2.3  
    5. GLIBC_2.3.2  
    6. GLIBC_2.3.3  
    7. GLIBC_2.3.4  
    8. GLIBC_2.4  
    9. GLIBC_2.5  
    10. GLIBC_2.6  
    11. GLIBC_2.7  
    12. GLIBC_2.8  
    13. GLIBC_2.9  
    14. GLIBC_2.10  
    15. GLIBC_2.11  
    16. GLIBC_2.12  
    17. GLIBC_PRIVATE  
    [ghui@StuOS bin]$ strings /lib64/libc.so.6 |grep GLIBC_ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_PRIVATE
    1. [ghui@StuOS bin]$ rpm -qa |grep glibc  
    2. glibc-static-2.12-1.80.el6_3.6.x86_64  
    3. glibc-headers-2.12-1.80.el6_3.6.x86_64  
    4. glibc-common-2.12-1.80.el6_3.6.x86_64  
    5. glibc-devel-2.12-1.80.el6_3.6.x86_64  
    6. glibc-static-2.12-1.80.el6_3.6.i686  
    7. glibc-devel-2.12-1.80.el6_3.6.i686  
    8. glibc-2.12-1.80.el6_3.6.i686  
    9. glibc-2.12-1.80.el6_3.6.x86_64  
    [ghui@StuOS bin]$ rpm -qa |grep glibc glibc-static-2.12-1.80.el6_3.6.x86_64 glibc-headers-2.12-1.80.el6_3.6.x86_64 glibc-common-2.12-1.80.el6_3.6.x86_64 glibc-devel-2.12-1.80.el6_3.6.x86_64 glibc-static-2.12-1.80.el6_3.6.i686 glibc-devel-2.12-1.80.el6_3.6.i686 glibc-2.12-1.80.el6_3.6.i686 glibc-2.12-1.80.el6_3.6.x86_64 

    3.可以看到最高只支持2.12版本,所以考慮編譯解決這個問題:

           a. 到http://www.gnu.org/software/libc/下載最新版本,我這里下載了glibc-2.14.tar.xz 這個版本,解壓到任意目錄準備編譯

           b.這里解壓到/var/VMdisks/glibc-2.14/

    1. [ghui@StuOS bin]$ cd /var/VMdisks/glibc-2.14/  
    2. [ghui@StuOS glibc-2.14]$ pwd  
    3. /var/VMdisks/glibc-2.14  
    4. [ghui@StuOS glibc-2.14]$ ls  
    5. abilist            config.h.in           intl           README.libm  
    6. abi-tags           config.log            io             resolv  
    7. aclocal.m4         config.make.in        libc-abis      resource  
    8. aout               configure             libidn         rt  
    9. argp               configure.in          libio          Rules  
    10. assert             conform               LICENSES       scripts  
    11. autom4te.cache     CONFORMANCE           locale         setjmp  
    12. bits               COPYING               localedata     shadow  
    13. BUGS               COPYING.LIB           login          shlib-versions  
    14. build              cppflags-iterator.mk  mach           signal  
    15. CANCEL-FCT-WAIVE   crypt                 Makeconfig     socket  
    16. CANCEL-FILE-WAIVE  csu                   Makefile       soft-fp  
    17. catgets            ctype                 Makefile.in    stdio-common  
    18. ChangeLog          debug                 Makerules      stdlib  
    19. ChangeLog.1        dirent                malloc         streams  
    20. ChangeLog.10       dlfcn                 manual         string  
    21. ChangeLog.11       elf                   math           sunrpc  
    22. ChangeLog.12       extra-lib.mk          misc           sysdeps  
    23. ChangeLog.13       extra-modules.mk      NAMESPACE      sysvipc  
    24. ChangeLog.14       FAQ                   NEWS           termios  
    25. ChangeLog.15       FAQ.in                nis            test-skeleton.c  
    26. ChangeLog.16       gmon                  NOTES          time  
    27. ChangeLog.17       gnulib                nptl           timezone  
    28. ChangeLog.2        grp                   nptl_db        tls.make.c  
    29. ChangeLog.3        gshadow               nscd           version.h  
    30. ChangeLog.4        hesiod                nss            Versions.def  
    31. ChangeLog.5        hurd                  o-iterator.mk  wcsmbs  
    32. ChangeLog.6        iconv                 po             wctype  
    33. ChangeLog.7        iconvdata             posix          WUR-REPORT  
    34. ChangeLog.8        include               PROJECTS  
    35. ChangeLog.9        inet                  pwd  
    36. conf               INSTALL               README  
    [ghui@StuOS bin]$ cd /var/VMdisks/glibc-2.14/ [ghui@StuOS glibc-2.14]$ pwd /var/VMdisks/glibc-2.14 [ghui@StuOS glibc-2.14]$ ls abilist            config.h.in           intl           README.libm abi-tags           config.log            io             resolv aclocal.m4         config.make.in        libc-abis      resource aout               configure             libidn         rt argp               configure.in          libio          Rules assert             conform               LICENSES       scripts autom4te.cache     CONFORMANCE           locale         setjmp bits               COPYING               localedata     shadow BUGS               COPYING.LIB           login          shlib-versions build              cppflags-iterator.mk  mach           signal CANCEL-FCT-WAIVE   crypt                 Makeconfig     socket CANCEL-FILE-WAIVE  csu                   Makefile       soft-fp catgets            ctype                 Makefile.in    stdio-common ChangeLog          debug                 Makerules      stdlib ChangeLog.1        dirent                malloc         streams ChangeLog.10       dlfcn                 manual         string ChangeLog.11       elf                   math           sunrpc ChangeLog.12       extra-lib.mk          misc           sysdeps ChangeLog.13       extra-modules.mk      NAMESPACE      sysvipc ChangeLog.14       FAQ                   NEWS           termios ChangeLog.15       FAQ.in                nis            test-skeleton.c ChangeLog.16       gmon                  NOTES          time ChangeLog.17       gnulib                nptl           timezone ChangeLog.2        grp                   nptl_db        tls.make.c ChangeLog.3        gshadow               nscd           version.h ChangeLog.4        hesiod                nss            Versions.def ChangeLog.5        hurd                  o-iterator.mk  wcsmbs ChangeLog.6        iconv                 po             wctype ChangeLog.7        iconvdata             posix          WUR-REPORT ChangeLog.8        include               PROJECTS ChangeLog.9        inet                  pwd conf               INSTALL               README  

          c.在glibc源碼目錄建立構建目錄,并cd進入構建目錄
    1. [ghui@StuOS glibc-2.14]$ mkdir build  
    [ghui@StuOS glibc-2.14]$ mkdir build
    1. [ghui@StuOS glibc-2.14]$ cd build  
    [ghui@StuOS glibc-2.14]$ cd build 

        d.運行configure配置,make && sudo  make install
    1. [ghui@StuOS build]$ ../configure --prefix=/opt/glibc-2.14  
    2. [ghui@StuOS build]$ make -j4   
    3. [ghui@StuOS build]$ sudo make install  
    4. [sudo] password for ghui:   
    [ghui@StuOS build]$ ../configure --prefix=/opt/glibc-2.14 [ghui@StuOS build]$ make -j4  [ghui@StuOS build]$ sudo make install [sudo] password for ghui:   

    4.臨時修改環境變量
    1. [ghui@StuOS bin]$ export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH  
    [ghui@StuOS bin]$ export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH 
    1. [ghui@StuOS glibc-2.14]$ cd /var/VMdisks/cross/mingw32/bin/  
    [ghui@StuOS glibc-2.14]$ cd /var/VMdisks/cross/mingw32/bin/ 

    1. [ghui@StuOS bin]$ ./qmake   
    2. Usage: ./qmake [mode] [options] [files]  
    3.   
    4. QMake has two modes, one mode for generating project files based on  
    5. some heuristics, and the other for generating makefiles. Normally you  
    6. shouldn't need to specify a mode, as makefile generation is the default  
    7. mode for qmake, but you may use this to test qmake on an existing project  

    From:

    http://blog.csdn.net/cpplang/article/details/8462768

    posted @ 2016-03-10 10:14 小馬歌 閱讀(1445) | 評論 (0)編輯 收藏
     

    致命錯誤出現的時候,JVM生成了hs_err_pid<pid>.log這樣的文件,其中往往包含了虛擬機崩潰原因的重要信息。因為經常遇 到,在這篇文章里,我挑選了一個,并且逐段分析它包含的內容(文件可以在文章最后下載)。默認情況下文件是創建在工作目錄下的(如果沒權限創建的話JVM 會嘗試把文件寫到/tmp這樣的臨時目錄下面去),當然,文件格式和路徑也可以通過參數指定,比如:

    1. java -XX:ErrorFile=/var/log/java/java_error%p.log 

    這個文件將包括:

    • 觸發致命錯誤的操作異常或者信號;
    • 版本和配置信息;
    • 觸發致命異常的線程詳細信息和線程棧;
    • 當前運行的線程列表和它們的狀態;
    • 堆的總括信息;
    • 加載的本地庫;
    • 命令行參數;
    • 環境變量;
    • 操作系統CPU的詳細信息。

    首先,看到的是對問題的概要介紹:

    1. #  SIGSEGV (0xb) at pc=0x03568cf4, pid=16819, tid=3073346448 

    一個非預期的錯誤被JRE檢測到,其中:

    • SIGSEGV是信號名稱
    • 0xb是信號碼
    • pc=0x03568cf4指的是程序計數器的值
    • pid=16819是進程號
    • tid=3073346448是線程號

    如果你對JVM有了解,應該不會對這些東西陌生。

    接下來是JRE和JVM的版本信息:

    1. # JRE version: 6.0_32-b05 
    2.   
    3. # Java VM: Java HotSpot(TM) Server VM (20.7-b02 mixed mode linux-x86 ) 

    運行在mixed模式下。

    然后是問題幀的信息:

    1. # Problematic frame: 
    2.   
    3. # C  [libgtk-x11-2.0.so.0+0x19fcf4]  __float128+0x19fcf4 
    • C:幀類型為本地幀,幀的類型包括: 
      • C:本地C幀
      • j:解釋的Java幀
      • V:虛擬機幀
      • v:虛擬機生成的存根棧幀
      • J:其他幀類型,包括編譯后的Java幀
    • libgtk-x11-2.0.so.0+0x19fcf4:和程序計數器(pc)表達的含義一樣,但是用的是本地so庫+偏移量的方式。

    接下去第一部分是線程信息:

    1. Current thread (0x09f30c00):  JavaThread "main" [_thread_in_native, id=16822, stack(0xb72a8000,0xb72f9000)] 

    當前線程的:

    • 0x09f30c00:指針
    • JavaThread:線程類型,可能的類型包括: 
      • JavaThread
      • VMThread
      • CompilerThread
      • GCTaskThread
      • WatcherThread
      • ConcurrentMarkSweepThread
    • main:名字 
      • _thread_in_native:線程當前狀態,狀態枚舉包括:
      • _thread_uninitialized:線程還沒有創建,它只在內存原因崩潰的時候才出現
      • _thread_new:線程已經被創建,但是還沒有啟動
      • _thread_in_native:線程正在執行本地代碼,一般這種情況很可能是本地代碼有問題
      • _thread_in_vm:線程正在執行虛擬機代碼
      • _thread_in_Java:線程正在執行解釋或者編譯后的Java代碼
      • _thread_blocked:線程處于阻塞狀態
      • …_trans:以_trans結尾,線程正處于要切換到其它狀態的中間狀態
    • id=16822:線程ID
    • 0xb72a8000,0xb72f9000:棧區間
    1. siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x00000010 

    這部分是導致虛擬機終止的非預期的信號信息,含義前面已經大致提到過了。其中si_errno和si_code是Linux下用來鑒別異常的,Windows下是一個ExceptionCode。

    1. EAX=0x00000000, EBX=0x0375dd84, ECX=0x00000000, EDX=0x00000000 
    2. ESP=0xb72f0fa0, EBP=0xb72f0fb8, ESI=0x00000000, EDI=0x0a6c1800 
    3. EIP=0x03568cf4, EFLAGS=0x00010246, CR2=0x00000010 

    這是寄存器上下文。

     

    1. Top of Stack: (sp=0xb72f0fa0) 
    2. 0xb72f0fa0:   00000000 00402250 0040217f 0375dd84 
    3. 0xb72f0fb0:   00000000 0a6c1800 b72f0fe8 0356c2c0 
    4. 0xb72f0fc0:   00000000 0a6c1800 b72f0fe8 003b3e77 
    5. 0xb72f0fd0:   003e6c8b 0a1a70d0 0a193358 0375dd84 
    6. 0xb72f0fe0:   0a276418 0a276418 b72f1048 03536c56 
    7. 0xb72f0ff0:   0acad000 0b3ca978 0000000c 00dd0674 
    8. 0xb72f1000:   00000003 0a2c7d50 b72f1038 0000330c 
    9. 0xb72f1010:   ffffffff ffffffff 00000001 00000001 
    10.   
    11. Instructions: (pc=0x03568cf4) 
    12. 0x03568cd4:   89 14 24 89 75 f8 89 d6 89 7d fc 89 c7 e8 7e 1b 
    13. 0x03568ce4:   ea ff 89 34 24 89 87 d4 02 00 00 e8 30 00 ea ff 
    14. 0x03568cf4:   8b 40 10 89 3c 24 c7 44 24 08 00 00 00 00 89 87 
    15. 0x03568d04:   d0 02 00 00 8b 83 88 24 00 00 89 44 24 04 e8 dd 

    棧頂程序計數器旁的操作碼,它們可以被反匯編成系統崩潰前執行的指令。

    1. Register to memory mapping: 
    2.   
    3. EAX=0x00000000 is an unknown value 
    4. EBX=0x0375dd84: <offset 0x394d84> in /usr/lib/libgtk-x11-2.0.so.0 at 0x033c9000 
    5. ECX=0x00000000 is an unknown value 
    6. EDX=0x00000000 is an unknown value 
    7. ESP=0xb72f0fa0 is pointing into the stack for thread: 0x09f30c00 
    8. EBP=0xb72f0fb8 is pointing into the stack for thread: 0x09f30c00 
    9. ESI=0x00000000 is an unknown value 
    10. EDI=0x0a6c1800 is an unknown value 

    寄存器和內存映射信息。

    1. Stack: [0xb72a8000,0xb72f9000],  sp=0xb72f0fa0,  free space=291k 
    2. Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
    3. C  [libgtk-x11-2.0.so.0+0x19fcf4]  __float128+0x19fcf4 
    4. C  [libgtk-x11-2.0.so.0+0x1a32c0]  __float128+0xc0 
    5. ... ... 
    6. C  [libswt-pi-gtk-3738.so+0x33f6a]  Java_org_eclipse_swt_internal_gtk_OS__1Call+0xf 
    7. J  org.eclipse.swt.internal.gtk.OS._Call(III)I 
    8. J  org.eclipse.swt.internal.gtk.OS.Call(III)I 
    9.   
    10. Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
    11. J  org.eclipse.swt.internal.gtk.OS._Call(III)I 
    12. J  org.eclipse.swt.internal.gtk.OS.Call(III)I 
    13. j  org.eclipse.swt.widgets.Widget.fixedSizeAllocateProc(II)I+5 
    14. j  org.eclipse.swt.widgets.Display.fixedSizeAllocateProc(II)I+17 
    15. v  ~StubRoutines::call_stub 

    線程棧。包含了地址、棧頂、棧計數器和線程尚未使用的棧信息,由于棧可能非常長,打印的長度有限制,但是至少本地棧和Java棧都打印出來了(很多時候本地棧打印不出來,但是Java棧一般都能打印出來)。從中可以看到,Eclipse的虛擬機崩潰了。

    1. ava Threads: ( => current thread ) 
    2.   0x0b4c1000 JavaThread "Worker-247" [_thread_blocked, id=25417, stack(0x741bc000,0x7420d000)] 
    3.   0x0a300c00 JavaThread "Worker-246" [_thread_blocked, id=25235, stack(0x7d30c000,0x7d35d000)] 
    4. ... ... 

    線程信息。一目了然,不解釋了。

    1. VM state:not at safepoint (normal execution) 

    虛擬機狀態。包括:

    • not at a safepoint:正常運行狀態;
    • at safepoint:所有線程都因為虛擬機等待狀態而阻塞,等待一個虛擬機操作完成;
    • synchronizing:一個特殊的虛擬機操作,要求虛擬機內的其它線程保持等待狀態。
    1. VM Mutex/Monitor currently owned by a thread: None 

    虛擬機的Mutex和Monitor目前沒有被線程持有。Mutex是虛擬機內部的鎖,而Monitor則關聯到了Java對象。

    1. Heap 
    2.  PSYoungGen      total 149056K, used 125317K [0xa9700000, 0xb41a0000, 0xb41a0000) 
    3.   eden space 123520K, 95% used [0xa9700000,0xb0ac0de0,0xb0fa0000) 
    4.   from space 25536K, 26% used [0xb28b0000,0xb2f50748,0xb41a0000) 
    5.   to   space 25600K, 0% used [0xb0fa0000,0xb0fa0000,0xb28a0000) 
    6.  PSOldGen        total 261248K, used 239964K [0x941a0000, 0xa40c0000, 0xa9700000) 
    7.   object space 261248K, 91% used [0x941a0000,0xa2bf7018,0xa40c0000) 
    8.  PSPermGen       total 163328K, used 130819K [0x841a0000, 0x8e120000, 0x941a0000) 
    9.   object space 163328K, 80% used [0x841a0000,0x8c160c40,0x8e120000) 

    堆信息。新生代、老生代、永久代。對JVM有了解的人應該都清楚,不解釋了。

    1. Code Cache  [0xb4262000, 0xb5ac2000, 0xb7262000) 
    2.  total_blobs=5795 nmethods=5534 adapters=209 free_code_cache=25103616 largest_free_block=38336 

    代碼緩存(Code Cache)。這是一塊用于編譯和保存本地代碼的內存,注意是本地代碼,它和PermGen(永久代)是不一樣的,永久帶是用來存放Java類定義的。

    1. Dynamic libraries: 
    2. 00101000-00122000 r-xp 00000000 08:01 3483560    /usr/lib/libjpeg.so.62.0.0 
    3. 00122000-00123000 rwxp 00020000 08:01 3483560    /usr/lib/libjpeg.so.62.0.0 
    4. 00125000-00130000 r-xp 00000000 08:01 9093202    /lib/libgcc_s-4.1.2-20080825.so.1 
    5. 00130000-00131000 rwxp 0000a000 08:01 9093202    /lib/libgcc_s-4.1.2-20080825.so.1 
    6. ... ... 

    內存映射。這些信息是虛擬機崩潰時的虛擬內存列表區域。在定位崩潰原因的時候,它可以告訴你哪些類庫正在被使用,位置在哪里,還有堆棧和守護頁信息。就以列表中第一條為例說明:

    • 00101000-00122000:內存區域
    • r-xp:權限,r/w/x/p/s分別表示讀/寫/執行/私有/共享
    • 00000000:文件內的偏移量
    • 08:01:文件位置的majorID和minorID
    • 3483560:索引節點號
    • /usr/lib/libjpeg.so.62.0.0:文件位置

    每一個lib都有兩塊虛擬內存區域——代碼和數據,它們的權限不同,代碼區域是r-xp;數據區域是rwxp。守護頁(guard page)由權限為--xp和rwxp的一對組成。

    1. VM Arguments: 
    2. jvm_args: -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m -Dorg.eclipse.swt.browser.XULRunnerPath='' 
    3. java_command: /.../eclipse/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar -os linux -ws gtk -arch x86 -showsplash -launcher /.../eclipse/eclipse -name Eclipse ... 
    4. Launcher Type: SUN_STANDARD 
    5.   
    6. Environment Variables: 
    7. PATH=... 
    8. DISPLAY=:0.0 

    虛擬機參數和環境變量。

    1. Signal Handlers: 
    2. SIGSEGV: [libjvm.so+0x726440], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004 
    3. SIGBUS: [libjvm.so+0x726440], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004 
    4. ... ... 

    信號句柄。對于Linux下的信號機制,參閱wiki百科, 鏈接

     

    1. OS:Red Hat Enterprise Linux Client release 5.4 (Tikanga) 
    2.   
    3. uname:Linux 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 
    4. libc:glibc 2.5 NPTL 2.5 
    5. rlimit: STACK 10240k, CORE 0k, NPROC 65536, NOFILE 1024, AS infinity 
    6. load average:1.78 1.58 1.54 
    7.   
    8. /proc/meminfo: 
    9. ... 
    10.   
    11. CPU:total 4 (4 cores per cpu, 1 threads per core) family 6 model 42 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3 
    12.   
    13. /proc/cpuinfo: 
    14. ... 
    15.   
    16. Memory: 4k page, physical 3631860k(155144k free), swap 5124724k(5056452k free) 


    已有 0 人發表留言,猛擊->> 這里<<-參與討論 


    ITeye推薦 


    相關 [jvm 錯誤 日志] 推薦:

    JVM致命錯誤日志(hs_err_pid.log)解讀

    - - 四火的嘮叨
    文章系本人原創,轉載請保持完整性并注明出自 《四火的嘮叨》. 致命錯誤出現的時候,JVM生成了hs_err_pid<pid>.log這樣的文件,其中往往包含了虛擬機崩潰原因的重要信息. 因為經常遇到,在這篇文章里,我挑選了一個,并且逐段分析它包含的內容(文件可以在文章最后下載). 默認情況下文件是創建在工作目錄下的(如果沒權限創建的話JVM會嘗試把文件寫到/tmp這樣的臨時目錄下面去),當然,文件格式和路徑也可以通過參數指定,比如:.

    Fatal Error log format,JVM 致命錯誤日志格式

    - - 碼蜂筆記
    本文翻譯自: http://www.oracle.com/technetwork/java/javase/felog-138657.html. 本文內容基于 Java SE 6,HotSpot JVM. 當一個致命錯誤發生時,一個錯誤日志將被創建,存儲了在致命錯誤發生時獲取到的信息和狀態. 注意:這個文件的格式可能隨著版本的更新而改變.

    JVM日志和參數的理解

    - - 開源軟件 - ITeye博客
    轉自:http://hot66hot.iteye.com/blog/2075819. 寫這篇wiki的目的:最近在調整Hbase的JVM,翻了些文檔和wiki,想寫點東西,給自己和想了解jvm日志和參數的同 學提供些幫助..  一:理解GC日志格式,讀GC日志的方法. -XX:+UseGCLogFileRotation  啟用GC日志文件的自動轉儲 (Since Java).

    通過JVM日志來進行安全點分析

    - - 并發編程網 - ifeve.com
    原文鏈接 作者: Plumbr 譯者:之諸暇. 許多事件都可能會導致JVM暫停所有的應用線程. 這類暫停又被稱為”stop-the-world”(STW)暫停. 觸發STW暫停最常見的原因就是垃圾回收了( github中的一個例子),但不同的JIT活動( 例子),偏向鎖擦除( 例子), 特定的JVMTI操作,以及許多場景也可能會導致應用程序暫停.

    【體系結構】MySQL 日志文件--錯誤日志

    - - CSDN博客數據庫推薦文章
            記錄MySQL Server 啟動和關閉的詳細信息、以及運行過程中較為嚴重的警告和錯誤信息.        為了維護方便需要、有時候會希望將錯誤日志中的內容做備份并重新開始記錄、那么可以:.         MySQL DBA 在遇到問題時應該首先查看該文件.         當出現 MySQL Server 不能正常啟動時、第一個拷問的重點對象應該就是此人.

    Oracle GoldenGate 監控工具:ggserr.log 錯誤日志不可忽視

    - - CSDN博客推薦文章
    Oracle 原廠最近在生產環境的主數據庫安裝了 OEM 12C 的監控插件后,主數據庫對外十幾個庫同步同步的. Oracle GoldenGate 實例出現異常,瘋狂地往 GoldenGate 根目錄的 ggserr.log 輸入出如下錯誤日志:. 2013-02-22 22:33:26  WARNING OGG-01930  Oracle GoldenGate Capture for Oracle, pcqstqz1.prm:  Datastore error in 'dirbdb': BDB0060 PANIC: fatal region error detected; run recovery.

    JVM研究

    - - 開源軟件 - ITeye博客
    每天接客戶的電話都是戰戰兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一點的都有這樣的經歷,那這些問題的最終根結是在哪呢. JVM全稱是Java Virtual Machine,Java虛擬機,也就是在計算機上再虛擬一個計算機,這和我們使用 VMWare不一樣,那個虛擬的東西你是可以看到的,這個JVM你是看不到的,它存在內存中.

    學習JVM的References

    - LightingMan - 淘寶JAVA中間件團隊博客
    本blog中列舉了我學習JVM的references,會不斷的更新,為了避免版權問題,就不在blog上提供references的下載了,感興趣的同學可自行下載或購買,:). |— [ Hotspot GC論文 ]. |— [ 其他JVM GC ]. |— Linux內核源代碼情景分析. |— Linux 內核中斷內幕.

    深入理解JVM

    - 小偉 - ITeye論壇最新討論
    1   Java技術與Java虛擬機. 說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成: Java編程語言、Java類文件格式、Java虛擬機和Java應用程序接口(Java API). 圖1   Java四個方面的關系. 運行期環境代表著Java平臺,開發人員編寫Java代碼(.java文件),然后將之編譯成字節碼(.class文件).
    posted @ 2016-03-02 15:00 小馬歌 閱讀(623) | 評論 (0)編輯 收藏
     

    from:http://www.jameswxx.com/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E8%A7%A3%E5%86%B3dubbo%E9%97%AE%E9%A2%98%EF%BC%9Aforbid-consumer/


    線下環境經常出現類似這種異常:

    com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.0.53.69 access service com.kuaidadi.op.api.pay.service.PayChannelConfigRemoteService from registry 10.0.50.150:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).
    大致意思是當前調用者被禁止訪問某個服務,請檢查下注冊中心訪問列表,還有黑名單和白名單。
    其實線下環境根本沒有對服務做白名單和黑名單機制,因為線下環境給開發人員的賬號是guest,沒有權限做黑白名單。今天有好幾個人問我這個問題,我仔細看了源碼,找出了根源所在。
    根據異常棧,拋出這個異常的代碼在RegistryDirectory的第579行,如下:
    public List<Invoker<T>> doList(Invocation invocation) {
     if (forbidden ) {
         throw new RpcException(RpcException.FORBIDDEN_EXCEPTION , ” Forbid consumer “ +  NetUtils. getLocalHost() + ” access service “ +        getInterface().getName() + ” from registry “ + getUrl().getAddress() + ” use dubbo version “ + Version.getVersion() + “, Please check registry access list (whitelist/blacklist).”);
    }
    如果forbidden變量為true,則拋出該異常。forbidden變量默認為false,那么什么時候變成true了呢?看RegistryDirectory的這段代碼:
    private void refreshInvoker(List<URL> invokerUrls){
       if (invokerUrls != null && invokerUrls.size() == 1 && invokerUrls.get(0) != null && Constants.EMPTY_PROTOCOL .equals(invokerUrls.get(0).getProtocol())) {
                this.forbidden = true; // 禁止訪問
                this.methodInvokerMap = null; // 置空列表
                destroyAllInvokers(); // 關閉所有Invoker
       }
    意思是如果invokerUrls的size為1,并且url的協議頭是Constants.EMPTY_PROTOCOL時,則設置forbidden為false,Constants.EMPTY_PROTOCOL的值是empty。
     
     
    refreshInvoker方法什么時候被調用呢?當某個服務的provider有變化時就會被調用,例如zookeeper上某個服務的provider目錄里的內容發生變化,則zk監聽器會被觸發,由于provider的數量會發生變化,例如有一個新的provider啟動了,有一個provider下線了,所以必須刷新本地的對provider的連接,具體邏輯就在refreshInvoker方法里,這個方法的調用棧如下:
    image_1
    可以確定的是,zookeeper推送的URL的protocol部分不可能無緣無故變成了empty,肯定是由某個地方更改了,于是看一下Constants.EMPTY_PROTOCOL到底有哪些地方調用了,如下:
    image_2
    見圖中紅色圈圈部分,當zookeeper初次訂閱或者訂閱的信息有變更時,都會觸發toUrlsChanged方法,看看這個方法內部都做了什么,完整代碼如下:
         private List<URL> toUrlsWithEmpty(URL consumer, String path, List<String> providers) {
            List<URL> urls = toUrlsWithoutEmpty(consumer, providers);
            if (urls == null || urls.isEmpty()) {
               int i = path.lastIndexOf(‘/’ );
              String category = i < 0 ? path : path.substring(i + 1);
              URL empty = consumer.setProtocol(Constants.EMPTY_PROTOCOL ).addParameter(Constants. CATEGORY_KEY, category);
                urls.add(empty);
            }
            return urls;
        }
    可見如果toUrlsWithoutEmpty的結果是空或者size為0,則強制返回一個protocol為empty的url,看來源頭就在這里了。傳入的List<String> providers實際上就是最新的服務提供者信息,當某個服務沒有任何provider時,providers就變為一個size為o的List了,導致返回一個協議頭為empty的url,進而導致forbidden為true,屏蔽了consumer調用。
    posted @ 2016-02-29 16:24 小馬歌 閱讀(1492) | 評論 (0)編輯 收藏
     
         摘要: 2012/08/28 09:49:49 No CommentsTags: bean, earlySingletonObjects, getBean, recycle reference, singletonFactories, spring, 源碼分析   Posted :java開發, ...  閱讀全文
    posted @ 2016-01-27 14:09 小馬歌 閱讀(475) | 評論 (0)編輯 收藏
     
         摘要: 原文見:http://blog.csdn.net/hzzhoushaoyu/article/details/43273099一、前言部門去年年中開始各種改造,第一步是模塊服務化,這邊初選dubbo試用在一些非重要模塊上,慢慢引入到一些稍微重要的功能上,半年時間,學習過程及線上使用遇到的些問題在此總結下。整理這篇文章差不多花了兩天半時間,請尊重勞動成果,如轉載請注明出處http://blog.csd...  閱讀全文
    posted @ 2016-01-26 17:58 小馬歌 閱讀(756) | 評論 (0)編輯 收藏
     

    毫無疑問,現在Gradle已經成為java世界最火的構建工具,風頭已經蓋過了冗余的ant,落后的maven。Gradle是以Groovy語言編寫的一套構建腳本的DSL,由于Groovy語法的優雅,所以導致Gradle天生就有簡潔、可讀性強、靈活等特性。

    Gradle的命令行功能也非常強大。本人從maven轉到Gradle,深深被gradle強大的命令行功能折服。通過命令行來實現Gradle的各種特性,就像魔法師在表演魔法一樣。

    more
    • 日志輸出。 Gradle中的日志有6個層級。從高到低分別是 ERROR(錯誤信息)、QUIET(重要信息)、WARNGING(警告信息)、LIFECYCLE(進程信息)、INFO(一般信息)、DEBUG(調試信息)。在執行gradle task時可以適時的調整信息輸出等級,以便更方便的觀看執行結果。

    -q(或--quiet)是啟用重要信息級別,該級別下只會輸出自己在命令行下打印的信息及錯誤信息。

    -i(或--info)則會輸出除debug以外的所有信息。

    -d(或--debug)會輸出所有日志信息。

    比如一個build.gradle有這樣一個task。

    task hello << {      println 'hello world!' }

    加入-q與不加-q的輸出結果不同。

    $ gradle hello :hello hello world!  BUILD SUCCESSFUL  Total time: 3.546 secs $ gradle -q hello hello world!
    • 堆棧跟蹤。如果執行gradle task失敗時,如果想得到更詳細的錯誤信息,那么就可以使用-s(或--stacktrace)來輸出詳細的錯誤堆棧。你還可以使用-S(或--full-stacktrace)來輸出全部堆棧信息,不過一般不推薦這樣做,因為gradle是基于groovy語言,而groovy作為一門動態語言可能會輸出與你的錯誤代碼毫不相關的信息。

    • 跳過指定的測試。如果你在執行build的時候想跳過test task,那么可以使用-x命令。

    $ gradle build -x test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :assemble UP-TO-DATE :check :build  BUILD SUCCESSFUL  Total time: 3.529 secs
    • 繼續執行task而忽略前面失敗的task。默認情況下,如果有某個task失敗,后續的task就不會繼續執行。但是有時候我們想運行所有的task來一次性得到所有的構建錯誤,那么我們可以使用--continue命令。使用--continue命令后即使遇到某些task失敗也不會停止后續task的執行。但是需要注意的是如果某個task失敗了,那么依賴于這個task的其他task依舊不會執行,因為這會帶來不安全的因素。

    • 調用task時使用短名或縮寫。如果一個task的名稱過長,那么調用時可以只輸入部分名稱即可調用,無需輸入全名。

    task helloWorld << {      println 'hello world!' }

    比如調用helloWorld可以通過全名調用、前綴調用或首字母調用。

    $ gradle -q helloWorld hello world! $ gradle -q hell hello world! $ gradle -q hW hello world!
    • 使用指定的gradle文件調用task。默認情況下,如果你調用gradle task,那么首先會尋找當前目錄下的build.gradle文件,以及根據settings.gradle中的配置尋找子項目的build.gradle。但是有時候我們想指定使用某個gradle文件,那么可以使用-b命令。 比如當前目錄有個子目錄subproject1,里面有個叫hello.gradle。
    task helloWorld << {      println 'hello world!' }

    那么在當前目錄可以使用以下命令調用這個task。

    $ gradle -b subproject1/hello.gradle  helloWorld :helloWorld hello world!  BUILD SUCCESSFUL  Total time: 3.752 secs
    • 使用指定的項目目錄調用task。前面已經說過,執行gradle的task默認會在當前目錄尋找build.gradle及settings.gradle文件。如果我們想在任何地方執行某個項目的task,那么可以使用-p來指定使用的項目。
    gradle -q -p learnGradle helloWorld

    這條命令是調用learnGradle這個項目下的helloWorld task。

    • 顯示task之間的依賴關系。眾所周知,使用gradle tasks可以列出當前所有可被使用的task,但是并沒有顯示task之間的依賴關系。我們可以加上--all來顯示 task的依賴關系。
    $ gradle tasks --all ………………  Other tasks ----------- task0     task1     task2     task3  …………
    從上面可以看出task0依賴task1、task2及task3。
    • 查看指定階段的依賴關系。使用gradle dependencies 可以查看項目中包的依賴關系。不過是列出了所有階段的依賴,如果項目中依賴復雜的話看起來有點頭痛。那么可以使用--configuration來查看指定階段的依賴情況。
    $ gradle -q dependencies  ------------------------------------------------------------ Root project ------------------------------------------------------------  archives - Configuration for archive artifacts. No dependencies  compile - Compile classpath for source set 'main'. No dependencies  default - Configuration for default artifacts. No dependencies  runtime - Runtime classpath for source set 'main'. No dependencies  testCompile - Compile classpath for source set 'test'. \--- junit:junit:4.11      \--- org.hamcrest:hamcrest-core:1.3  testRuntime - Runtime classpath for source set 'test'. \--- junit:junit:4.11      \--- org.hamcrest:hamcrest-core:1.3

    使用gradle -q dependencies --configuration testCompile可以只查看testComiple的依賴。

    $ gradle -q dependencies --configuration testCompile  ------------------------------------------------------------ Root project ------------------------------------------------------------  testCompile - Compile classpath for source set 'test'. \--- junit:junit:4.11      \--- org.hamcrest:hamcrest-core:1.3
    • 查看指定dependency的依賴情況。 假如我想查看項目中有沒有引入junit,那些階段引入了junit,那么可以使用dependecyInsight來查看。
    $ gradle dependencyInsight --dependency junit --configuration testCompile :dependencyInsight junit:junit:4.11 \--- testCompile

    注意dependencyInsight默認只會查看compile階段的依賴,如果要查看其他階段可以使用--configuration來指定。

    • 使用--profile命令行可以產生build運行時間的報告。該報告存儲在build/report/profile目錄,名稱為build運行的時間。
    $ gradle build --profile :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :assemble UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :check UP-TO-DATE :build UP-TO-DATE  BUILD SUCCESSFUL  Total time: 3.726 secs

    然后在build/report/profile目錄下可以看到build的report。

    這個報表非常有用,尤其是在在縮短build時間時可以快速定位那些耗時長的task。

    • 試運行build。如果你想知道某個task執行時那些task會被一起執行,但是你又不想真正的執行這些task,可以使用-m來試運行。
    $ gradle -m build :compileJava SKIPPED :processResources SKIPPED :classes SKIPPED :jar SKIPPED :assemble SKIPPED :compileTestJava SKIPPED :processTestResources SKIPPED :testClasses SKIPPED :test SKIPPED :check SKIPPED :build SKIPPED  BUILD SUCCESSFUL  Total time: 3.53 secs

    這樣我們可以一目了然的看到那些task被執行了,又不需要花太多的時間。

    • Gradle的圖形界面。

    其實Gradle自帶一個圖形界面來讓習慣gui操作的人來操作Gradle。打開方式很簡單。

    $ gradle --gui

    這樣就會彈出一個gui界面。

    通過這個gui界面可以很方面的執行gradle的各種命令,還可以將常用的命令保存為favorites。該gui的配置信息默認被存儲在當前項目的gradle-app.setting文件中。

    注意使用gradle --gui會阻塞當前終端,可以使用gradle --gui&來實現后臺運行。

    • 重新編譯Gradle腳本。第一次運行Gradle命令,會在項目更目錄下生成一個.gradle目錄來存放編譯后的腳本。只有當構建腳本發生修改時采用重新編譯。我們可以使用--recompile-scripts來強行重新編譯。
    posted @ 2016-01-20 14:46 小馬歌 閱讀(463) | 評論 (0)編輯 收藏
     
         摘要: 原文出處: About Rolandz對很多應用來說,時間和日期的概念都是必須的。像生日,租賃期,事件的時間戳和商店營業時長,等等,都是基于時間和日期的;然而,Java卻沒有好的API來處理它們。在Java SE 8中,添加了一個新包:java.time,它提供了結構良好的API來處理時間和日期。歷史在Java剛剛發布,也就是版本1.0的時候,對時間和日期僅有的支持就是java.util...  閱讀全文
    posted @ 2016-01-20 14:34 小馬歌 閱讀(399) | 評論 (0)編輯 收藏
     

    近來遷移了一些項目到Android Studio,采用Gradle構建確實比原來的Ant方便許多。但是編譯時下載依賴的網速又著實令人蛋疼不已。
    如果能切換到國內的Maven鏡像倉庫,如開源中國的Maven庫,又或者是換成自建的Maven私服,那想必是極好的。
    一個簡單的辦法,修改項目根目錄下的build.gradle,將jcenter()或者mavenCentral()替換掉即可:
    allprojects {
        repositories {
            maven{ url 'http://maven.oschina.net/content/groups/public/'}
        }
    }
    但是架不住項目多,難不成每個都改一遍么?
    自然是有省事的辦法,將下面這段Copy到名為init.gradle文件中,并保存到 USER_HOME/.gradle/文件夾下即可。
    allprojects{
        repositories {
            def REPOSITORY_URL = 'http://maven.oschina.net/content/groups/public'
            all { ArtifactRepository repo ->
                if(repo instanceof MavenArtifactRepository){
                    def url = repo.url.toString()
                    if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                        project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                        remove repo
                    }
                }
            }
            maven {
                url REPOSITORY_URL
            }
        }
    }
    init.gradle文件其實是Gradle的初始化腳本(Initialization Scripts),也是運行時的全局配置。
    更詳細的介紹請參閱 http://gradle.org/docs/current/userguide/init_scripts.html
    Reference
    Dependency Management
    Change Gradle mavenCentral URL to My repo
    What is included in JCenter repository in Gradle?

    posted @ 2016-01-20 11:18 小馬歌 閱讀(591) | 評論 (0)編輯 收藏
    僅列出標題
    共95頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
     
    主站蜘蛛池模板: 亚洲国产免费综合| 国产成人高清亚洲一区久久| 国产精品免费视频一区| 99re6在线精品视频免费播放| 极品色天使在线婷婷天堂亚洲 | 国产成人精品日本亚洲专一区 | 在线观看免费播放av片| 亚洲熟妇无码一区二区三区| 久久久婷婷五月亚洲97号色| 国产精品亚洲mnbav网站| 精品免费久久久久久成人影院| 久久www免费人成看片| 久久伊人免费视频| 在线看片免费人成视频久网下载 | 青青青青青青久久久免费观看 | 亚洲色大成WWW亚洲女子| 亚洲精品国产专区91在线| 亚洲国产无套无码av电影| 久久久久亚洲爆乳少妇无| 亚洲国产精品人人做人人爱| 国产一级淫片a免费播放口之| 最新中文字幕免费视频| 99久久99久久精品免费看蜜桃| 少妇太爽了在线观看免费视频| 久久99免费视频| 爱丫爱丫影院在线观看免费 | 亚洲国产精品无码AAA片| 亚洲伊人久久综合中文成人网| 免费在线观看黄网站| 免费人成在线观看播放国产| 宅男666在线永久免费观看| 日韩在线天堂免费观看| 免费无码不卡视频在线观看| 免费鲁丝片一级在线观看| 麻豆国产人免费人成免费视频| 性xxxx视频播放免费| 日韩免费视频在线观看| 四虎永久成人免费| 亚洲国产成人久久一区WWW| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 欧美最猛性xxxxx免费|