導航:首頁 > 編程語言 > java動態分區分配

java動態分區分配

發布時間:2022-12-06 18:56:11

㈠ 求救求救!!電腦高手來看看啊!

services.exe進程病毒
1 services.exe - services - 進程介紹
進程文件: services or services.exe
進程名稱: Windows Service Controller
進程類別:其他進程

英文描述:

services.exe is a part of the Microsoft Windows Operating System and manages the operation of starting and stopping services. This process also deals with the automatic starting of services ring the computers boot-up and the stopping of servicse rin

中文參考:

services.exe是微軟Windows操作系統的一部分。用於管理啟動和停止服務。該進程也會處理在計算機啟動和關機時運行的服務。這個程序對你系統的正常運行是非常重要的。注意:services也可能是W32.Randex.R(儲存在%systemroot%\system32\目錄)和Sober.P (儲存在%systemroot%\Connection Wizard\Status\目錄)木馬。該木馬允許攻擊者訪問你的計算機,竊取密碼和個人數據。該進程的安全等級是建議立即刪除。

出品者:Microsoft Corp.
屬於:Microsoft Windows Operating System
系統進程:Yes
後台程序:Yes
網路相關:No
常見錯誤:N/A
內存使用:N/A
安全等級 (0-5): 0
間諜軟體:No
廣告軟體:No
病毒:No
木馬:No

這個後門還不錯,也有點BT吧,共產生14個文件+3個快捷圖標+2個文件夾。注冊表部分,除了1個Run和System.ini,比較有特點是,非普通地利用了EXE文件關聯,先修改了.exe的默認值,改.exe從默認的 exefile更改為winfiles,然後再創建winfiles鍵值,使EXE文件關聯與木馬掛鉤。即為中毒後,任意一個EXE文件的屬性,「應用程序」變成「EXE文件」

當然,清除的方法也很簡單,不過需要注意步驟:

一、注冊表:先使用注冊表修復工具,或者直接使用regedit修正以下部分

1.SYSTEM.INI (NT系統在注冊表: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon)
shell = Explorer.exe 1 修改為shell = Explorer.exe

2.將 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下的
Torjan Program----------C:\WINNT\services.exe刪除

3. HKEY_Classes_root\.exe

默認值 winfiles 改為exefile

4.刪除以下兩個鍵值:

HKEY_Classes_root\winfiles
HKEY_Local_machine\software\classes\winfiles

5. 打開注冊表編輯器,依此分別查找「rundll32.com」、「finder.com」、「command.pif」,把找到的內容裡面的「rundll32.com」、「finder.com」、「command.pif」分別改為「Rundll32.exe」

6. 查找「iexplore.com」的信息,把找到的內容裡面的「iexplore.com」改為「iexplore.exe」

7. 查找「explorer.com」的信息,把找到的內容裡面的「explorer.com」改為「explorer.exe」

8. 查找「iexplore.pif」,應該能找到類似「%ProgramFiles%\Common Files\iexplore.pif」的信息,把這內容改為「C:\Program Files\Internet Explorer\iexplore.exe」

9. 刪除病毒添加的文件關聯信息和啟動項:

[HKEY_CLASSES_ROOT\winfiles]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"Torjan Program"="%Windows%\services.exe"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices]
"Torjan Program"="%Windows%\services.exe"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"Shell"="Explorer.exe 1"
改為
"Shell"="Explorer.exe"

10. 這些是病毒釋放的一個VB庫文件(MSWINSCK.OCX)的相關信息,不一定要刪除:

HKEY_CLASSES_ROOT\MSWinsock.Winsock
HKEY_CLASSES_ROOT\MSWinsock.Winsock.1
HKEY_CLASSES_ROOT\CLSID\
HKEY_CLASSES_ROOT\CLSID\
HKEY_CLASSES_ROOT\Interface\
HKEY_CLASSES_ROOT\Interface\
HKEY_CLASSES_ROOT\TypeLib\

註:因為病毒修改了很多關聯信息,所以在那些病毒文件沒有被刪除之前,請不要做任何多餘的操作,以免激活病毒

二、然後重啟系統,刪除以下文件部分,注意打開各分區時,先打開「我的電腦」後請使用右鍵單擊分區,選「打開」進入。或者直接執行附件的Kv.bat來刪除以下文件

c:\antorun.inf (如果你有多個分區,請檢查其他分區是否有這個文件,有也一並刪除)

%programfiles%\common files\iexplore.pif
%programfiles%\Internat explorer\iexplore.com
%windir%.com
%windir%\exeroute.exe
%windir%\explorer.com
%windir%\finder.com
%windir%\mswinsck.ocx
%windir%\services.exe
%windir%\system32\command.pif
%windir%\system32\dxdiag.com
%windir%\system32\finder.com
%windir%\system32\msconfig.com
%windir%\system32\regedit.com
%windir%\system32\rundll32.com
刪除以下文件夾:
%windir%\debug
%windir%\system32\NtmsData

一、病毒評估

1. 病毒中文名: SCO炸彈變種N
2. 病毒英文名: Worm.Novarg.N
3. 病毒別名: Worm.Mydoom.m
4. 病毒大小: 28832位元組
5. 病毒類型: 蠕蟲病毒
6. 病毒危險等級: ★★★★
7. 病毒傳播途徑: 郵件
8. 病毒依賴系統: Windows 9X/NT/2000/XP

二、病毒的破壞

1. 通過電子郵件傳播的蠕蟲病毒,感染之後,它會先在用戶本地機器上搜索電子郵件地址,向其發送病毒郵件;

2. 利用在本機上搜索到的郵件地址的後綴當關鍵詞,在Google、Yahoo等四個搜索引擎上搜索相關的email地址,發送病毒郵件傳播自身。

3. 大量發送的搜索請求使這四個搜索引擎的運行速度明顯變慢。

4. 感染了此病毒的機器,IE瀏覽器、OE軟體和Outlook軟體都不能正常使用。

5. 病毒大量向外發送病毒郵件,嚴重消耗網路資源,可能造成區域網堵塞。

三、技術分析

1. 蠕蟲病毒,採用Upx壓縮。運行後,將自己復制到%WINDOWS%目錄下,文件名為:java.exe。釋放一個後門病毒在同一目錄中,文件名為:services.exe。
2. 在注冊表啟動項「\CurrentVersion\Run」下加入這兩個文件的啟動鍵值:JavaVM和Service,實現病毒的開機自啟動。

3. 強行關閉IE瀏覽器、OE軟體和Outlook軟體,使其不能正常使用。

