1. 程式人生 > >通向架構師的道路(第四天)之Tomcat效能調優-讓小貓飛奔

通向架構師的道路(第四天)之Tomcat效能調優-讓小貓飛奔

從“第三天”的效能測試一節中,我們得知了決定效能測試的幾個重要指標,它們是:

ü   吞吐量

ü   Responsetime

ü   Cpuload

ü   MemoryUsage

我們也在第三天的學習中對Apache做過了一定的優化,使其最優化上述4大核心指標的讀數,那麼我們的Apache調優了,我們的Tomcat也作些相應的調整,當完成今的課程後,到時你的“小貓”到時真的會“飛”起來的,所以請用心看完,這篇文章一方面用來向那位曾寫過“Tomcat如何承受1000個使用者”的作都的敬,一方面又是這篇原文的一個擴充套件,因為在把原文的知識用到相關的兩個大工程中去後解決了:

1)      承受更大併發使用者數

2)      取得了良好的效能與改善(系統平均效能提升達20倍,極端一個交易達80倍)。

另外值的一提的是,我們當時工程裡用的“小貓”是跑在32位機下的, 也就是我們的JVM最大受到2GB記憶體的限制,都已經跑成“飛”了。。。。。。如果在64位機下跑這頭“小貓”。。。。。。大家可想而知,會得到什麼樣的效果呢?下面就請請詳細的設定吧!

 

二、一切基於JVM(記憶體)的優化

2.1 32位作業系統與64位作業系統中JVM的對比

我們一般的開發人員,基本用的是都是32位的Windows系統,這就導致了一個嚴重的問題即:32位windows系統對記憶體限制,下面先來看一個比較的表格:

作業系統

作業系統位數

記憶體限制

解決辦法

Winxp

32

4GB

超級兔子

Win7

32

4GB

可以通過設定/PAE

Win2003

32

可以突破4GB達16GB

必需要裝win2003 advanced server且要打上sp2補丁

Win7

64

無限制

機器能插多少記憶體,系統記憶體就能支援到多大

Win2003

64

無限制

機器能插多少記憶體,系統記憶體就能支援到多大

Linux

64

無限制

機器能插多少記憶體,系統記憶體就能支援到多大

Unix

64

無限制

機器能插多少記憶體,系統記憶體就能支援到多大

上述問題解決後,我們又碰到一個新的問題,32位系統下JVM對記憶體的限制:不能突破2GB記憶體,即使你在Win2003 Advanced Server下你的機器裝有8GB-16GB的記憶體,而你的JAVA,只能用到2GB的記憶體。

其實我一直很想推薦大家使用Linux或者是Mac作業系統的,而且要裝64位,因為必竟我們是開發用的不是打遊戲用的,而Java源自Unix歸於Unix(Linux只是執行在PC上的Unix而己)。

所以很多開發人員執行在win32位系統上更有甚者在生產環境下都會佈署win32位的系統,那麼這時你的Tomcat要優化,就要講究點技巧了。而在64位作業系統上無論是系統記憶體還是JVM都沒有受到2GB這樣的限制。

Tomcat的優化分成兩塊:

ü   Tomcat啟動命令列中的優化引數即JVM優化

ü   Tomcat容器自身引數的優化(這塊很像ApacheHttp Server)

這一節先要講的是Tomcat啟動命令列中的優化引數。

Tomcat首先跑在JVM之上的,因為它的啟動其實也只是一個java命令列,首先我們需要對這個JAVA的啟動命令列進行調優。

需要注意的是:

這邊討論的JVM優化是基於Oracle Sun的jdk1.6版有以上,其它JDK或者低版本JDK不適用。

Tomcat 的啟動引數位於tomcat的安裝目錄\bin目錄下,如果你是Linux作業系統就是catalina.sh檔案,如果你是Windows作業系統那麼你需要改動的就是catalina.bat檔案。開啟該檔案,一般該檔案頭部是一堆的由##包裹著的註釋文字,找到註釋文字的最後一段如:

# $Id: catalina.sh 522797 2007-03-27 07:10:29Z fhanik $

# -----------------------------------------------------------------------------

# OS specific support.  $var _must_ be set to either true or false.

敲入一個回車,加入如下的引數

Linux系統中tomcat的啟動引數

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

Windows系統中tomcat的啟動引數

set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true

上面引數好多啊,可能有人寫到現在都沒見一個tomcat的啟動命令里加了這麼多引數,當然,這些引數只是我機器上的,不一定適合你,尤其是引數後的value(值)是需要根據你自己的實際情況來設定的。

