服務(wù)器會(huì)崩潰的原因:1、服務(wù)器中出現(xiàn)內(nèi)存泄漏問(wèn)題導(dǎo)致;2、服務(wù)器中用C或C++編寫的程序出現(xiàn)C指針錯(cuò)誤問(wèn)題導(dǎo)致;3、服務(wù)器數(shù)據(jù)庫(kù)中的臨時(shí)表不夠用到導(dǎo)致;4、服務(wù)器出現(xiàn)線程死鎖問(wèn)題導(dǎo)致;5、服務(wù)器的磁盤資源不足導(dǎo)致;6、服務(wù)器訪問(wèn)用戶突然暴漲導(dǎo)致服務(wù)器超載,從而使服務(wù)器站點(diǎn)崩潰。
具體內(nèi)容如下:
1、內(nèi)存泄漏
C/C++程序還可能產(chǎn)生另一個(gè)指針問(wèn)題:丟失對(duì)已分配內(nèi)存的引用。當(dāng)內(nèi)存是在子程序中被分配時(shí),通常會(huì)出現(xiàn)這種問(wèn)題,其結(jié)果是程序從子程序中返回時(shí)不會(huì)釋放內(nèi)存。如此一來(lái),對(duì)已分配的內(nèi)存的引用就會(huì)丟失,只要操作系統(tǒng)還在運(yùn)行中,則進(jìn)程就會(huì)一直使用該內(nèi)存。這樣的結(jié)果是,曾占用更多的內(nèi)存的程序會(huì)降低系統(tǒng)性能,直到機(jī)器完全停止工作,才會(huì)完全清空內(nèi)存。
2、C指針錯(cuò)誤
用C或C++編寫的程序,如Web服務(wù)器API模塊,有可能導(dǎo)致系統(tǒng)的崩潰,因?yàn)橹灰g接引用指針(即,訪問(wèn)指向的內(nèi)存)中出現(xiàn)一個(gè)錯(cuò)誤,就會(huì)導(dǎo)致操作系統(tǒng)終止所有程序。另外,使用了糟糕的C指針的Java模擬量(analog)將訪問(wèn)一個(gè)空的對(duì)象引用。Java中的空引用通常不會(huì)導(dǎo)致立刻退出JVM,但是前提是程序員能夠使用異常處理方法恰當(dāng)?shù)靥幚礤e(cuò)誤。在這方面,Java無(wú)需過(guò)多的關(guān)注,但使用Java對(duì)可靠性進(jìn)行額外的度量則會(huì)對(duì)性能產(chǎn)生一些負(fù)面影響。
3、數(shù)據(jù)庫(kù)中的臨時(shí)表不夠用
許多數(shù)據(jù)庫(kù)的臨時(shí)表(cursor)數(shù)目都是固定的,臨時(shí)表即保留查詢結(jié)果的內(nèi)存區(qū)域。在臨時(shí)表中的數(shù)據(jù)都被讀取后,臨時(shí)表便會(huì)被釋放,但大量同時(shí)進(jìn)行的查詢可能耗盡數(shù)目固定的所有臨時(shí)表。這時(shí),其他的查詢就需要列隊(duì)等候,直到有臨時(shí)表被釋放時(shí)才能再繼續(xù)運(yùn)行。
4、線程死鎖
由多線程帶來(lái)的性能改善是以可靠性為代價(jià)的,主要是因?yàn)檫@樣有可能產(chǎn)生線程死鎖。線程死鎖時(shí),第一個(gè)線程等待第二個(gè)線程釋放資源,而同時(shí)第二個(gè)線程又在等待第一個(gè)線程釋放資源。我們來(lái)想像這樣一種情形:在人行道上兩個(gè)人迎面相遇,為了給對(duì)方讓道,兩人同時(shí)向一側(cè)邁出一步,雙方無(wú)法通過(guò),又同時(shí)向另一側(cè)邁出一步,這樣還是無(wú)法通過(guò)。雙方都以同樣的邁步方式堵住了對(duì)方的去路。假設(shè)這種情況一直持續(xù)下去,這樣就不難理解為何會(huì)發(fā)生死鎖現(xiàn)象了。
5、磁盤已滿
導(dǎo)致系統(tǒng)無(wú)法正常運(yùn)行的最可能的原因是磁盤已滿。一個(gè)好的網(wǎng)絡(luò)管理員會(huì)密切關(guān)注磁盤的使用情況,隔一定的時(shí)間,就需要將磁盤上的一些負(fù)載轉(zhuǎn)存到備份存儲(chǔ)介質(zhì)中(例如磁帶)。
日志文件會(huì)很快用光所有的磁盤空間。Web服務(wù)器的日志文件、SQL*Net的日志文件、JDBC日志文件,以及應(yīng)用程序服務(wù)器日志文件均與內(nèi)存泄漏有同等的危害??梢圆扇〈胧⑷罩疚募4嬖谂c操作系統(tǒng)不同的文件系統(tǒng)中。日志文件系統(tǒng)空間已滿時(shí)Web服務(wù)器也會(huì)被掛起,但機(jī)器自身被掛起的幾率已大大減低。
6、服務(wù)器超載
服務(wù)器的每個(gè)連接都使用一個(gè)線程。服務(wù)器會(huì)在線程用完后掛起,而不為已存在的連接提供任何服務(wù)。如果有一種負(fù)載分布機(jī)制可以檢測(cè)到服務(wù)器沒(méi)有響應(yīng),則該服務(wù)器上的負(fù)載就可以分布到其它的Web服務(wù)器上,這可能會(huì)致使這些服務(wù)器一個(gè)接一個(gè)地用光所有的線程。這樣一來(lái),整個(gè)服務(wù)器組都會(huì)被掛起。操作系統(tǒng)級(jí)別可能還在不斷地接收新的連接,而應(yīng)用程序(Web服務(wù)器)卻無(wú)法為這些連接提供服務(wù)。用戶可以在瀏覽器狀態(tài)行上看到connected(已連接)的提示消息,但這以后什么也不會(huì)發(fā)生。