4. 在本地機器上搜索電子郵件地址:從注冊表中讀取當前系統當前使用的wab文件名,並在其中搜索email地址;搜索internet臨時目錄 (Local Settings\Temporary Internet Files)中的文件,從中提取電子郵件地址;遍歷盤符從C:盤到Z:的所有硬碟,並嘗試從以下擴展名文件中提取email地址:.adb ,.asp ,.dbx ,.htm ,.php ,.pl ,.sht ,.tbb ,.txt ,.wab。

5. 當病毒搜索到email地址以後,病毒以「mailto+%本地系統搜出的郵件地址%」、「reply+%本地系統搜出的郵件地址%」、 「{|contact+| |e| |-| |mail}+%本地系統搜出的郵件地址%」為關鍵字,利用以下四種搜索引擎進行email地址郵件搜索:search.lycos.com、 search.yahoo.com、www.altavista.com、www.google.com,利用這種手段,病毒能夠搜索到非常多的可用郵件 地址。

6. 病毒郵件的附件名稱為:readme ,instruction ,transcript ,mail ,letter ,file ,text ,attachment等,病毒附件擴展名為:cmd ,bat ,com ,exe ,pif ,scr ,zip。

四、病毒解決方案:

1. 進行升級

瑞星公司將於當天進行緊急升級,升級後的軟體版本號為16.37.10,該版本的瑞星殺毒軟體可以徹底查殺「SCO炸彈變種N」病毒,瑞星殺毒軟體標准版和網路版的用戶可以直接登陸瑞星網站( http://www.rising.com.cn/)下載升級包進行升級,或者使用瑞星殺毒軟體的智能升級功能。

2. 使用專殺工具

鑒於該病毒的特性,瑞星公司還為手中暫時沒有殺毒軟體的用戶提供了免費的病毒專殺工具,用戶可以到: http://it.rising.com.cn/service/technology/tool.htm 網址免費下載使用。

3. 使用在線殺毒和下載版

用戶還可以使用瑞星公司的在線殺毒與下載版產品清除該病毒,這兩款產品是通過手機付費使用的,用戶可以登陸 http://online.rising.com.cn/ 使用在線殺毒產品,或者登陸 http://go.rising.com.cn/ 使用下載版產品。

4. 打電話求救

如果遇到關於該病毒的其它問題,用戶可以隨時撥打瑞星反病毒急救電話:010-82678800來尋求反病毒專家的幫助!

5. 手動清除

(1)結束系統中進程名為:Services.exe和java.exe(在%windows%目錄中)
(2)刪除系統臨時目錄中的兩個病毒數據文件:MLITGB.LOG和ZINCITE.LOG
(3)刪除病毒鍵立的注冊表鍵:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
「JavaVM」=%WINDOWS%\java.exe
和HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
「Services」=%WINDOWS%\Services.exe
註: %WINDOWS% 是指系統的windows目錄,在Windows 9X/ME/XP下默認為:
C:\WINDOWS,Win2K下默認為:C:\WINNT

註: %WINDIR%指的是Windows系統的安裝目錄,在Windows 95/98/ME/XP操作系統下默認為:C:\WINDOWS目錄,在WINDOWS2000操作系統下默認為:C:\WINNT目錄。
五、安全建議:

1. 建立良好的安全習慣。 例如:對一些來歷不明的郵件及附件不要打開,不要上一些不太了解的網站、不要執行從 Internet 下載後未經殺毒處理的軟體等,這些必要的習慣會使您的計算機更安全。

2. 關閉或刪除系統中不需要的服務。 默認情況下,許多操作系統會安裝一些輔助服務,如 FTP 客戶端、Telnet 和 Web 伺服器。這些服務為攻擊者提供了方便,而又對用戶沒有太大用處,如果刪除它們,就能大大減少被攻擊的可能性。

3. 經常升級安全補丁。 據統計,有80%的網路病毒是通過系統安全漏洞進行傳播的,象蠕蟲王、沖擊波、震盪波等,所以我們應該定期到微軟網站去下載最新的安全補丁,以防範未然。

4. 使用復雜的密碼。 有許多網路病毒就是通過猜測簡單密碼的方式攻擊系統的,因此使用復雜的密碼,將會大大提高計算機的安全系數。

5. 迅速隔離受感染的計算機。 當您的計算機發現病毒或異常時應立刻斷網,以防止計算機受到更多的感染,或者成為傳播源,再次感染其它計算機。

6. 了解一些病毒知識。 這樣就可以及時發現新病毒並採取相應措施,在關鍵時刻使自己的計算機免受病毒破壞。如果能了解一些注冊表知識,就可以定期看一看注冊表的自啟動項是否有可疑鍵值;如果了解一些內存知識,就可以經常看看內存中是否有可疑程序。

7. 最好安裝專業的殺毒軟體進行全面監控。 在病毒日益增多的今天,使用殺毒軟體進行防毒,是越來越經濟的選擇,不過用戶在安裝了反病毒軟體之後,應該經常進行升級、將一些主要監控經常打開(如郵件監控)、內存監控等、遇到問題要上報, 這樣才能真正保障計算機的安全。

8. 用戶還應該安裝個人防火牆軟體進行防黑。 由於網路的發展,用戶電腦面臨的黑客攻擊問題也越來越嚴重,許多網路病毒都採用了黑客的方法來攻擊用戶電腦,因此,用戶還應該安裝個人防火牆軟體,將安全級別設為中、高,這樣才能有效地防止網路上的黑客攻擊。

====================================================
----------------------------------------------------
----------------------------------------------------
====================================================
既然提示上都說了,那就知道原因了。

Services.exe沒運行或無法運行,所以系統無法啟動。

你的安全模式或其他的例如最後一次正確配置類的進得去嗎?如果進得去那好
1.打開開始菜單-設置-控制面板-管理-服務-把所有S開頭的服務都開了再確定,重新啟動

2.用超級兔子-超級兔子魔法設置-啟動程序-把S開頭的服務全都開了

還不行就是中病毒了,殺毒吧。

還是不行?那就是殺毒軟體的問題了。

出現這個現象有方面的,一是硬體,即內存方面有問題,二是軟體,這就有多方面的問題了。

一:先說說硬體:

一般來說,電腦硬體是很不容易壞的。內存出現問題的可能性並不大(除非你的內存真的是雜牌的一塌徒地),主要方面是:1。內存條壞了(二手內存情況居多)、2。使用了有質量問題的內存,3。內存插在主板上的金手指部分灰塵太多。4。使用不同品牌不同容量的內存,從而出現不兼容的情況。5。超頻帶來的散熱問題。你可以使用MemTest 這個軟體來檢測一下內存,它可以徹底的檢測出內存的穩定度。

二、如果都沒有,那就從軟體方面排除故障了。

先說原理:內存有個存放數據的地方叫緩沖區,當程序把數據放在緩沖區,需要操作系統提供的「功能函數」來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是「動態內存分配」,內存地址也就是編程中的「游標」。內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時系統函數會返回一個0值,這時返回值「0」已不表示新啟用的游標,而是系統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程序的「健壯性」。若應用程序沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用游標,繼續在之後的執行中使用這塊內存。真正的0地址內存區儲存的是計算機系統中最重要的「中斷描述符表」,絕對不允許應用程序使用。在沒有保護機制的操作系統下(如DOS),寫數據到這個地址會導致立即當機,而在健壯的操作系統中,如Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由操作系統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的內存不能為「read」錯誤,並指出被引用的內存地址為「0x00000000「。內存分配失敗故障的原因很多,內存不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作系統使用很長時間後,安裝了多種應用程序(包括無意中「安裝」的病毒程序),更改了大量的系統參數和系統檔案之後。

在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試圖讀寫一塊「應該可用」的內存,但不知為什麼,這個預料中可用的游標已經失效了。有可能是「忘記了」向操作系統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等。注銷了的內存被系統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程序唯一的下場就是被操作終止執行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊!像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效游標不一定總是0,因此錯誤提示中的內存地址也不一定為「0x00000000」,而是其它隨機數字。

首先建議:

1、 檢查系統中是否有木馬或病毒。這類程序為了控制系統往往不負責任地修改系統,從而導致操作系統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。

2、 更新操作系統,讓操作系統的安裝程序重新拷貝正確版本的系統檔案、修正系統參數。有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序。

3、 盡量使用最新正式版本的應用程序、Beta版、試用版都會有BUG。

4、 刪除然後重新創建 Winnt\System32\Wbem\Repository 文件夾中的文件:在桌面上右擊我的電腦,然後單擊管理。 在"服務和應用程序"下,單擊服務,然後關閉並停止 Windows Management Instrumentation 服務。 刪除 Winnt\System32\Wbem\Repository 文件夾中的所有文件。(在刪除前請創建這些文件的備份副本。) 打開"服務和應用程序",單擊服務,然後打開並啟動 Windows Management Instrumentation 服務。當服務重新啟動時,將基於以下注冊表項中所提供的信息重新創建這些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs

下面搜集幾個例子給大家分析:

例一:IE瀏覽器出現「0x0a8ba9ef」指令引用的「0x03713644」 內存,或者「0x70dcf39f」指令引用的「0x00000000」內存。該內存不能為「read」。要終止程序,請單擊「確定」的信息框,單擊「確定」後,又出現「發生內部錯誤,您正在使用的其中一個窗口即將關閉」的信息框,關閉該提示信息後,IE瀏覽器也被關閉。解決方法:

1、 開始-運行窗口,輸入「regsvr32 actxprxy.dll」回車,接著會出現一個信息對話 框「DllRegisterServer in actxprxy.dll succeeded」,確定。再依次運行以下命令。(這個方法有人說沒必要,但重新注冊一下那些.dll對系統也沒有壞處,反正多方下手,能解決問題就行。)

regsvr32 shdocvw.dll

regsvr32 oleaut32.dll

regsvr32 actxprxy.dll

regsvr32 mshtml.dll

regsvr32 msjava.dll

regsvr32 browseui.dll

regsvr32 urlmon.dll

2、 修復或升級IE瀏覽器,同時打上系統補丁。看過其中一個修復方法是,把系統還原到系統初始的狀態下。建議將IE升級到了6.0。

例二:有些應用程序錯誤: 「0x7cd64998」 指令參考的 「0x14c96730」 內存。該內存不能為 「read」。解決方法:Win XP的「預讀取」技術這種最佳化技術也被用到了應用程序上,系統對每一個應用程序的前幾次啟動情況進行分析,然後新增一個描述套用需求的虛擬「內存映像」,並把這些信息儲存到Windows\Prefetch文件夾。一旦建立了映像,應用軟體的裝入速度大大提高。XP的預讀取數據儲存了最近8次系統啟動或應用軟體啟動的信息。建議將虛擬內存撤換,刪除Windows\Prefetch目錄下所有*.PF文件,讓windows重新收集程序的物理地址。

例三:在XP下雙擊光碟裡面的「AutoRun.exe」文件,顯示「0x77f745cc」指令引用的「0x00000078」內存。該內存不能為「written」,要終止程序,請單擊「確定」,而在Windows 98里運行卻正常。 解決方法:這可能是系統的兼容性問題,winXP的系統,右鍵「AutoRun.exe」文件,屬性,兼容性,把「用兼容模式運行這個程序」項選擇上,並選擇「Windows 98/Me」。win2000如果打了SP的補丁後,只要開始,運行,輸入:regsvr32 c:\winnt\apppatch\slayerui.dll。右鍵,屬性,也會出現兼容性的選項。

例四:RealOne Gold關閉時出現錯誤,以前一直使用正常,最近卻在每次關閉時出現「0xffffffff」指令引用的「0xffffffff」內存。該內存不能為「read」 的提示。 解決方法:當使用的輸入法為微軟拼音輸入法2003,並且隱藏語言欄時(不隱藏時沒問題)關閉RealOne就會出現這個問題,因此在關閉RealOne之前可以顯示語言欄或者將任意其他輸入法作為當前輸入法來解決這個問題。

例五:我的豪傑超級解霸自從上網後就不能播放了,每次都提示「0x060692f6」(每次變化)指令引用的「0xff000011」內存不能為「read」,終止程序請按確定。 解決方法:試試重裝豪傑超級解霸,如果重裝後還會,到官方網站下載相應版本的補丁試試。還不行,只好換就用別的播放器試試了。

例六:雙擊一個游戲的快捷方式,「0x77f5cd0」指令引用「0xffffffff」內 存,該內存不能為「read」 ,並且提示Client.dat程序錯誤。解決方法:重裝顯卡的最新驅動程序,然後下載並且安裝DirectX9.0。

例七:一個朋友發信息過來,我的電腦便出現了錯誤信息:「0x772b548f」指令引用的「0x00303033」內存,該內存不能為「written」,然後QQ自動下線,而再打開QQ,發現了他發過來的十幾條的信息。 解決方法:這是對方利用QQ的BUG,發送特殊的代碼,做QQ出錯,只要打上補丁或升級到最新版本,就沒事了。

該內存不能為read或written的解決方案關鍵詞: 該內存不能為"read" 該內存不能為"written"

從網上搜索來的幾篇相關文章.

【文章一】

使用Windows操作系統的人有時會遇到這樣的錯誤信息:
「「0X????????」指令引用的「0x00000000」內存,該內存不能為「read」或「written」」,然後應用程序被關閉。

如果去請教一些「高手」,得到的回答往往是「Windows就是這樣不穩定」之類的義憤和不屑。其實,這個錯誤並不一定是Windows不穩定造成的。本文就來簡單分析這種錯誤的一般原因。
一、應用程序沒有檢查內存分配失敗
程序需要一塊內存用以儲存數據時,就需要使用操作系統提供的「功能函數」來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是「動態內存分配」,內存地址也就是編程中的「游標」。內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時系統函數會返回一個0值,這時返回值「0」已不表示新啟用的游標,而是系統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程序的「健壯性」。若應用程序沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用游標,繼續在之後的執行中使用這塊內存。真正的0地址內存區儲存的是計算機系統中最重要的「中斷描述符表」,絕對不允許應用程序使用。在沒有保護機制的操作系統下(如DOS),寫數據到這個地址會導致立即當機,而在健壯的操作系統中,如Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由操作系統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的「寫內存」錯誤,並指出被引用的內存地址為「0x00000000」。內存分配失敗故障的原因很多,內存不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作系統使用很長時間後,安裝了多種應用程序(包括無意中「安裝」的病毒程序),更改了大量的系統參數和系統檔案之後。
二、應用程序由於自身BUG引用了不正常的內存游標
在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試突讀寫一塊「應該可用」的內存,但不知為什麼,這個預料中可用的游標已經失效了。有可能是「忘記了」向操作系統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等。注銷了的內存被系統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程序唯一的下場就是被操作終止執行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊!像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效游標不一定總是0,因此錯誤提示中的內存地址也不一定為「0x00000000」,而是其它隨機數字。如果系統經常有所提到的錯誤提示,下面的建議可能會有說明 :

1.檢視系統中是否有木馬或病毒。這類程序為了控制系統往往不負責任地修改系統,
從而導致操作系統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。
2.更新操作系統,讓操作系統的安裝程序重新拷貝正確版本的系統檔案、修正系統參數。
有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序。
3.試用新版本的應用程序。

Mode:
將虛擬內存撤換
答案:
目前為止是肯定的,也就是如在下次冷天到來時亦沒再發生,就代表這是主因
追加:
如果你用 Ghost 恢復 OS 後建議 刪除WINDOWS\PREFETCH目錄下所有*.PF文件因為需讓windows重新收集程序的物理地址
有些應用程序錯誤 "0x7cd64998" 指令參考的 "0x14c96730" 內存。該內存不能為 "read"推論是此原因
源由:
Win XP的「預讀取」技術
這種最佳化技術也被用到了應用軟體上,系統對每一個應用軟體的前幾次啟動情況進行分析,然後新增一個描述套用需求的虛擬「內存映像」,並把這些信息儲存到WINDOWSPREFETCH數據夾。一旦建立了映像,應用軟體的裝入速度大大提高。XP的預讀取數據儲存了最近8次系統啟動或應用軟體啟動的信息。
後敘:
目前此方法亦是獨步網路的(其碼自己針對此問題查了許久),也是常見問題,原本幾乎每天睡前關閉軟體時一些程序都會發生...read...
現在就沒發生了。

【文章二】

運行某些程序的時候,有時會出現內存錯誤的提示(0x後面內容有可能不一樣),然後該程序就關閉。
「0x????????」指令引用的「0x????????」內存。該內存不能為「read」。
「0x????????」指令引用的「0x????????」內存,該內存不能為「written」。
不知你出現過類似這樣的故障嗎?
一般出現這個現象有方面的,一是硬體,即內存方面有問題,二是軟體,這就有多方面的問題了。
下面先說說硬體:
一般來說,內存出現問題的可能性並不大,主要方面是:內存條壞了、內存質量有問題,還有就是2個不同牌子不同容量的內存混插,也比較容易

㈡ 哪位能描述一下 java 中內存的分區情況和各類變數在內存中的存貯情況。

Java內存分配與管理是Java的核心技術之一,一般Java在內存分配時會涉及到以下區域:

◆寄存器:我們在程序中無法控制

◆棧:存放基本類型的數據和對象的引用,但對象本身不存放在棧中,而是存放在堆中

◆堆:存放用new產生的數據

◆靜態域:存放在對象中用static定義的靜態成員

◆常量池:存放常量

◆非RAM存儲:硬碟等永久存儲空間

Java內存分配中的棧

在函數中定義的一些基本類型的變數數據和對象的引用變數都在函數的棧內存中分配。

當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配內存空間,當該變數退出該作用域後,Java會自動釋放掉為該變數所分配的內存空間,該內存空間可以立即被另作他用。

Java內存分配中的堆

堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

在堆中產生了一個數組或對象後,還可以在棧中定義一個特殊的變數,讓棧中這個變數的取值等於數組或對象在堆內存中的首地址,棧中的這個變數就成了數組或對象的引用變數。引用變數就相當於是為數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變數來訪問堆中的數組或對象。引用變數就相當於是為數組或者對象起的一個名稱。

引用變數是普通的變數,定義時在棧中分配,引用變數在程序運行到其作用域之外後被釋放。而數組和對象本身在堆中分配,即使程序運行到使用new產生數組或者對象的語句所在的代碼塊之外,數組和對象本身占據的內存不會被釋放,數組和對象在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍然占據內存空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是Java比較占內存的原因。

實際上,棧中的變數指向堆內存中的變數,這就是Java中的指針!

常量池(constantpool)

常量池指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數組)的常量值(final)還包含一些以文本形式出現的符號引用,比如:

◆類和介面的全限定名;

◆欄位的名稱和描述符;

◆方法和名稱和描述符。

虛擬機必須為每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和floatingpoint常量)和對其他類型,欄位和方法的符號引用。

對於String常量,它的值是在常量池中的。而JVM中的常量池在內存當中是以表的形式存在的,對於String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字元串值,注意:該表只存儲文字字元串值,不存儲符號引用。說到這里,對常量池中的字元串值的存儲位置應該有一個比較明了的理解了。

在程序執行的時候,常量池會儲存在MethodArea,而不是堆中。

堆與棧

Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。

棧的優勢是,存取速度比堆要快,僅次於寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變數數據(int,short,long,byte,float,double,boolean,char)和對象句柄(引用)。

棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:

1. inta=3;

2. intb=3;

編譯器先處理inta=3;首先它會在棧中創建一個變數為a的引用,然後查找棧中是否有3這個值,如果沒找到,就將3存放進來,然後將a指向3。接著處理intb=3;在創建完b的引用變數後,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。

這時,如果再令a=4;那麼編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,並令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。

要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改並不會影響到b,它是由編譯器完成的,它有利於節省空間。而一個對象引用變數修改了這個對象的內部狀態,會影響到另一個對象引用變數。

String是一個特殊的包裝類數據。可以用:

Stringstr=newString("abc");

Stringstr="abc";

兩種的形式來創建,第一種是用new()來新建對象的,它會在存放於堆中。每調用一次就會創建一個新的對象。而第二種是先在棧中創建一個對String類的對象引用變數str,然後通過符號引用去字元串常量池裡找有沒有"abc",如果沒有,則將"abc"存放進字元串常量池,並令str指向」abc」,如果已經有」abc」則直接令str指向「abc」。

比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==,下面用例子說明上面的理論。

1.Stringstr1="abc";

2.Stringstr2="abc";

3.System.out.println(str1==str2);//true

可以看出str1和str2是指向同一個對象的。

1.Stringstr1=newString("abc");

2.Stringstr2=newString("abc");

3.System.out.println(str1==str2);//false

用new的方式是生成不同的對象。每一次生成一個。

因此用第二種方式創建多個」abc」字元串,在內存中其實只存在一個對象而已.這種寫法有利與節省內存空間.同時它可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對於Stringstr=newString("abc");的代碼,則一概在堆中創建新對象,而不管其字元串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。

另一方面,要注意:我們在使用諸如Stringstr="abc";的格式定義類時,總是想當然地認為,創建了String類的對象str。擔心陷阱!對象可能並沒有被創建!而可能只是指向一個先前已經創建的對象。只有通過new()方法才能保證每次都創建一個新的對象。