引數解釋:

ü   -server

我不管你什麼理由,只要你的tomcat是執行在生產環境中的,這個引數必須給我加上

因為tomcat預設是以一種叫java –client的模式來執行的,server即意味著你的tomcat是以真實的production的模式在執行的,這也就意味著你的tomcat以server模式執行時將擁有:更大、更高的併發處理能力,更快更強捷的JVM垃圾回收機制,可以獲得更多的負載與吞吐量。。。更。。。還有更。。。

Y給我記住啊,要不然這個-server都不加,那是要打屁股了。

ü   -Xms–Xmx

即JVM記憶體設定了,把Xms與Xmx兩個值設成一樣是最優的做法,有人說Xms為最小值,Xmx為最大值不是挺好的,這樣設定還比較人性化,科學化。人性?科學?你個頭啊。

大家想一下這樣的場景:

一個系統隨著併發數越來越高,它的記憶體使用情況逐步上升,上升到最高點不能上升了,開始回落,你們不要認為這個回落就是好事情,由其是大起大落,在記憶體回落時它付出的代價是CPU高速開始運轉進行垃圾回收,此時嚴重的甚至會造成你的系統出現“卡殼”就是你在好好的操作,突然網頁像死在那邊一樣幾秒甚至十幾秒時間,因為JVM正在進行垃圾回收。

因此一開始我們就把這兩個設成一樣,使得Tomcat在啟動時就為最大化引數充分利用系統的效率,這個道理和jdbcconnection pool裡的minpool size與maxpool size的需要設成一個數量是一樣的原理。

如何知道我的JVM能夠使用最大值啊?拍腦袋?不行!

在設這個最大記憶體即Xmx值時請先開啟一個命令列,鍵入如下的命令:

看,能夠正常顯示JDK的版本資訊,說明,這個值你能夠用。不是說32位系統下最高能夠使用2GB記憶體嗎?即:2048m,我們不防來試試

可以嗎?不可以!不要說2048m呢,我們小一點,試試1700m如何

嘿嘿,連1700m都不可以,更不要說2048m了呢,2048m只是一個理論數值,這樣說吧我這邊有幾臺機器,有的機器-Xmx1800都沒問題,有的機器最高只能到-Xmx1500m。

因此在設這個-Xms與-Xmx值時一定一定記得先這樣測試一下,要不然直接加在tomcat啟動命令列中你的tomcat就再也起不來了,要飛是飛不了,直接成了一隻瘟貓了。

ü   –Xmn

設定年輕代大小為512m。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

ü   -Xss

是指設定每個執行緒的堆疊大小。這個就要依據你的程式,看一個執行緒 大約需要佔用多少記憶體,可能會有多少執行緒同時執行等。一般不易設定超過1M,要不然容易出現out ofmemory。

ü   -XX:+AggressiveOpts

作用如其名(aggressive),啟用這個引數,則每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(如果有的話)

ü   -XX:+UseBiasedLocking

啟用一個優化了的執行緒鎖,我們知道在我們的appserver,每個http請求就是一個執行緒,有的請求短有的請求長,就會有請求排隊的現象,甚至還會出現執行緒阻塞,這個優化了的執行緒鎖使得你的appserver內對執行緒處理自動進行最優調配。

ü   -XX:PermSize=128M-XX:MaxPermSize=256M

JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;

在資料量的很大的檔案匯出時,一定要把這兩個值設定上,否則會出現記憶體溢位的錯誤。

由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。

那麼,如果是實體記憶體4GB,那麼64分之一就是64MB,這就是PermSize預設值,也就是永生代記憶體初始大小;

四分之一是1024MB,這就是MaxPermSize預設大小。

ü   -XX:+DisableExplicitGC

在程式程式碼中不允許有顯示的呼叫”System.gc()”。看到過有兩個極品工程中每次在DAO操作結束時手動呼叫System.gc()一下,覺得這樣做好像能夠解決它們的out ofmemory問題一樣,付出的代價就是系統響應時間嚴重降低,就和我在關於Xms,Xmx裡的解釋的原理一樣,這樣去呼叫GC導致系統的JVM大起大落,效能不到什麼地方去喲!

ü   -XX:+UseParNewGC

對年輕代採用多執行緒並行回收,這樣收得快。

ü   -XX:+UseConcMarkSweepGC

即CMS gc,這一特性只有jdk1.5即後續版本才具有的功能,它使用的是gc估算觸發和heap佔用觸發。

