Tomcat常用配置詳解

1 目錄結(jié)構(gòu) /bin:腳本文件目錄消约。 /common/lib:存放所有web項(xiàng)目都可以訪問(wèn)的公共jar包(使用Common類加載器加載)幔翰。 /conf:存放配置文件价捧,最重要的是server.xml烈和。 /logs:存放日志文件周拐。 /server/webapps:來(lái)管理Tomcat-web服務(wù)用的塔淤。僅對(duì)TOMCAT可見(jiàn),對(duì)所有的WEB APP都不可見(jiàn)(使用Catalina類加載器加載)速妖。 /shared/lib:僅對(duì)所有WEB APP可見(jiàn)高蜂,對(duì)TOMCAT不可見(jiàn)(使用Shared類加載器加載)。 /temp:Tomcat運(yùn)行時(shí)候存放臨時(shí)文件用的罕容。 /webapps:web應(yīng)用發(fā)布目錄备恤。 /work:Tomcat把各種由jsp生成的servlet文件放在這個(gè)目錄下。刪除后锦秒,啟動(dòng)時(shí)會(huì)自動(dòng)創(chuàng)建露泊。 2 配置文件 server.xml:主要的配置文件。 web.xml:缺省的web app配置旅择,WEB-INF/web.xml會(huì)覆蓋該配置惭笑。 context.xml:不清楚跟server.xml里面的context是否有關(guān)系。 server.xml配置 server標(biāo)簽 port:指定一個(gè)端口生真,這個(gè)端口負(fù)責(zé)監(jiān)聽(tīng)關(guān)閉tomcat的請(qǐng)求沉噩。 shutdown:指定向端口發(fā)送的命令字符串。 service標(biāo)簽 name:指定service的名字柱蟀。 Connector(表示客戶端和service之間的連接)標(biāo)簽 port:指定服務(wù)器端要?jiǎng)?chuàng)建的端口號(hào)川蒙,并在這個(gè)斷口監(jiān)聽(tīng)來(lái)自客戶端的請(qǐng)求。 minProcessors:服務(wù)器啟動(dòng)時(shí)創(chuàng)建的處理請(qǐng)求的線程數(shù)长已。 maxProcessors:最大可以創(chuàng)建的處理請(qǐng)求的線程數(shù)畜眨。 enableLookups:如果為true,則可以通過(guò)調(diào)用request.getRemoteHost()進(jìn)行DNS查詢來(lái)得到遠(yuǎn)程客戶端的實(shí)際主機(jī)名术瓮,若為false則不進(jìn)行DNS查詢康聂,而是返回其ip地址。 redirectPort:指定服務(wù)器正在處理http請(qǐng)求時(shí)收到了一個(gè)SSL傳輸請(qǐng)求后重定向的端口號(hào)胞四。 acceptCount:指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí)恬汁,可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理撬讽。 connectionTimeout:指定超時(shí)的時(shí)間數(shù)(以毫秒為單位)蕊连。 Engine(表示指定service中的請(qǐng)求處理機(jī)悬垃,接收和處理來(lái)自Connector的請(qǐng)求)標(biāo)簽 defaultHost:指定缺省的處理請(qǐng)求的主機(jī)名,它至少與其中的一個(gè)host元素的name屬性值是一樣的甘苍。 Context(表示一個(gè)web應(yīng)用程序尝蠕,通常為WAR文件,關(guān)于WAR的具體信息見(jiàn)servlet規(guī)范)標(biāo)簽 docBase:該web應(yīng)用的文檔基準(zhǔn)目錄(Document Base载庭,也稱為Context Root)看彼,或者是WAR文件的路徑∏艟郏可以使用絕對(duì)路徑靖榕,也可以使用相對(duì)于context所屬的Host的appBase路徑。 path:表示此web應(yīng)用程序的url的前綴顽铸,這樣請(qǐng)求的url為http://localhost:8080/path/****茁计。 reloadable:這個(gè)屬性非常重要,如果為true谓松,則tomcat會(huì)自動(dòng)檢測(cè)應(yīng)用程序的/WEB-INF/lib和/WEB-INF/classes目錄的變化星压,自動(dòng)裝載新的應(yīng)用程序,我們可以在不重起tomcat的情況下改變應(yīng)用程序鬼譬。 useNaming:如果希望Catalina為該web應(yīng)用使能一個(gè)JNDI InitialContext對(duì)象娜膘,設(shè)為true。該InitialialContext符合J2EE平臺(tái)的約定优质,缺省值為true竣贪。 workDir:Context提供的臨時(shí)目錄的路徑,用于servlet的臨時(shí)讀/寫巩螃。利用javax.servlet.context.tempdir屬性演怎,servlet可以訪問(wèn)該目錄。如果沒(méi)有指定牺六,使用$CATALINA_HOME/work下一個(gè)合適的目錄颤枪。 swallowOutput:如果該值為true,System.out和System.err的輸出被重定向到web應(yīng)用的logger淑际。如果沒(méi)有指定,缺省值為false debug:與這個(gè)Engine關(guān)聯(lián)的Logger記錄的調(diào)試信息的詳細(xì)程度扇住。數(shù)字越大春缕,輸出越詳細(xì)。如果沒(méi)有指定艘蹋,缺省為0锄贼。 host(表示一個(gè)虛擬主機(jī))標(biāo)簽 name:指定主機(jī)名。 appBase:應(yīng)用程序基本目錄女阀,即存放應(yīng)用程序的目錄宅荤。 unpackWARs:如果為true屑迂,則tomcat會(huì)自動(dòng)將WAR文件解壓,否則不解壓冯键,直接從WAR文件中運(yùn)行應(yīng)用程序惹盼。 Logger(表示日志,調(diào)試和錯(cuò)誤信息)標(biāo)簽 className:指定logger使用的類名惫确,此類必須實(shí)現(xiàn)org.apache.catalina.Logger接口手报。 prefix:指定log文件的前綴。 suffix:指定log文件的后綴改化。 timestamp:如果為true掩蛤,則log文件名中要加入時(shí)間,如下例:localhost_log.2001-10-04.txt陈肛。 Realm(表示存放用戶名揍鸟,密碼及role的數(shù)據(jù)庫(kù))標(biāo)簽 className:指定Realm使用的類名,此類必須實(shí)現(xiàn)org.apache.catalina.Realm接口句旱。 Valve(功能與Logger差不多阳藻,其prefix和suffix屬性解釋和Logger 中的一樣)標(biāo)簽 className:指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應(yīng)用程序的訪問(wèn)信息前翎。 directory:指定log文件存放的位置稚配。 pattern:有兩個(gè)值,common方式記錄遠(yuǎn)程主機(jī)名或ip地址港华,用戶名道川,日期,第一行請(qǐng)求的字符串立宜,HTTP響應(yīng)代碼冒萄,發(fā)送的字節(jié)數(shù)。combined方式比common方式記錄的值更多橙数。 3 配置虛擬目錄 1)直接部署到webapps目錄下面訪問(wèn)尊流。 2)修改conf/server.xml文件。在中加入灯帮。docBase目錄默認(rèn)使用appBase="webapps"這個(gè)目錄崖技。也可以是絕對(duì)路徑。 配置主目錄钟哥,可以將path=""迎献。 3)當(dāng)項(xiàng)目沒(méi)有放在webapps目錄下時(shí),可以在conf/Catalina/localhost新建一個(gè)XXX.XML文件腻贰。里面加入吁恍。 注意:這里的path屬性不需要設(shè)置,設(shè)置了也不會(huì)起作用的。 也可以使用該方法建立主目錄指向另一個(gè)目錄冀瓦,例如:命名為ROOT.xml伴奥,這樣默認(rèn)訪問(wèn)的主目錄就被修改過(guò)了。 4 配置連接數(shù) maxThreads:Tomcat使用線程來(lái)處理接收的每個(gè)請(qǐng)求翼闽。這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù)拾徙。 acceptCount:指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù)肄程,超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理锣吼。 minSpareThreads:Tomcat初始化時(shí)創(chuàng)建的線程數(shù)。 maxSpareThreads:一旦創(chuàng)建的線程超過(guò)這個(gè)值蓝厌,Tomcat就會(huì)關(guān)閉不再需要的socket線程玄叠。 enableLookups:是否反查域名,取值為:true或false拓提。為了提高處理能力读恃,應(yīng)設(shè)置為false connectionTimeout:網(wǎng)絡(luò)連接超時(shí),單位:毫秒代态。設(shè)置為0表示永不超時(shí)寺惫,這樣設(shè)置有隱患的。默認(rèn)可設(shè)置為20000毫秒蹦疑。 web server允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置西雀,通常Windows是2000個(gè)左右,Linux是1000個(gè)左右歉摧。 5 配置內(nèi)存大小 修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m艇肴。 Xms指最小內(nèi)存,Xmx指最大內(nèi)存叁温。 6 安全配置 1)將SHUTDOWN修改為其他一些字符串再悼。否則就容易被人給停止掉了。 2)對(duì)應(yīng)tomcat3.1中膝但,屏蔽目錄文件自動(dòng)列出 修改conf/web.xml中的defaultorg.apache.catalina.servlets.DefaultServletdebug0listingstrue13)訪問(wèn)日志設(shè)置 在server.xml中加入這樣訪問(wèn)日志會(huì)記錄到Logs中冲九。 4)修改用戶名、密碼 conf/tomcat-users.xml 5)屏蔽后臺(tái)管理入口 方法一:從控制用戶和權(quán)限著手跟束。廢掉要管理權(quán)限的用戶就可以了莺奸。 方法二:將conf/Catalina/localhost/manager.xml改名。 6)配置403,404,500錯(cuò)誤頁(yè)面 默認(rèn)情況下冀宴,報(bào)出HTTP錯(cuò)誤的時(shí)候會(huì)暴露tomcat版本號(hào)憾筏。如果不想暴露的話,就需要重新定義錯(cuò)誤跳轉(zhuǎn)頁(yè)面花鹅。401/401.jsp404/404.jsp500/500.jsp注意:在測(cè)試的時(shí)候碰到一個(gè)奇怪的現(xiàn)象,平時(shí)項(xiàng)目里面的時(shí)候測(cè)試正常的枫浙∨偎啵可是今天在tomcat目錄里面新建一個(gè)測(cè)試目錄測(cè)試并不能跳轉(zhuǎn)到指定錯(cuò)誤頁(yè)面古拴。暫時(shí)不知道為什么。 7 配置Log4j日志記錄 項(xiàng)目中拋出的異常真友,拋到tomcat中的異常會(huì)被tomcat記錄下來(lái)黄痪,存放至logs/localhost.yyyy-MM-dd.log文件中。 平時(shí)我們?cè)陧?xiàng)目中使用的log4j記錄日志跟tomcat是沒(méi)有任何關(guān)系的盔然,是獨(dú)立的一個(gè)程序桅打,記錄的文件是自定義的。 我們可以在tomcat中定義一個(gè)log4j的公共日志處理方式愈案,這樣在項(xiàng)目中就不需要在定義log4j的配置了挺尾。 1)將log4j-1.2.15.jar加入到commonlib目錄。 2)將log4j.properties加入到commonclasses目錄站绪。 內(nèi)容例如: # Output pattern : date [thread] priority category - message log4j.rootLogger=DEUBG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #3rd party library level log4j.logger.org.hibernate.cache=ERROR 注意:我們項(xiàng)目中使用e.printStackTrace();輸出的異常會(huì)在控制臺(tái)輸出來(lái)遭铺,但是,不會(huì)記錄到tomcat日志中恢准。 而且魂挂,也不會(huì)記錄到log4j的日志中。要想記錄到log4j日志中馁筐,必須使用log4j輸出來(lái)涂召。 所以,實(shí)際上web項(xiàng)目中進(jìn)行異常處理應(yīng)該將e.printStackTrace();寫寫法多改成log4j的形式才對(duì)敏沉! 但是果正,實(shí)際項(xiàng)目中很多項(xiàng)目多偷懶使用了e.printStackTrace();方式輸出異常。當(dāng)出現(xiàn)異常的時(shí)候在控制臺(tái)上查看一下就可以了赦抖,也不考慮實(shí)際運(yùn)行時(shí)候的維護(hù)舱卡。假如有人不小心關(guān)了控制臺(tái),那么队萤,你不就看不到異常了嗎轮锥? 個(gè)人介意使用log4j的形式記入web異常! 8 Tomcat5亂碼問(wèn)題 Tomcat5跟Tomcat4對(duì)參數(shù)處理是不一樣的要尔,在Tomcat4中g(shù)et與post的編碼是一樣的舍杜,所以只要在過(guò)濾器中通過(guò)request.setCharacterEncoding()設(shè)定一次就可以解決get與set的問(wèn)題。然而赵辕,在Tomcat5中既绩,get與post的處理是分開(kāi)的,對(duì)get請(qǐng)求使用URIEncoding進(jìn)行處理还惠,對(duì)post使用request.setCharacterEncoding()處理饲握。Tomcat5中,在server.xml的Connector元素增加了以下配置參數(shù): URIEncoding:用來(lái)設(shè)定通過(guò)URI傳遞的#########################################################################################################################從“第三天”的性能測(cè)試一節(jié)中,我們得知了決定性能測(cè)試的幾個(gè)重要指標(biāo)救欧,它們是:ü 吞吐量ü Responsetimeü Cpuloadü MemoryUsage我 們也在第三天的學(xué)習(xí)中對(duì)Apache做過(guò)了一定的優(yōu)化衰粹,使其最優(yōu)化上述4大核心指標(biāo)的讀數(shù),那么我們的Apache調(diào)優(yōu)了笆怠,我們的Tomcat也作些相應(yīng) 的調(diào)整铝耻,當(dāng)完成今的課程后,到時(shí)你的“小貓”到時(shí)真的會(huì)“飛”起來(lái)的蹬刷,所以請(qǐng)用心看完瓢捉,這篇文章一方面用來(lái)向那位曾寫過(guò)“Tomcat如何承受1000個(gè) 用戶”的作都的敬,一方面又是這篇原文的一個(gè)擴(kuò)展办成,因?yàn)樵诎言牡闹R(shí)用到相關(guān)的兩個(gè)大工程中去后解決了:1) 承受更大并發(fā)用戶數(shù)2) 取得了良好的性能與改善(系統(tǒng)平均性能提升達(dá)20倍泡态,極端一個(gè)交易達(dá)80倍)。另外值的一提的是诈火,我們當(dāng)時(shí)工程里用的“小貓”是跑在32位機(jī)下的兽赁, 也就是我們的JVM最大受到2GB內(nèi)存的限制,都已經(jīng)跑成“飛”了冷守。刀崖。。拍摇。亮钦。。如果在64位機(jī)下跑這頭“小貓”充活。蜂莉。。混卵。映穗。。大家可想而知幕随,會(huì)得到什么樣的效果呢蚁滋?下面就請(qǐng)請(qǐng)?jiān)敿?xì)的設(shè)置吧! 二赘淮、一切基于JVM(內(nèi)存)的優(yōu)化2.1 32位操作系統(tǒng)與64位操作系統(tǒng)中JVM的對(duì)比我們一般的開(kāi)發(fā)人員辕录,基本用的是都是32位的Windows系統(tǒng),這就導(dǎo)致了一個(gè)嚴(yán)重的問(wèn)題即:32位windows系統(tǒng)對(duì)內(nèi)存限制梢卸,下面先來(lái)看一個(gè)比較的表格:操作系統(tǒng)操作系統(tǒng)位數(shù)內(nèi)存限制解決辦法Winxp324GB超級(jí)兔子Win7324GB可以通過(guò)設(shè)置/PAEWin200332可以突破4GB達(dá)16GB必需要裝win2003 advanced server且要打上sp2補(bǔ)丁Win764無(wú)限制機(jī)器能插多少內(nèi)存走诞,系統(tǒng)內(nèi)存就能支持到多大Win200364無(wú)限制機(jī)器能插多少內(nèi)存,系統(tǒng)內(nèi)存就能支持到多大Linux64無(wú)限制機(jī)器能插多少內(nèi)存蛤高,系統(tǒng)內(nèi)存就能支持到多大Unix64無(wú)限制機(jī)器能插多少內(nèi)存蚣旱,系統(tǒng)內(nèi)存就能支持到多大上述問(wèn)題解決后碑幅,我們又碰到一個(gè)新的問(wèn)題,32位系統(tǒng)下JVM對(duì)內(nèi)存的限制:不能突破2GB內(nèi)存姻锁,即使你在Win2003 Advanced Server下你的機(jī)器裝有8GB-16GB的內(nèi)存枕赵,而你的JAVA,只能用到2GB的內(nèi)存位隶。其實(shí)我一直很想推薦大家使用Linux或者是Mac操作系統(tǒng)的,而且要裝64位开皿,因?yàn)楸鼐刮覀兪情_(kāi)發(fā)用的不是打游戲用的涧黄,而Java源自Unix歸于Unix(Linux只是運(yùn)行在PC上的Unix而己)。所以很多開(kāi)發(fā)人員運(yùn)行在win32位系統(tǒng)上更有甚者在生產(chǎn)環(huán)境下都會(huì)布署win32位的系統(tǒng)赋荆,那么這時(shí)你的Tomcat要優(yōu)化笋妥,就要講究點(diǎn)技巧了。而在64位操作系統(tǒng)上無(wú)論是系統(tǒng)內(nèi)存還是JVM都沒(méi)有受到2GB這樣的限制窄潭。Tomcat的優(yōu)化分成兩塊:ü Tomcat啟動(dòng)命令行中的優(yōu)化參數(shù)即JVM優(yōu)化ü Tomcat容器自身參數(shù)的優(yōu)化(這塊很像ApacheHttp Server)這一節(jié)先要講的是Tomcat啟動(dòng)命令行中的優(yōu)化參數(shù)春宣。Tomcat首先跑在JVM之上的,因?yàn)樗膯?dòng)其實(shí)也只是一個(gè)java命令行嫉你,首先我們需要對(duì)這個(gè)JAVA的啟動(dòng)命令行進(jìn)行調(diào)優(yōu)月帝。需要注意的是:這邊討論的JVM優(yōu)化是基于Oracle Sun的jdk1.6版有以上,其它JDK或者低版本JDK不適用幽污。2.2 Tomcat啟動(dòng)行參數(shù)的優(yōu)化Tomcat 的啟動(dòng)參數(shù)位于tomcat的安裝目錄\bin目錄下嚷辅,如果你是Linux操作系統(tǒng)就是catalina.sh文件,如果你是Windows操作系統(tǒng)那么 你需要改動(dòng)的就是catalina.bat文件距误。打開(kāi)該文件簸搞,一般該文件頭部是一堆的由##包裹著的注釋文字,找到注釋文字的最后一段如:# $Id: catalina.sh 522797 2007-03-27 07:10:29Z fhanik $# ----------------------------------------------------------------------------- # OS specific support. $var _must_ be set to either true or false.敲入一個(gè)回車准潭,加入如下的參數(shù)Linux系統(tǒng)中tomcat的啟動(dòng)參數(shù)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系統(tǒng)中tomcat的啟動(dòng)參數(shù)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上面參數(shù)好多啊趁俊,可能有人寫到現(xiàn)在都沒(méi)見(jiàn)一個(gè)tomcat的啟動(dòng)命令里加了這么多參數(shù),當(dāng)然刑然,這些參數(shù)只是我機(jī)器上的寺擂,不一定適合你,尤其是參數(shù)后的value(值)是需要根據(jù)你自己的實(shí)際情況來(lái)設(shè)置的闰集。參數(shù)解釋:ü -server我不管你什么理由沽讹,只要你的tomcat是運(yùn)行在生產(chǎn)環(huán)境中的,這個(gè)參數(shù)必須給我加上因 為tomcat默認(rèn)是以一種叫java –client的模式來(lái)運(yùn)行的武鲁,server即意味著你的tomcat是以真實(shí)的production的模式在運(yùn)行的爽雄,這也就意味著你的tomcat以 server模式運(yùn)行時(shí)將擁有:更大、更高的并發(fā)處理能力沐鼠,更快更強(qiáng)捷的JVM垃圾回收機(jī)制挚瘟,可以獲得更多的負(fù)載與吞吐量叹谁。。乘盖。更焰檩。。订框。還有更析苫。。穿扳。Y給我記住啊衩侥,要不然這個(gè)-server都不加,那是要打屁股了矛物。ü -Xms–Xmx即JVM內(nèi)存設(shè)置了茫死,把Xms與Xmx兩個(gè)值設(shè)成一樣是最優(yōu)的做法,有人說(shuō)Xms為最小值履羞,Xmx為最大值不是挺好的峦萎,這樣設(shè)置還比較人性化,科學(xué)化忆首。人性爱榔?科學(xué)?你個(gè)頭啊雄卷。大家想一下這樣的場(chǎng)景:一 個(gè)系統(tǒng)隨著并發(fā)數(shù)越來(lái)越高搓蚪,它的內(nèi)存使用情況逐步上升,上升到最高點(diǎn)不能上升了丁鹉,開(kāi)始回落妒潭,你們不要認(rèn)為這個(gè)回落就是好事情,由其是大起大落揣钦,在內(nèi)存回落 時(shí)它付出的代價(jià)是CPU高速開(kāi)始運(yùn)轉(zhuǎn)進(jìn)行垃圾回收雳灾,此時(shí)嚴(yán)重的甚至?xí)斐赡愕南到y(tǒng)出現(xiàn)“卡殼”就是你在好好的操作,突然網(wǎng)頁(yè)像死在那邊一樣幾秒甚至十幾秒 時(shí)間冯凹,因?yàn)镴VM正在進(jìn)行垃圾回收谎亩。因此一開(kāi)始我們就把這兩個(gè)設(shè)成一樣,使得Tomcat在啟動(dòng)時(shí)就為最大化參數(shù)充分利用系統(tǒng)的效率宇姚,這個(gè)道理和jdbcconnection pool里的minpool size與maxpool size的需要設(shè)成一個(gè)數(shù)量是一樣的原理匈庭。如何知道我的JVM能夠使用最大值啊浑劳?拍腦袋阱持?不行!在設(shè)這個(gè)最大內(nèi)存即Xmx值時(shí)請(qǐng)先打開(kāi)一個(gè)命令行魔熏,鍵入如下的命令:看衷咽,能夠正常顯示JDK的版本信息鸽扁,說(shuō)明,這個(gè)值你能夠用镶骗。不是說(shuō)32位系統(tǒng)下最高能夠使用2GB內(nèi)存嗎桶现?即:2048m,我們不防來(lái)試試可以嗎鼎姊?不可以骡和!不要說(shuō)2048m呢,我們小一點(diǎn)此蜈,試試1700m如何嘿嘿即横,連1700m都不可以,更不要說(shuō)2048m了呢裆赵,2048m只是一個(gè)理論數(shù)值,這樣說(shuō)吧我這邊有幾臺(tái)機(jī)器跺嗽,有的機(jī)器-Xmx1800都沒(méi)問(wèn)題战授,有的機(jī)器最高只能到-Xmx1500m。因此在設(shè)這個(gè)-Xms與-Xmx值時(shí)一定一定記得先這樣測(cè)試一下桨嫁,要不然直接加在tomcat啟動(dòng)命令行中你的tomcat就再也起不來(lái)了植兰,要飛是飛不了,直接成了一只瘟貓了璃吧。ü –Xmn設(shè)置年輕代大小為512m楣导。整個(gè)堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m畜挨,所以增大年輕代后筒繁,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大巴元,Sun官方推薦配置為整個(gè)堆的3/8毡咏。ü -Xss是指設(shè)定每個(gè)線程的堆棧大小。這個(gè)就要依據(jù)你的程序逮刨,看一個(gè)線程 大約需要占用多少內(nèi)存呕缭,可能會(huì)有多少線程同時(shí)運(yùn)行等。一般不易設(shè)置超過(guò)1M修己,要不然容易出現(xiàn)out ofmemory恢总。ü -XX:+AggressiveOpts作用如其名(aggressive),啟用這個(gè)參數(shù)睬愤,則每當(dāng)JDK版本升級(jí)時(shí)片仿,你的JVM都會(huì)使用最新加入的優(yōu)化技術(shù)(如果有的話)ü -XX:+UseBiasedLocking啟用一個(gè)優(yōu)化了的線程鎖,我們知道在我們的appserver戴涝,每個(gè)http請(qǐng)求就是一個(gè)線程滋戳,有的請(qǐng)求短有的請(qǐng)求長(zhǎng)钻蔑,就會(huì)有請(qǐng)求排隊(duì)的現(xiàn)象,甚至還會(huì)出現(xiàn)線程阻塞奸鸯,這個(gè)優(yōu)化了的線程鎖使得你的appserver內(nèi)對(duì)線程處理自動(dòng)進(jìn)行最優(yōu)調(diào)配咪笑。ü -XX:PermSize=128M-XX:MaxPermSize=256MJVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64娄涩;在數(shù)據(jù)量的很大的文件導(dǎo)出時(shí)窗怒,一定要把這兩個(gè)值設(shè)置上,否則會(huì)出現(xiàn)內(nèi)存溢出的錯(cuò)誤蓄拣。由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小扬虚,默認(rèn)是物理內(nèi)存的1/4。那么球恤,如果是物理內(nèi)存4GB辜昵,那么64分之一就是64MB,這就是PermSize默認(rèn)值咽斧,也就是永生代內(nèi)存初始大锌爸谩;四分之一是1024MB张惹,這就是MaxPermSize默認(rèn)大小舀锨。ü -XX:+DisableExplicitGC在 程序代碼中不允許有顯示的調(diào)用”System.gc()”⊥鸲海看到過(guò)有兩個(gè)極品工程中每次在DAO操作結(jié)束時(shí)手動(dòng)調(diào)用System.gc()一下坎匿,覺(jué)得這樣 做好像能夠解決它們的out ofmemory問(wèn)題一樣,付出的代價(jià)就是系統(tǒng)響應(yīng)時(shí)間嚴(yán)重降低雷激,就和我在關(guān)于Xms,Xmx里的解釋的原理一樣替蔬,這樣去調(diào)用GC導(dǎo)致系統(tǒng)的JVM大起大 落,性能不到什么地方去喲侥锦!ü -XX:+UseParNewGC對(duì)年輕代采用多線程并行回收进栽,這樣收得快。ü -XX:+UseConcMarkSweepGC即CMS gc恭垦,這一特性只有jdk1.5即后續(xù)版本才具有的功能快毛,它使用的是gc估算觸發(fā)和heap占用觸發(fā)。我們知道頻頻繁的GC會(huì)造面JVM的大起大落從而影響到系統(tǒng)的效率,因此使用了CMS GC后可以在GC次數(shù)增多的情況下,每次GC的響應(yīng)時(shí)間卻很短翁脆,比如說(shuō)使用了CMS GC后經(jīng)過(guò)jprofiler的觀察嗦嗡,GC被觸發(fā)次數(shù)非常多风喇,而每次GC耗時(shí)僅為幾毫秒。ü -XX:MaxTenuringThreshold設(shè) 置垃圾最大年齡。如果設(shè)置為0的話叹括,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū)瀑晒,直接進(jìn)入年老代绍坝。對(duì)于年老代比較多的應(yīng)用,可以提高效率苔悦。如果將此值設(shè)置為一 個(gè)較大值轩褐,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象再年輕代的存活時(shí)間玖详,增加在年輕代即被回收的概率把介。這個(gè)值的設(shè)置是根據(jù)本地的jprofiler監(jiān)控后得到的一個(gè)理想的值,不能一概而論原搬照抄蟋座。ü -XX:+CMSParallelRemarkEnabled在使用UseParNewGC 的情況下, 盡量減少 mark 的時(shí)間ü -XX:+UseCMSCompactAtFullCollection在使用concurrent gc 的情況下, 防止 memoryfragmention, 對(duì)live object 進(jìn)行整理, 使 memory 碎片減少拗踢。ü -XX:LargePageSizeInBytes指定 Java heap的分頁(yè)頁(yè)面大小ü -XX:+UseFastAccessorMethodsget,set 方法轉(zhuǎn)成本地代碼ü -XX:+UseCMSInitiatingOccupancyOnly指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 啟動(dòng)收集ü -XX:CMSInitiatingOccupancyFraction=70CMSInitiatingOccupancyFraction,這個(gè)參數(shù)設(shè)置有很大技巧向臀,基本上滿足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不會(huì)出現(xiàn)promotion failed巢墅。在我的應(yīng)用中Xmx是6000,Xmn是512券膀,那么Xmx-Xmn是5488兆砂缩,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說(shuō)明年老代到90%滿的時(shí)候開(kāi)始執(zhí)行對(duì)年老代的并發(fā)垃圾回收(CMS)三娩,這時(shí)還 剩10%的空間是5488*10%=548兆,所以即使Xmn(也就是年輕代共512兆)里所有對(duì)象都搬到年老代里妹懒,548兆的空間也足夠了雀监,所以只要滿 足上面的公式,就不會(huì)出現(xiàn)垃圾回收時(shí)的promotion failed眨唬;因此這個(gè)參數(shù)的設(shè)置必須與Xmn關(guān)聯(lián)在一起会前。ü -Djava.awt.headless=true這 個(gè)參數(shù)一般我們都是放在最后使用的,這全參數(shù)的作用是這樣的匾竿,有時(shí)我們會(huì)在我們的J2EE工程中使用一些圖表工具如:jfreechart瓦宜,用于在web 網(wǎng)頁(yè)輸出GIF/JPG等流,在winodws環(huán)境下岭妖,一般我們的app server在輸出圖形時(shí)不會(huì)碰到什么問(wèn)題临庇,但是在linux/unix環(huán)境下經(jīng)常會(huì)碰到一個(gè)exception導(dǎo)致你在winodws開(kāi)發(fā)環(huán)境下圖片顯 示的好好可是在linux/unix下卻顯示不出來(lái),因此加上這個(gè)參數(shù)以免避這樣的情況出現(xiàn)昵慌。上述這樣的配置假夺,基本上可以達(dá)到:ü 系統(tǒng)響應(yīng)時(shí)間增快ü JVM回收速度增快同時(shí)又不影響系統(tǒng)的響應(yīng)率ü JVM內(nèi)存最大化利用ü 線程阻塞情況最小化2.3 Tomcat容器內(nèi)的優(yōu)化前面我們對(duì)Tomcat啟動(dòng)時(shí)的命令進(jìn)行了優(yōu)化,增加了系統(tǒng)的JVM可使用數(shù)斋攀、垃圾回收效率與線程阻塞情況已卷、增加了系統(tǒng)響應(yīng)效率等還有一個(gè)很重要的指標(biāo),我們沒(méi)有去做優(yōu)化淳蔼,就是吞吐量侧蘸。還記得我們?cè)诘谌斓膶W(xué)習(xí)中說(shuō)的裁眯,這個(gè)系統(tǒng)本身可以處理1000,你沒(méi)有優(yōu)化和配置導(dǎo)致它默認(rèn)只能處理25讳癌。因此下面我們來(lái)看Tomcat容器內(nèi)的優(yōu)化穿稳。打開(kāi)tomcat安裝目錄\conf\server.xml文件,定位到這一行:這一行就是我們的tomcat容器性能參數(shù)設(shè)置的地方析桥,它一般都會(huì)有一個(gè)默認(rèn)值司草,這些默認(rèn)值是遠(yuǎn)遠(yuǎn)不夠我們的使用的,我們來(lái)看經(jīng)過(guò)更改后的這一段的配置: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"/>好大一陀唉泡仗。埋虹。。娩怎。搔课。。沒(méi)關(guān)系截亦,一個(gè)個(gè)來(lái)解釋ü URIEncoding=”UTF-8”使得tomcat可以解析含有中文名的文件的url爬泥,真方便,不像apache里還有搞個(gè)mod_encoding崩瓤,還要手工編譯ü maxSpareThreadsmaxSpareThreads 的意思就是如果空閑狀態(tài)的線程數(shù)多于設(shè)置的數(shù)目袍啡,則將這些線程中止,減少這個(gè)池中的線程總數(shù)却桶。ü minSpareThreads最小備用線程數(shù)境输,tomcat啟動(dòng)時(shí)的初始化的線程數(shù)。ü enableLookups這個(gè)功效和Apache中的HostnameLookups一樣颖系,設(shè)為關(guān)閉嗅剖。ü connectionTimeoutconnectionTimeout為網(wǎng)絡(luò)連接超時(shí)時(shí)間毫秒數(shù)。ü maxThreadsmaxThreads Tomcat使用線程來(lái)處理接收的每個(gè)請(qǐng)求嘁扼。這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù)信粮,即最大并發(fā)數(shù)。ü acceptCountacceptCount是當(dāng)線程數(shù)達(dá)到maxThreads后趁啸,后續(xù)請(qǐng)求會(huì)被放入一個(gè)等待隊(duì)列强缘,這個(gè)acceptCount是這個(gè)隊(duì)列的大小莲绰,如果這個(gè)隊(duì)列也滿了欺旧,就直接refuse connectionü maxProcessors與minProcessors在 Java中線程是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線程無(wú)關(guān)的蛤签、能夠獨(dú)立運(yùn)行的代碼段辞友。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時(shí)間保持最低称龙,從而接受更多的請(qǐng)求留拾。通常Windows是1000個(gè)左右,Linux是2000個(gè)左右鲫尊。ü useURIValidationHack我們來(lái)看一下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設(shè)成"false"痴柔,可以減少它對(duì)一些url的不必要的檢查從而減省開(kāi)銷。ü enableLookups="false"為了消除DNS查詢對(duì)性能的影響我們可以關(guān)閉DNS查詢疫向,方式是修改server.xml文件中的enableLookups參數(shù)值咳蔚。ü disableUploadTimeout類似于Apache中的keeyalive一樣ü 給Tomcat配置gzip壓縮(HTTP壓縮)功能compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是搔驼,在客戶端請(qǐng)求網(wǎng)頁(yè)后谈火,從服務(wù)器端將網(wǎng)頁(yè)文件壓縮,再下載到客戶端舌涨,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽糯耍。相對(duì) 于普通的瀏覽過(guò)程HTML,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量囊嘉。更為重要的是温技,它可以對(duì)動(dòng)態(tài)生成的,包括CGI扭粱、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁(yè)也能進(jìn)行壓縮舵鳞,壓縮效率驚人。1)compression="on" 打開(kāi)壓縮功能2)compressionMinSize="2048" 啟用壓縮的輸出內(nèi)容大小琢蛤,這里面默認(rèn)為2KB3)noCompressionUserAgents="gozilla, traviata" 對(duì)于以下的瀏覽器系任,不啟用壓縮4)compressableMimeType="text/html,text/xml" 壓縮類型最后不要忘了把8443端口的地方也加上同樣的配置,因?yàn)槿绻覀冏遠(yuǎn)ttps協(xié)議的話虐块,我們將會(huì)用到8443端口這個(gè)段的配置,對(duì)吧嘉蕾?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優(yōu)化的地方都加上了。結(jié)合第三天中的Apache的性能優(yōu)化错忱,我們這個(gè)架構(gòu)可以“飛奔”起來(lái)了儡率,當(dāng)然這邊把有提及任何關(guān)于數(shù)據(jù)庫(kù)優(yōu)化的步驟,但僅憑這兩步以清,我們的系統(tǒng)已經(jīng)有了很大的提升儿普。舉個(gè)真實(shí)的例子:上一個(gè)項(xiàng)目,經(jīng)過(guò)4輪performance testing掷倔,第一輪進(jìn)行了問(wèn)題的定位眉孩,第二輪就是進(jìn)行了apache+tomcat/weblogic的優(yōu)化,第三輪是做集群優(yōu)化,第四輪是sql與codes的優(yōu)化浪汪。在到達(dá)第二輪時(shí)巴柿,我們的性能已經(jīng)提升了多少倍呢?我們來(lái)看一個(gè)loaderrunner的截圖吧:左邊第一列是第一輪沒(méi)有經(jīng)過(guò)任何調(diào)優(yōu)的壓力測(cè)試報(bào)告死遭。右邊這一列是經(jīng)過(guò)了apache優(yōu)化广恢,tomcat優(yōu)化后得到的壓力測(cè)試報(bào)告。大家看看呀潭,這就提高了多少倍钉迷?這還只是在沒(méi)有改動(dòng)代碼的情況下得到的改善,現(xiàn)在明白了好好的調(diào)優(yōu)一個(gè)apache和tomcat其實(shí)是多么的重要了钠署?如果加上后面的代碼糠聪、SQL的調(diào)優(yōu)、數(shù)據(jù)庫(kù)的調(diào)優(yōu)踏幻。枷颊。。该面。夭苗。。所以我在上一個(gè)工程中有單筆交易性能(無(wú)論是吞吐量隔缀、響應(yīng)時(shí)間)提高了80倍這樣的極端例子的存在题造。####################################################################tomcat默認(rèn)參數(shù)是為開(kāi)發(fā)環(huán)境制定,而非適合生產(chǎn)環(huán)境猾瘸,尤其是內(nèi)存和線程的配置界赔,默認(rèn)都很低,容易成為性能瓶頸牵触。 tomcat內(nèi)存優(yōu)化linux修改TOMCAT_HOME/bin/catalina.sh淮悼,在前面加入JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m最大堆內(nèi)存是1024m揽思,對(duì)于現(xiàn)在的硬件還是偏低袜腥,實(shí)施時(shí),還是按照機(jī)器具體硬件配置優(yōu)化钉汗。 tomcat 線程優(yōu)化maxThreads="600" ///最大線程數(shù)minSpareThreads="100"http:///初始化時(shí)創(chuàng)建的線程數(shù)maxSpareThreads="500"http:///一旦創(chuàng)建的線程超過(guò)這個(gè)值羹令,Tomcat就會(huì)關(guān)閉不再需要的socket線程。acceptCount="700"http://指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí)损痰,可以放到處理隊(duì)列中的請(qǐng)求數(shù)福侈,超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理 這里是http connector的優(yōu)化,如果使用apache和tomcat做集群的負(fù)載均衡卢未,并且使用ajp協(xié)議做apache和tomcat的協(xié)議轉(zhuǎn)發(fā)肪凛,那么還需要優(yōu)化ajp connector堰汉。由于tomcat有多個(gè)connector,所以tomcat線程的配置显拜,又支持多個(gè)connector共享一個(gè)線程池衡奥。首先。打開(kāi)/conf/server.xml远荠,增加最大線程500(一般服務(wù)器足以)矮固,最小空閑線程數(shù)20,線程最大空閑時(shí)間60秒譬淳。 然后档址,修改節(jié)點(diǎn),增加executor屬性邻梆,executor設(shè)置為線程池的名字:可以多個(gè)connector公用1個(gè)線程池守伸,所以ajp connector也同樣可以設(shè)置使用tomcatThreadPool線程池。 禁用DNS查詢當(dāng)web應(yīng)用程序向要記錄客戶端的信息時(shí)浦妄,它也會(huì)記錄客戶端的IP地址或者通過(guò)域名服務(wù)器查找機(jī)器名 轉(zhuǎn)換為IP地址尼摹。DNS查詢需要占用網(wǎng)絡(luò),并且包括可能從很多很遠(yuǎn)的服務(wù)器或者不起作用的服務(wù)器上去獲取對(duì)應(yīng)的IP的過(guò)程剂娄,這樣會(huì)消耗一定的時(shí)間蠢涝。修改server.xml文件中的Connector元素,修改屬性enableLookups參數(shù)值: enableLookups="false"如果為true阅懦,則可以通過(guò)調(diào)用request.getRemoteHost()進(jìn)行DNS查詢來(lái)得到遠(yuǎn)程客戶端的實(shí)際主機(jī)名和二,若為false則不進(jìn)行DNS查詢,而是返回其ip地址 設(shè)置session過(guò)期時(shí)間conf\web.xml中通過(guò)參數(shù)指定:180單位為分鐘耳胎。 Apr插件提高Tomcat性能 Tomcat可以使用APR來(lái)提供超強(qiáng)的可伸縮性和性能惯吕,更好地集成本地服務(wù)器技術(shù). APR(Apache Portable Runtime)是一個(gè)高可移植庫(kù),它是Apache HTTP Server 2.x的核心怕午。APR有很多用途废登,包括訪問(wèn)高級(jí)IO功能(例如sendfile,epoll和OpenSSL),OS級(jí)別功能(隨機(jī)數(shù)生成郁惜,系統(tǒng)狀態(tài)等等)钳宪,本地進(jìn)程管理(共享內(nèi)存,NT管道和UNIX sockets)扳炬。這些功能可以使Tomcat作為一個(gè)通常的前臺(tái)WEB服務(wù)器,能更好地和其它本地web技術(shù)集成搔体,總體上讓Java更有效率作為一個(gè)高性能web服務(wù)器平臺(tái)而不是簡(jiǎn)單作為后臺(tái)容器恨樟。 在產(chǎn)品環(huán)境中,特別是直接使用Tomcat做WEB服務(wù)器的時(shí)候疚俱,應(yīng)該使用Tomcat Native來(lái)提高其性能 要測(cè)APR給tomcat帶來(lái)的好處最好的方法是在慢速網(wǎng)絡(luò)上(模擬Internet)劝术,將Tomcat線程數(shù)開(kāi)到300以上的水平,然后模擬一大堆并發(fā)請(qǐng)求。 如果不配APR养晋,基本上300個(gè)線程狠快就會(huì)用滿衬吆,以后的請(qǐng)求就只好等待。但是配上APR之后绳泉,并發(fā)的線程數(shù)量明顯下降逊抡,從原來(lái)的300可能會(huì)馬上下降到只有幾十,新的請(qǐng)求會(huì)毫無(wú)阻塞的進(jìn)來(lái)零酪。 在局域網(wǎng)環(huán)境測(cè)冒嫡,就算是400個(gè)并發(fā),也是一瞬間就處理/傳輸完畢四苇,但是在真實(shí)的Internet環(huán)境下孝凌,頁(yè)面處理時(shí)間只占0.1%都不到,絕大部分時(shí)間都用來(lái)頁(yè)面?zhèn)鬏斣乱浮H绻挥肁PR蟀架,一個(gè)線程同一時(shí)間只能處理一個(gè)用戶,勢(shì)必會(huì)造成阻塞榆骚。所以生產(chǎn)環(huán)境下用apr是非常必要的片拍。復(fù)制代碼(1)安裝APR tomcat-native apr-1.3.8.tar.gz 安裝在/usr/local/apr #tar zxvf apr-1.3.8.tar.gz #cd apr-1.3.8 #./configure;make;make install apr-util-1.3.9.tar.gz 安裝在/usr/local/apr/lib #tar zxvf apr-util-1.3.9.tar.gz #cd apr-util-1.3.9 #./configure --with-apr=/usr/local/apr ----with-java-home=JDK;make;make install #cd apache-tomcat-6.0.20/bin #tar zxvf tomcat-native.tar.gz #cd tomcat-native/jni/native #./configure --with-apr=/usr/local/apr;make;make install (2)設(shè)置 Tomcat 整合 APR 修改 tomcat 的啟動(dòng) shell (startup.sh),在該文件中加入啟動(dòng)參數(shù): CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib" 寨躁。 (3)判斷安裝成功: 如果看到下面的啟動(dòng)日志穆碎,表示成功。 2007-4-26 15:34:32 org.apache.coyote.http11.Http11AprProtocol init

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末职恳,一起剝皮案震驚了整個(gè)濱河市所禀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌放钦,老刑警劉巖色徘,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異操禀,居然都是意外死亡褂策,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門颓屑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斤寂,“玉大人,你說(shuō)我怎么就攤上這事揪惦”楦悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵器腋,是天一觀的道長(zhǎng)溪猿。 經(jīng)常有香客問(wèn)我钩杰,道長(zhǎng),這世上最難降的妖魔是什么诊县? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任讲弄,我火速辦了婚禮,結(jié)果婚禮上依痊,老公的妹妹穿的比我還像新娘避除。我一直安慰自己,他們只是感情好抗悍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布驹饺。 她就那樣靜靜地躺著,像睡著了一般缴渊。 火紅的嫁衣襯著肌膚如雪赏壹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天衔沼,我揣著相機(jī)與錄音蝌借,去河邊找鬼。 笑死指蚁,一個(gè)胖子當(dāng)著我的面吹牛菩佑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凝化,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稍坯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搓劫?” 一聲冷哼從身側(cè)響起瞧哟,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枪向,沒(méi)想到半個(gè)月后勤揩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘蛔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年陨亡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深员。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡负蠕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倦畅,到底是詐尸還是另有隱情遮糖,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布滔迈,位于F島的核電站止吁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏燎悍。R本人自食惡果不足惜敬惦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谈山。 院中可真熱鬧俄删,春花似錦、人聲如沸奏路。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸽粉。三九已至斜脂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間触机,已是汗流浹背帚戳。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儡首,地道東北人片任。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔬胯,于是被迫代替她去往敵國(guó)和親对供。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容