由於String類的immutable性質,當String變數需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。

1.首先String不屬於8種基本數據類型,String是一個對象。因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。

2.newString()和newString(」")都是申明一個新的空字元串,是空串不是null;

3.Stringstr=」kvill」;Stringstr=newString(」kvill」)的區別

示例:

1.Strings0="kvill";

2.Strings1="kvill";

3.Strings2="kv"+"ill";

4.System.out.println(s0==s1);

5.System.out.println(s0==s2);

結果為:

true

true

首先,我們要知結果為道Java會確保一個字元串常量只有一個拷貝。

因為例子中的s0和s1中的」kvill」都是字元串常量,它們在編譯期就被確定了,所以s0==s1為true;而」kv」和」ill」也都是字元串常量,當一個字元串由多個字元串常量連接而成時,它自己肯定也是字元串常量,所以s2也同樣在編譯期就被解析為一個字元串常量,所以s2也是常量池中」kvill」的一個引用。所以我們得出s0==s1==s2;用newString()創建的字元串不是常量,不能在編譯期就確定,所以newString()創建的字元串不放入常量池中,它們有自己的地址空間。

示例:

6.Strings0="kvill";

7.Strings1=newString("kvill");

8.Strings2="kv"+newString("ill");

9.System.out.println(s0==s1);

10.System.out.println(s0==s2);

11.System.out.println(s1==s2);

結果為:

false

false

false

例2中s0還是常量池中"kvill」的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象」kvill」的引用,s2因為有後半部分newString(」ill」)所以也無法在編譯期確定,所以也是一個新創建對象」kvill」的應用;明白了這些也就知道為何得出此結果了。

4.String.intern():

再補充介紹一點:存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字元串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字元串並返回它的引用;看示例就清楚了

示例:

1.Strings0="kvill";

2.Strings1=newString("kvill");

3.Strings2=newString("kvill");

4.System.out.println(s0==s1);

5.System.out.println("**********");

6.s1.intern();

7.s2=s2.intern();//把常量池中"kvill"的引用賦給s2

8.System.out.println(s0==s1);

9.System.out.println(s0==s1.intern());

10.System.out.println(s0==s2);

結果為:

false

false//雖然執行了s1.intern(),但它的返回值沒有賦給s1

true//說明s1.intern()返回的是常量池中"kvill"的引用

true

最後我再破除一個錯誤的理解:有人說,「使用String.intern()方法則可以將一個String類的保存到一個全局String表中,如果具有相同值的Unicode字元串已經在這個表中,那麼該方法返回表中已有字元串的地址,如果在表中沒有相同值的字元串,則將自己的地址注冊到表中」如果我把他說的這個全局的String表理解為常量池的話,他的最後一句話,」如果在表中沒有相同值的字元串,則將自己的地址注冊到表中」是錯的:

示例:

1.Strings1=newString("kvill");

2.Strings2=s1.intern();

3.System.out.println(s1==s1.intern());

4.System.out.println(s1+""+s2);

5.System.out.println(s2==s1.intern());

結果:

1.false

2.kvillkvill

3.true

在這個類中我們沒有聲名一個」kvill」常量,所以常量池中一開始是沒有」kvill」的,當我們調用s1.intern()後就在常量池中新添加了一個」kvill」常量,原來的不在常量池中的」kvill」仍然存在,也就不是「將自己的地址注冊到常量池中」了。

s1==s1.intern()為false說明原來的」kvill」仍然存在;s2現在為常量池中」kvill」的地址,所以有s2==s1.intern()為true。

5.關於equals()和==:

這個對於String簡單來說就是比較兩字元串的Unicode序列是否相當,如果相等返回true;而==是比較兩字元串的地址是否相同,也就是是否是同一個字元串的引用。

6.關於String是不可變的

這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:Stringstr=」kv」+」ill」+」「+」ans」;就是有4個字元串常量,首先」kv」和」ill」生成了」kvill」存在內存中,然後」kvill」又和」」生成「kvill「存在內存中,最後又和生成了」kvillans」;並把這個字元串的地址賦給了str,就是因為String的」不可變」產生了很多臨時變數,這也就是為什麼建議用StringBuffer的原因了,因為StringBuffer是可改變的。

下面是一些String相關的常見問題:

String中的final用法和理解

finalStringBuffera=newStringBuffer("111");

finalStringBufferb=newStringBuffer("222");

a=b;//此句編譯不通過

finalStringBuffera=newStringBuffer("111");

a.append("222");//編譯通過

可見,final只對引用的"值"(即內存地址)有效,它迫使引用只能指向初始指向的那個對象,改變它的指向會導致編譯期錯誤。至於它所指向的對象的變化,final是不負責的。

String常量池問題的幾個例子

下面是幾個常見例子的比較分析和理解:

Stringa="a1";

Stringb="a"+1;

System.out.println((a==b));//result=true

Stringa="atrue";

Stringb="a"+"true";

System.out.println((a==b));//result=true

Stringa="a3.4";

Stringb="a"+3.4;

System.out.println((a==b));//result=true

分析:JVM對於字元串常量的"+"號連接,將程序編譯期,JVM就將常量字元串的"+"連接優化為連接後的值,拿"a"+1來說,經編譯器優化後在class中就已經是a1。在編譯期其字元串常量的值就確定下來,故上面程序最終的結果都為true。

Stringa="ab";

Stringbb="b";

Stringb="a"+bb;

System.out.println((a==b));//result=false

分析:JVM對於字元串引用,由於在字元串的"+"連接中,有字元串引用存在,而引用的值在程序編譯期是無法確定的,即"a"+bb無法被編譯器優化,只有在程序運行期來動態分配並將連接後的新地址賦給b。所以上面程序的結果也就為false。

Stringa="ab";

finalStringbb="b";

Stringb="a"+bb;

System.out.println((a==b));//result=true

分析:和[3]中唯一不同的是bb字元串加了final修飾,對於final修飾的變數,它在編譯時被解析為常量值的一個本地拷貝存儲到自己的常量池中或嵌入到它的位元組碼流中。所以此時的"a"+bb和"a"+"b"效果是一樣的。故上面程序的結果為true。

Stringa="ab";

finalStringbb=getBB();

Stringb="a"+bb;

System.out.println((a==b));//result=false

privatestaticStringgetBB(){

return"b";

}

分析:JVM對於字元串引用bb,它的值在編譯期無法確定,只有在程序運行期調用方法後,將方法的返回值和"a"來動態連接並分配地址為b,故上面程序的結果為false。

通過上面4個例子可以得出得知:

Strings="a"+"b"+"c";

就等價於Strings="abc";

Stringa="a";

Stringb="b";

Stringc="c";

Strings=a+b+c;

這個就不一樣了,最終結果等於:

1.StringBuffertemp=newStringBuffer();

2.temp.append(a).append(b).append(c);

3.Strings=temp.toString();

由上面的分析結果,可就不難推斷出String採用連接運算符(+)效率低下原因分析,形如這樣的代碼:

publicclassTest{

publicstaticvoidmain(Stringargs[]){

Strings=null;

for(inti=0;i<100;i++){

s+="a";

}

}

}

每做一次+就產生個StringBuilder對象,然後append後就扔掉。下次循環再到達時重新產生個StringBuilder對象,然後append字元串,如此循環直至結束。如果我們直接採用StringBuilder對象進行append的話,我們可以節省N-1次創建和銷毀對象的時間。所以對於在循環中要進行字元串連接的應用,一般都是用StringBuffer或StringBulider對象來進行append操作。

String對象的intern方法理解和分析:

1.publicclassTest4{

2.privatestaticStringa="ab";

3.publicstaticvoidmain(String[]args){

4.Strings1="a";

5.Strings2="b";

6.Strings=s1+s2;

7.System.out.println(s==a);//false

8.System.out.println(s.intern()==a);//true

9.}

10.}

這里用到Java裡面是一個常量池的問題。對於s1+s2操作,其實是在堆裡面重新創建了一個新的對象,s保存的是這個新對象在堆空間的的內容,所以s與a的值是不相等的。而當調用s.intern()方法,卻可以返回s在常量池中的地址值,因為a的值存儲在常量池中,故s.intern和a的值相等。

總結

棧中用來存放一些原始數據類型的局部變數數據和對象的引用(String,數組.對象等等)但不存放對象內容

堆中存放使用new關鍵字創建的對象.

字元串是一個特殊包裝類,其引用是存放在棧里的,而對象內容必須根據創建方式不同定(常量池和堆).有的是編譯期就已經創建好,存放在字元串常量池中,而有的是運行時才被創建.使用new關鍵字,存放在堆中。

㈢ 怎樣實現java系統的可配置性

一個小型的網站,比如個人網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、性能的要求都很簡單,隨著互聯網業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬體到軟體、編程語言、資料庫、WebServer、防火牆等各個領域都有了很高的要求,已經不是原來簡單的html靜態網站所能比擬的。
大型網站,比如門戶網站。在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網站面臨的高負載和高並發問題。
上面提供的幾個解決思路在一定程度上也意味著更大的投入,並且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經驗。
1、HTML靜態化
其實大家都知道,效率最高、消耗最小的就是純靜態化的html頁面,所以我們盡可能使我們的網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。但是對於大量內容並且頻繁更新的網站,我們無法全部手動去挨個實現,於是出現了我們常見的信息發布系統CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發布系統來管理和實現的,信息發布系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、許可權管理、自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。
除了門戶和信息發布類型的網站,對於交互性要求很高的社區類型網站來說,盡可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社區等也是如此。
同時,html靜態化也是某些緩存策略使用的手段,對於系統中頻繁使用資料庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇中論壇的公用設置信息,這些信息目前的主流論壇都可以進行後台管理並且存儲再資料庫中,這些信息其實大量被前台程序調用,但是更新頻率很小,可以考慮將這部分內容進行後台更新的時候進行靜態化,這樣避免了大量的資料庫訪問請求。
2、圖片伺服器分離
大家知道,對於Web伺服器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,於是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的圖片伺服器,甚至很多台圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰,在應用伺服器和圖片伺服器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadMole,保證更高的系統消耗和執行效率。
3、資料庫集群和庫表散列
大型網站都有復雜的應用,這些應用必須使用資料庫,那麼在面對大量訪問的時候,資料庫的瓶頸很快就能顯現出來,這時一台資料庫將很快無法滿足應用,於是我們需要使用資料庫集群或者庫表散列。
在資料庫集群方面,很多資料庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什麼樣的DB,就參考相應的解決方案來實施即可。
上面提到的資料庫集群由於在架構、成本、擴張性方面都會受到所採用DB類型的限制,於是我們需要從應用程序的角度來考慮改善系統架構,庫表散列是常用並且最有效的解決方案。我們在應用程序中安裝業務和應用或者功能模塊將資料庫進行分離,不同的模塊對應不同的資料庫或者表,再按照一定的策略對某個頁面或者功能進行更小的資料庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統的性能並且有很好的擴展性。sohu的論壇就是採用了這樣的架構,將論壇的用戶、設置、帖子等信息進行資料庫分離,然後對帖子、用戶按照板塊和ID進行散列資料庫和表,最終可以在配置文件中進行簡單的配置便能讓系統隨時增加一台低成本的資料庫進來補充系統性能。
4、緩存
緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在後面講述。
架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。
網站程序開發方面的緩存,Linux上提供的Memory Cache是常用的緩存介面,可以在web開發中使用,比如用Java開發的時候就可以調用MemoryCache對一些數據進行緩存和通訊共享,一些大型社區使用了這樣的架構。另外,在使用web語言開發的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。
5、鏡像
鏡像是大型網站常採用的提高性能和數據安全性的方式,鏡像的技術可以解決不同網路接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和ENet之間的差異就促使了很多網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這里不闡述太深,有很多專業的現成的解決架構和產品可選。也有廉價的通過軟體實現的思路,比如Linux上的rsync等工具。
6、負載均衡
負載均衡將是大型網站解決高負荷訪問和大量並發請求採用的終極解決辦法。
負載均衡技術發展了多年,有很多專業的服務提供商和產品可以選擇,我個人接觸過一些解決方法,其中有兩個架構可以給大家做參考。
1)硬體四層交換
第四層交換使用第三層和第四層信息包的報頭信息,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用伺服器進行處理。 第四層交換功能就象是虛IP,指向物理伺服器。它傳輸的業務服從的協議多種多樣,有HTTP、FTP、NFS、Telnet或其他協議。這些業務在物理伺服器基礎上,需要復雜的載量平衡演算法。在IP世界,業務類型由終端TCP或UDP埠地址來決定,在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP埠共同決定。
在硬體四層交換產品領域,有一些知名的產品可以選擇,比如Alteon、F5等,這些產品很昂貴,但是物有所值,能夠提供非常優秀的性能和很靈活的管理能力。Yahoo中國當初接近2000台伺服器使用了三四台Alteon就搞定了。
2)軟體四層交換
大家知道了硬體四層交換機的原理後,基於OSI模型來實現的軟體四層交換也就應運而生,這樣的解決方案實現的原理一致,不過性能稍差。但是滿足一定量的壓力還是游刃有餘的,有人說軟體實現方式其實更靈活,處理能力完全看你配置的熟悉能力。
軟體四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server,他提供了基於心跳線heartbeat的實時災難應對解決方案,提高系統的魯棒性,同時可供了靈活的虛擬VIP配置和管理功能,可以同時滿足多種應用需求,這對於分布式的系統來說必不可少。
一個典型的使用負載均衡的策略就是,在軟體或者硬體四層交換的基礎上搭建squid集群,這種思路在很多大型網站包括搜索引擎上被採用,這樣的架構低成本、高性能還有很強的擴張性,隨時往架構裡面增減節點都非常容易。這樣的架構我准備空了專門詳細整理一下和大家探討。