我們知道頻頻繁的GC會造面JVM的大起大落從而影響到系統的效率,因此使用了CMS GC後可以在GC次數增多的情況下,每次GC的響應時間卻很短,比如說使用了CMS GC後經過jprofiler的觀察,GC被觸發次數非常多,而每次GC耗時僅為幾毫秒。

ü   -XX:MaxTenuringThreshold

設定垃圾最大年齡。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概率。

這個值的設定是根據本地的jprofiler監控後得到的一個理想的值,不能一概而論原搬照抄。

ü   -XX:+CMSParallelRemarkEnabled

在使用UseParNewGC 的情況下, 儘量減少 mark 的時間

ü   -XX:+UseCMSCompactAtFullCollection

在使用concurrent gc 的情況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減少。

ü   -XX:LargePageSizeInBytes

指定 Java heap的分頁頁面大小

ü   -XX:+UseFastAccessorMethods

get,set 方法轉成原生代碼

ü   -XX:+UseCMSInitiatingOccupancyOnly

指示只有在 oldgeneration 在使用了初始化的比例後concurrent collector 啟動收集

ü   -XX:CMSInitiatingOccupancyFraction=70

CMSInitiatingOccupancyFraction,這個引數設定有很大技巧,基本上滿足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不會出現promotion failed。在我的應用中Xmx是6000,Xmn是512,那麼Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還 剩10%的空間是5488*10%=548兆,所以即使Xmn(也就是年輕代共512兆)裡所有物件都搬到年老代裡,548兆的空間也足夠了,所以只要滿 足上面的公式,就不會出現垃圾回收時的promotion failed;

因此這個引數的設定必須與Xmn關聯在一起。

ü   -Djava.awt.headless=true

這個引數一般我們都是放在最後使用的,這全引數的作用是這樣的,有時我們會在我們的J2EE工程中使用一些圖表工具如:jfreechart,用於在web網頁輸出GIF/JPG等流,在winodws環境下,一般我們的app server在輸出圖形時不會碰到什麼問題,但是在linux/unix環境下經常會碰到一個exception導致你在winodws開發環境下圖片顯示的好好可是在linux/unix下卻顯示不出來,因此加上這個引數以免避這樣的情況出現。

上述這樣的配置,基本上可以達到:

ü   系統響應時間增快

ü   JVM回收速度增快同時又不影響系統的響應率

ü   JVM記憶體最大化利用

ü   執行緒阻塞情況最小化

前面我們對Tomcat啟動時的命令進行了優化,增加了系統的JVM可使用數、垃圾回收效率與執行緒阻塞情況、增加了系統響應效率等還有一個很重要的指標,我們沒有去做優化,就是吞吐量。

還記得我們在第三天的學習中說的,這個系統本身可以處理1000,你沒有優化和配置導致它預設只能處理25。因此下面我們來看Tomcat容器內的優化。

開啟tomcat安裝目錄\conf\server.xml檔案,定位到這一行:

<Connector port="8080" protocol="HTTP/1.1"

這一行就是我們的tomcat容器效能引數設定的地方,它一般都會有一個預設值,這些預設值是遠遠不夠我們的使用的,我們來看經過更改後的這一段的配置:

<Connector port="8080" protocol="HTTP/1.1"

          URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

          acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

          useURIValidationHack="false"

                                               compression="on" compressionMinSize="2048"

                                               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

               redirectPort="8443"

/>

好大一陀唉。。。。。。

沒關係,一個個來解釋

ü   URIEncoding=”UTF-8”

使得tomcat可以解析含有中文名的檔案的url,真方便,不像apache裡還有搞個mod_encoding,還要手工編譯

ü   maxSpareThreads

maxSpareThreads 的意思就是如果空閒狀態的執行緒數多於設定的數目,則將這些執行緒中止,減少這個池中的執行緒總數。

ü   minSpareThreads

最小備用執行緒數,tomcat啟動時的初始化的執行緒數。

ü   enableLookups

這個功效和Apache中的HostnameLookups一樣,設為關閉。

ü   connectionTimeout

connectionTimeout為網路連線超時時間毫秒數。

ü   maxThreads

maxThreads Tomcat使用執行緒來處理接收的每個請求。這個值表示Tomcat可建立的最大的執行緒數,即最大併發數。


ü   acceptCount

acceptCount是當執行緒數達到maxThreads後,後續請求會被放入一個等待佇列,這個acceptCount是這個佇列的大小,如果這個佇列也滿了,就直接refuse connection