一:高並發高負載類網站關注點之資料庫
沒錯,首先是資料庫,這是大多數應用所面臨的首個SPOF。尤其是Web2.0的應用,資料庫的響應是首先要解決的。
一般來說MySQL是最常用的,可能最初是一個mysql主機,當數據增加到100萬以上,那麼,MySQL的效能急劇下降。常用的優化措施是M-S(主-從)方式進行同步復制,將查詢和操作和分別在不同的伺服器上進行操作。我推薦的是M-M-Slaves方式,2個主Mysql,多個Slaves,需要注意的是,雖然有2個Master,但是同時只有1個是Active,我們可以在一定時候切換。之所以用2個M,是保證M不會又成為系統的SPOF。
Slaves可以進一步負載均衡,可以結合LVS,從而將select操作適當的平衡到不同的slaves上。
以上架構可以抗衡到一定量的負載,但是隨著用戶進一步增加,你的用戶表數據超過1千萬,這時那個M變成了SPOF。你不能任意擴充Slaves,否則復制同步的開銷將直線上升,怎麼辦?我的方法是表分區,從業務層面上進行分區。最簡單的,以用戶數據為例。根據一定的切分方式,比如id,切分到不同的資料庫集群去。
全局資料庫用於meta數據的查詢。缺點是每次查詢,會增加一次,比如你要查一個用戶nightsailer,你首先要到全局資料庫群找到nightsailer對應的cluster id,然後再到指定的cluster找到nightsailer的實際數據。
每個cluster可以用m-m方式,或者m-m-slaves方式。這是一個可以擴展的結構,隨著負載的增加,你可以簡單的增加新的mysql cluster進去。
需要注意的是:
1、禁用全部auto_increment的欄位
2、id需要採用通用的演算法集中分配
3、要具有比較好的方法來監控mysql主機的負載和服務的運行狀態。如果你有30台以上的mysql資料庫在跑就明白我的意思了。
4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的資料庫鏈接池,或者乾脆自己做,因為php4中mysql的鏈接池經常出問題。