ü   maxProcessors與minProcessors

在 Java中執行緒是程式執行時的路徑,是在一個程式中與其它控制執行緒無關的、能夠獨立執行的程式碼段。它們共享相同的地址空間。多執行緒幫助程式設計師寫出CPU最 大利用率的高效程式,使空閒時間保持最低,從而接受更多的請求。

通常Windows是1000個左右,Linux是2000個左右。

ü   useURIValidationHack

我們來看一下tomcat中的一段原始碼:

security

        if (connector.getUseURIValidationHack()) {

            String uri = validate(request.getRequestURI());

            if (uri == null) {

                res.setStatus(400);

                res.setMessage("Invalid URI");

                throw new IOException("Invalid URI");

            } else {

                req.requestURI().setString(uri);

                // Redoing the URI decoding

                req.decodedURI().duplicate(req.requestURI());

                req.getURLDecoder().convert(req.decodedURI(), true);

            }

        }

可以看到如果把useURIValidationHack設成"false",可以減少它對一些url的不必要的檢查從而減省開銷。

ü   enableLookups="false"

為了消除DNS查詢對效能的影響我們可以關閉DNS查詢,方式是修改server.xml檔案中的enableLookups引數值。

ü   disableUploadTimeout

類似於Apache中的keeyalive一樣

ü   給Tomcat配置gzip壓縮(HTTP壓縮)功能

compression="on" compressionMinSize="2048"             

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從伺服器端將網頁檔案壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

1)compression="on" 開啟壓縮功能

2)compressionMinSize="2048" 啟用壓縮的輸出內容大小,這裡面預設為2KB

3)noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮

4)compressableMimeType="text/html,text/xml" 壓縮型別

最後不要忘了把8443埠的地方也加上同樣的配置,因為如果我們走https協議的話,我們將會用到8443埠這個段的配置,對吧?

<!--enable tomcat ssl-->

    <Connector port="8443" protocol="HTTP/1.1"

               URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

          acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

          useURIValidationHack="false"

                    compression="on" compressionMinSize="2048"

                    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

                SSLEnabled="true"

           scheme="https" secure="true"

           clientAuth="false" sslProtocol="TLS"

           keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"

      />

好了,所有的Tomcat優化的地方都加上了。結合第三天中的Apache的效能優化,我們這個架構可以“飛奔”起來了,當然這邊把有提及任何關於資料庫優化的步驟,但僅憑這兩步,我們的系統已經有了很大的提升。

舉個真實的例子:上一個專案,經過4輪performance testing,第一輪進行了問題的定位,第二輪就是進行了apache+tomcat/weblogic的優化,第三輪是做叢集優化,第四輪是sql與codes的優化。

在到達第二輪時,我們的效能已經提升了多少倍呢?我們來看一個loaderrunner的截圖吧:


左邊第一列是第一輪沒有經過任何調優的壓力測試報告。

右邊這一列是經過了apache優化,tomcat優化後得到的壓力測試報告。

大家看看,這就提高了多少倍?這還只是在沒有改動程式碼的情況下得到的改善,現在明白了好好的調優一

個apache和tomcat其實是多麼的重要了?如果加上後面的程式碼、SQL的調優、資料庫的調優。。。。。。所以我在上一個工程中有單筆交易效能(無論是吞吐量、響應時間)提高了80倍這樣的極端例子的存在。



相關推薦

通向架構道路Tomcat效能調-飛奔

從“第三天”的效能測試一節中,我們得知了決定效能測試的幾個重要指標,它們是:ü   吞吐量ü   Responsetimeü   Cpuloadü   MemoryUsage我們也在第三天的學習中對Apache做過了一定的優化,使其最優化上述4大核心指標的讀數,那麼我們的Ap

通向架構道路Tomcat效能調

轉自:http://blog.csdn.net/lifetragedy/article/details/7708724 從“第三天”的效能測試一節中,我們得知了決定效能測試的幾個重要指標,它們是: ü   吞吐量 ü   Responsetime ü   Cpulo

通向架構道路apache效能調