二:高並發高負載網站的系統架構之HTML靜態化
其實大家都知道,效率最高、消耗最小的就是純靜態化 http://www.ablanxue.com/shtml/201207/776.shtml的html頁面,所以我們盡可能使我們的網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是 最有效的方法。但是對於大量內容並且頻繁更新的網站,我們無法全部手動去挨個實現,於是出現了我們常見的信息發布系統CMS,像我們常訪問的各個門戶站點 的新聞頻道,甚至他們的其他頻道,都是通過信息發布系統來管理和實現的,信息發布系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、許可權 管理、自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。

除了門戶和信息發布類型的網站,對於交互性要求很高的社區類型網站來說,盡可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社區等也是如此。

同時,html靜態化也是某些緩存策略使用的手段,對於系統中頻繁使用資料庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇 中論壇的公用設置信息,這些信息目前的主流論壇都可以進行後台管理並且存儲再資料庫中,這些信息其實大量被前台程序調用,但是更新頻率很小,可以考慮將這 部分內容進行後台更新的時候進行靜態化,這樣避免了大量的資料庫訪問請求高並發。

網站HTML靜態化解決方案
當一個Servlet資源請求到達WEB伺服器之後我們會填充指定的JSP頁面來響應請求:
HTTP請求---Web伺服器---Servlet--業務邏輯處理--訪問數據--填充JSP--響應請求
HTML靜態化之後:
HTTP請求---Web伺服器---Servlet--HTML--響應請求
靜態訪求如下
Servlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(request.getParameter("chapterId") != null){
String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html";
String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName;
File chapterFile = new File(chapterFilePath);
if(chapterFile.exists()){response.sendRedirect(chapterFileName);return;}//如果有這個文件就告訴瀏覽器轉向
INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl();
NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId")));//章節信息
int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId());
int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId());
request.setAttribute("novelChapter", novelChapter);
request.setAttribute("lastPageId", lastPageId);
request.setAttribute("nextPageId", nextPageId);
new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),
chapterFileName, chapterFilePath, "/bookRead.jsp");
}
}
生成HTML靜態頁面的類:
package com.jb.y2t034.thefifth.web.servlet;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 創建HTML靜態頁面
* 功能:創建HTML靜態頁面
* 時間:2009年1011日
* 地點:home
* @author mavk
*
*/
public class CreateStaticHTMLPage {
/**
* 生成靜態HTML頁面的方法
* @param request 請求對象
* @param response 響應對象
* @param servletContext Servlet上下文
* @param fileName 文件名稱
* @param fileFullPath 文件完整路徑
* @param jspPath 需要生成靜態文件的JSP路徑(相對即可)
* @throws IOException
* @throws ServletException
*/
public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{
response.setContentType("text/html;charset=gb2312");//設置HTML結果流編碼(即HTML文件編碼)
RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);//得到JSP資源
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//用於從ServletOutputStream中接收資源
final ServletOutputStream servletOuputStream = new ServletOutputStream(){//用於從HttpServletResponse中接收資源
public void write(byte[] b, int off,int len){
byteArrayOutputStream.write(b, off, len);
}
public void write(int b){
byteArrayOutputStream.write(b);
}
};
final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));//把轉換位元組流轉換成字元流
HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//用於從response獲取結果流資源(重寫了兩個方法)
public ServletOutputStream getOutputStream(){
return servletOuputStream;
}
public PrintWriter getWriter(){
return printWriter;
}
};
rd.include(request, httpServletResponse);//發送結果流
printWriter.flush();//刷新緩沖區,把緩沖區的數據輸出
FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的資源全部寫入到fileOuputStream中
fileOutputStream.close();//關閉輸出流,並釋放相關資源
response.sendRedirect(fileName);//發送指定文件流到客戶端
}
}