在前兩天的學習中我們知道、瞭解並掌握了Web Server結合App Server實現單向Https的這樣的一個架構。這個架構是一個非常基礎的J2ee工程上線佈署時的一種架構。在前兩天的教程中,還講述了Http伺服器、App Server的最基本安全配置(包括單向htt

轉載通向架構道路Tomcat性能調-飛奔

adt val 響應 useragent lec threads 版本升級 基本 oracl 轉載自:https://blog.csdn.net/lifetragedy/article/details/7708724 參考文章:tomcat以及常用web容器線程池的實現原理

通向架構道路漫談使用ThreadLocal改進你的層次的劃分

一、什麼是ThreadLocal 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal為解決多執行緒程式的併發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多執行緒程式。 ThreadLocal很容

通向架構道路漫談基於資料庫的許可權系統的設計

這一天將講述一個基本的基於資料庫的許可權管理系統的設計,在這一天的課程的最後將講述“左右值無限分類實現演算法”如何來優化“系統選單”的結構而告終。今天的內容和前幾天的基礎框架是一樣的它們都屬於基礎知識,在這些基礎知識上還可以擴展出無數的變種與進化設計。 2.1 使用

C語言學習

image 圖片 bsp 語言 c語言學習 學習 clas alt .com C語言學習(第四天)

Tensorflow學習筆記—遞迴神經網路

一、首先下載來源於 Tomas Mikolov 網站上的 PTB 資料集 http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz 二、需要的程式碼: 這裡只簡單的放了一些程式碼

java併發包

同步容器類 Vector與ArrayList區別 ArrayList是最常用的List實現類,內部是通過陣列實現的,它允許對元素進行快速隨機訪問。陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力,就要講已經有陣列的資料複製到新的

ARM彙編混合程式設計

混合程式設計(彙編與高階語言如C、C++的混合程式設計) ---C語言嵌入彙編 ---C語言調用匯編 ---彙編呼叫C語言  ------例項:功能:資料複製 void my_strcpy(char *src,char *des) { char ch; __asm

刷CCF演算法題

試題編號: 201609-2 試題名稱: 火車購票 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   請實現一個鐵路購票系統的簡單座位分配演算法,來處理

python基礎

1、列表的操作: 1 # 增 2 # li = [1, 2, 3, 4] 3 # li.append("abc") 4 # print(li) 5 # 6 # li.insert(2, "eric") # 在下標為2的位置插入 7 # print(li) 8 # 9 # # 刪 1

軟件工程三班組作業完成情況

客戶端 流程圖 未能 操作 服務器 工作 工程 使用 基礎 在前兩天工作的基礎上,今天的工作內容在昨天給出的操作流程圖上繼續進行。期間遇到了一些問題,比如:quality center好像只能安裝在windows server操作系統上面,客戶端使用其實就是通

牛客網NowCoder 2018年全國多校算法寒假訓練營練習比賽A.石油采集(dfs) B.道路建設(最小生成樹prim) C.求交集(暴力) F.Call to your teacher(迪傑斯特拉亂用) H.老子的全排列呢(dfs)

初始 -o 地圖 意義 技術 tle bject ios urn 菜哭了。。。 A.石油采集 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 鏈

sed工具與正則表達式的使用shell

sed工具正則表達式sed工具 【流式編輯器】 —— 非交互,基於模式匹配過濾及修改文本—— 逐行處理,並將結果輸出到屏幕——可實現對文本的輸出,刪除,替換,復制,剪切,導入,導出等各種操作 命令格式:1)前置命令 | sed [選項] ‘條件指令‘ 【利用管道】2)sed [選項] ‘條件指

Vue元件化開發2.元件

Vue 元件化開發 為了好維護管理和程式碼的複用,提高開發效率便於協同開發 分類 頁面級元件: 一個頁面是一個元件 將可複用的部分抽離出來 一個自定義標籤Vue就會把他看成一個嘴賤 div p span a header …可以給這些標籤賦予一定的意義

資料整理——Oracle 18C技術架構部分

19. Database Writer Process (DBWn) 20. Checkpoint Process (CKPT) 21. Manageability Monitor Proc

Linux Unix shell 編程指南學習筆記部分

fcm 驗證 () only arguments line div 反饋 sed 第十六章 shell腳本介紹 此章節內容較為簡單,跳過。 第十七章 條件測試 test命令 expr命令 test 格式 test condition 或者 [

Thinking in Java—— 第二章 一切皆對象

ati 靜態 數據類型 thinking short str 變量 屬於 字符 一.對象保存的位置 寄存器(cpu) 棧(變量) 堆(對象) 靜態域(static) 常量池(string) 非內存區池 二.基本數據類型 整數型 byte short int

Android五ListFragment與ViewPager

viewgroup cat () wid group 得到 ica bottom csdn 1ListFragment 今天首先學習了一種很經常使用的展示場景:列表展示。 昨天學習了使用Fragmet來取代activity進行設計。今天在托管單