㈣ java高並發

1、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。並發就是可以使用多個線程或進程,同時處理不同的操作。2、處理高並發的方法
對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。
(1)動靜分離。靜態資源請求與動態請求分離,項目中需要訪問的圖片、聲音、js/css等靜態資源需要有獨立的存放位置,便於將來實現靜態請求分離時直接剝離出來,比如nginx可以直接配置圖片文件直接訪問目錄,而不需要經過tomcat。這樣tomcat就可以專注處理動態請求,操作資料庫數據處理之類的。靜態請求代理伺服器性能比tomcat高很多。
(2)引入緩存。資料庫緩存、頁面緩存,這東西好用不復雜,搞明白什麼地方適用最重要。簡單的例子是頻繁讀取,不修改的地方最適用。也是後續集群做數據共享的一個方式之一,集群環境下,經常會碰到數據共享問題。
(3)如果將來數據量大,單一資料庫成為瓶頸時,資料庫的讀寫分離來了。資料庫集群,讀寫分離,分表分區。

㈤ 如何動態分區

用convert.exe 輕松將分區由fat轉換成ntfs系統概要
< type=text/java>
windows xp 支持兩種磁碟文件系統:fat 文件系統和 ntfs 文件系統。本文介紹如何將 fat 分區轉換為 ntfs 分區,並討論一些必須注意的事項。
更多信息
< type=text/java>
windows xp 包括 convert.exe 實用工具,它可以將 fat 分區轉換為 ntfs 分區。convert.exe 使用起來比較簡單,但是在使用此實用工具之前,需要考慮到一些限制。

在將 fat 分區轉換為 ntfs 分區之前應考慮以下限制: ? 這種轉換是單向轉換過程。將分區轉換為 ntfs 後,將無法將該分區轉換回 fat。要將其還原為 fat 分區,需要將該分區重新格式化為 fat,這會擦除分區上的所有數據。需要從備份中還原數據。
? 將計算機上的任何驅動器轉換為 ntfs 後,將無法刪除 windows xp,以還原為 windows 98 或 windows millennium edition (me)。
? 您無法將基於 risc 的計算機上的系統分區轉換為 ntfs。arc 規范要求系統分區必須為 fat。可以創建一個較小的 (1 mb) fat 分區用作系統分區,然後將 windows 安裝在 ntfs 分區(啟動分區)上。
? convert.exe 要求驅動器上有一定的可用空間量,以便能夠轉換文件系統。有關轉換操作所需的可用空間量的其他信息,請單擊下面的文章編號,以查看 microsoft 知識庫中相應的文章: 156560 ( http://support.microsoft.com/kb/156560/) 將 fat 轉換為 ntfs 所需的可用空間
注意:盡管在將 fat 轉換為 ntfs 的過程中數據損壞或丟失的可能性不大,但最好在運行 convert 命令之前完整備份要轉換的驅動器上的數據。在執行轉換之前,最好驗證一下備份的完整性。

要將 fat 分區轉換為 ntfs 分區,請按照下列步驟操作: 1. 單擊開始,單擊運行,鍵入 cmd,然後單擊確定。
2. 在命令提示符處,鍵入 convert 驅動器號:/fs:ntfs。
3. convert.exe 會嘗試將該分區轉換為 ntfs 分區。
在運行 convert 時,您可能會收到以下錯誤信息:
convert cannot gain exclusive access to the driveletter:, so it cannot convert it now.would you like to schele it to be converted the next time the system restarts (y/n)?
如果存在下列三種情況之一,將會收到此錯誤信息: ? 運行 convert 命令的當前目錄位於要轉換的驅動器上(例如,在 f:\> 提示符處鍵入 convert f:/fs:ntfs)。

要解決此問題,或者在錯誤信息中單擊是,然後重新啟動計算機;或者更改到另一驅動器上的目錄,並重新鍵入命令。
? 某個程序在要轉換的驅動器上打開了文件。

要解決此問題,或者在錯誤信息中單擊是,在下次重新啟動計算機時轉換該驅動器;或者關閉可能正在使用該驅動器上文件的所有程序。請記住,這也適用於通過網路連接到文件並連接到該驅動器上的頁面文件的用戶。
? 嘗試轉換正在運行操作系統的分區。

操作系統正在運行時不能轉換啟動分區。要轉換啟動分區,始終需要運行 convert 命令;請在錯誤信息中單擊是,然後重新啟動計算機。在下次重新啟動計算機時該分區將被轉換。或者,您也可以從另一分區上安裝的 windows xp 啟動計算機,然後從 windows xp 中轉換啟動分區。

㈥ 內存的連續分配有哪些方式,各有什麼特點

內存的連續分配方式有:單一連續分配、固定分區分配、動態分區分配以及動態重定位分區分配四種方式。
單一連續分配:只能用於單用戶、單任務的操作系統中。
固定分區分配:可運行多道程序的存儲管理方式。
動態分區分配:根據進程的實際需要,動態地為之分配內存空間。
可重定位分區分配:必須把一個系統或用戶程序裝入一連續的內存空間。

閱讀全文

與java動態分區分配相關的資料

熱點內容
文件夾側面目錄標簽怎麼製作 瀏覽:230
做程序員學什麼 瀏覽:320
pdfeditor教程 瀏覽:880
fortran把文件放入文件夾 瀏覽:709
程序員1年經驗不敢投簡歷 瀏覽:481
如何看電腦的源碼 瀏覽:897
找工作app軟體哪個好 瀏覽:96
信息管理網站源碼 瀏覽:439
小說app哪個好免費 瀏覽:224
域名在線加密 瀏覽:146
軟體編程西安交大 瀏覽:453
是不是串貨的奶粉查不到溯源碼的 瀏覽:825
北京dns伺服器雲主機 瀏覽:221
openldaplinux安裝 瀏覽:23
java取月的最後一天 瀏覽:10
騰訊雲伺服器多久退款 瀏覽:949
微信廣告植入系統源碼 瀏覽:922
一年級語文上冊pdf 瀏覽:315
好久不見app干什麼用的 瀏覽:143
壓縮包解壓碼對方可以更改嗎 瀏覽:256