十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
物理內(nèi)存是你電腦本身的內(nèi)存大小比如256,512或者更大1G,物理內(nèi)存大小就取決于你的內(nèi)存條大小,這是硬件是沒辦法設(shè)置的。

網(wǎng)站設(shè)計、網(wǎng)站制作服務(wù)團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時竭誠為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)把每個網(wǎng)站當(dāng)做一個產(chǎn)品來開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
合理設(shè)置虛擬內(nèi)存
1、內(nèi)存的設(shè)定主要根據(jù)你的內(nèi)存大小和電腦的用途來設(shè)定。所謂虛擬內(nèi)存就是在你的物理內(nèi)存不夠用時把一部分硬盤空間所為內(nèi)存來使用,不過由于硬盤傳輸?shù)乃俣纫葍?nèi)存?zhèn)鬏斔俣嚷亩?,所以使用虛擬內(nèi)存比物理內(nèi)存效率要慢。個人實際需要的值應(yīng)該自己多次調(diào)整為好。 設(shè)的太大會差生大量的碎片,嚴(yán)重影響系統(tǒng)速度,設(shè)的太小就不夠用,于是系統(tǒng)就會提示你虛擬內(nèi)存太小。
2、一般情況下,可讓W(xué)indows來自動分配管理虛擬內(nèi)存,它能根據(jù)實際內(nèi)存的使用情況,動態(tài)調(diào)整虛擬內(nèi)存的大小。
3、定義虛擬內(nèi)存,一般默認(rèn)的虛擬內(nèi)存大小是取一個范圍值,最好給它一個固定值,這樣就不容易產(chǎn)生磁盤碎片,具體數(shù)值根據(jù)你的物理內(nèi)存大小來定,256MB一般設(shè)為512MB ,玩游戲可設(shè)大一些,設(shè)為768MB。
4、擬內(nèi)存最好不要與系統(tǒng)設(shè)在同一分區(qū)內(nèi),內(nèi)存是隨著使用而動態(tài)地變化,C盤就容易產(chǎn)生磁盤碎片,影響系統(tǒng)運行速度,所以,最好將虛擬內(nèi)存設(shè)置在其它分區(qū)中磁盤剩余空間較大而又不常用而又靠前的盤中,如D、E,這樣可以避免系統(tǒng)在此分區(qū)內(nèi)進行頻繁的讀寫操作而影響系統(tǒng)速度。虛擬內(nèi)存在一臺電腦中,只能是一個,可放在磁盤的任何一個分區(qū)中。
計算機-屬性.-高級系統(tǒng)設(shè)置-性能點一下設(shè)置-高級-更改.
物理內(nèi)存,顧名思義,物理上,真實存在的插在主板內(nèi)存槽上的內(nèi)存條的容量的大小,看計算機配置的時候,主要看的就是這個物理內(nèi)存。物理?內(nèi)存是計算機上的最重要的資源之一。Windows的內(nèi)存管理器負(fù)責(zé)給活動進程、設(shè)備驅(qū)動,和操作系統(tǒng)自己分配內(nèi)存。
因為絕大多數(shù)系統(tǒng)所能訪問的數(shù)據(jù)和代碼遠比物理內(nèi)存多,所以從本質(zhì)上來說,物理內(nèi)存是代碼和數(shù)據(jù)在其中運行的窗口。所以內(nèi)存容量對性能有影響,因為如果進程或者操作系統(tǒng)所需的代碼或者數(shù)據(jù)不存在,內(nèi)存管理器就需要從磁盤中讀取這些內(nèi)容。
內(nèi)存分配失敗的原因
內(nèi)存不是永遠都招之即來、用之不盡的,有時候內(nèi)存分配也會失敗。下面是我整理的內(nèi)存分配失敗的原因,希望對你有幫助!
程序需要一塊內(nèi)存用以保存數(shù)據(jù)時,就需要調(diào)用操作系統(tǒng)提供的功能函數(shù)來申請,如果內(nèi)存分配成功,函數(shù)就會將所新開辟的內(nèi)存區(qū)地址返回給應(yīng)用程序,應(yīng)用程序就可以通過這個地址使用這塊內(nèi)存。這就是動態(tài)內(nèi)存分配,內(nèi)存地址也就是編程中的'指針。
內(nèi)存不是永遠都招之即來、用之不盡的,有時候內(nèi)存分配也會失敗。當(dāng)分配失敗時系統(tǒng)函數(shù)會返回一個0值,這時返回值0已不表示新啟用的指針,而是系統(tǒng)向應(yīng)用程序發(fā)出的一個通知,告知出現(xiàn)了錯誤。作為應(yīng)用程序,在每一次申請內(nèi)存后都應(yīng)該檢查返回值是否為0,如果是,則意味著出現(xiàn)了故障,應(yīng)該采取一些措施挽救,這就增強了程序的健壯性。
若應(yīng)用程序沒有檢查這個錯誤,它就會按照思維慣性認(rèn)為這個值是給它分配的可用指針,繼續(xù)在之后的運行中使用這塊內(nèi)存。真正的0地址內(nèi)存區(qū)保存的是計算機系統(tǒng)中最重要的中斷描述符表,絕對不允許應(yīng)用程序使用。在沒有保護機制的操作系統(tǒng)下(如DOS),寫數(shù)據(jù)到這個地址會導(dǎo)致立即死機,而在健壯的操作系統(tǒng)中,如Windows等,這個操作會馬上被系統(tǒng)的保護機制捕獲,其結(jié)果就是由操作系統(tǒng)強行關(guān)閉出錯的應(yīng)用程序,以防止其錯誤擴大。這時候,就會出現(xiàn)上述的寫內(nèi)存錯誤,并指出被引用的內(nèi)存地址為0x00000000。
內(nèi)存分配失敗故障的原因很多,內(nèi)存不夠、系統(tǒng)函數(shù)的版本不匹配等都可能有影響。因此,這種分配失敗多見于操作系統(tǒng)使用很長時間后,安裝了多種應(yīng)用程序(包括無意中安裝的病毒程序),更改了大量的系統(tǒng)參數(shù)和系統(tǒng)文件之后。 ;
具體如下:
1、最大支持內(nèi)存和操作系統(tǒng)有直接關(guān)系,即使是64位處理器,使用32位操作系統(tǒng)支持的內(nèi)存也最多為2的32次方,就是4G。
2、在windows 32位操作系統(tǒng)中最大只識別3.25-3.75之間,根據(jù)windows版本不同而不同。
3、64位操作系統(tǒng)的尋址能力就是2的64次方。也就是17179869184G,當(dāng)然這只是理論值,實際中不可能用到這么大的內(nèi)存,目前64位windows系統(tǒng)最大只支持128G。
4、當(dāng)前主流主板是16G。
知識拓展:
Win10系統(tǒng)占用內(nèi)存多的合理解釋:
盡可能維持較大的可用內(nèi)存數(shù):大部分情況下,只要有程序暫時不用,就把相關(guān)數(shù)據(jù)分頁到硬盤上,確保內(nèi)存占用非常非常低。這樣的做法可能造成的結(jié)果是,每次切換到一個程序的窗口,可能都要卡一兩秒。
隨后才能顯示窗口中的內(nèi)容,同時硬盤頻繁工作,將不用的數(shù)據(jù)分頁到硬盤,并把程序需要的數(shù)據(jù)從硬盤重新讀回內(nèi)存。大量物理內(nèi)存始終處于閑置狀態(tài)。
目前 SSD 硬盤開始流行,SSD 每個存儲區(qū)塊的寫入次數(shù)是有局限的,頻繁的分頁操作也會無謂地消耗 SSD 的使用壽命。
因此現(xiàn)在 Windows 10 又提供了內(nèi)存壓縮功能,可以在需要分頁到硬盤之前,對需要分頁的數(shù)據(jù)進行壓縮,借此降低需要寫入硬盤的數(shù)據(jù)量,間接延長 SSD 的使用壽命。
盡可能使用內(nèi)存作為緩存(目前 Windows 的做法):大部分情況下,只要還有足夠多的物理內(nèi)存,就盡量避免執(zhí)行分頁操作,將盡可能多的數(shù)據(jù)保持在內(nèi)存中。
這樣的做法可能造成的結(jié)果是:內(nèi)存占用率始終比較高,但切換到任何一個程序的窗口,都會立刻看到程序中的內(nèi)容,同時硬盤大部分時間都是空閑的w10zj.com。
Windows 操作系統(tǒng)的使用
Windows 規(guī)定了這個限制條件,目的是為了確保內(nèi)核對象結(jié)構(gòu)保持狀態(tài)的一致。下面是關(guān)于Windows 操作系統(tǒng)的使用,希望大家認(rèn)真閱讀!
1,進程虛擬地址空間
在windows操作系統(tǒng)中,每個進程都有自己的私有地址空間,因此一個進程的線程只能訪問屬于這個進程的內(nèi)存空間,即進程之間是地址隔離的。在windows2000中,進程虛擬地址空間可分為如下四個部分:
1)NULL 區(qū) (0x00000000~0x0000FFFF): 如果進程中的一個線程試圖操作這個分區(qū)中的數(shù)據(jù),CPU就會引發(fā)非法訪問。他的作用是,調(diào)用malloc等內(nèi)存分配函數(shù)時,如果無法找到足夠的內(nèi)存空間,它將返回NULL。而不進行安全性檢查。它只是假設(shè)地址分配成功,并開始訪問內(nèi)存地址0x00000000(NULL)。由于禁止訪問內(nèi)存的這個分區(qū),因此會發(fā)生非法訪問現(xiàn)象,并終止這個進程的運行。
2)用戶模式分區(qū) ( 0x00010000~0xBFFEFFFF):這個分區(qū)中存放進程的私有地址空間。一個進程無法以任何方式訪問另外一個進程駐留在這個分區(qū)中的數(shù)據(jù)(相同exe,通過copy-on-write來完成地址隔離)。(在windows中,所有.exe和動態(tài)鏈接庫都載入到這一區(qū)域。系統(tǒng)同時會把該進程可以訪問的所有內(nèi)存映射文件映射到這一分區(qū))。
2)隔離區(qū) (0xBFFF0000~0xBFFFFFFF):這個分區(qū)禁止進入。任何試圖訪問這個內(nèi)存分區(qū)的操作都是違規(guī)的。微軟保留這塊分區(qū)的目的是為了簡化操作系統(tǒng)的現(xiàn)實。
3)內(nèi)核區(qū) (0xC0000000~0xFFFFFFFF):這個分區(qū)存放操作系統(tǒng)駐留的代碼。線程調(diào)度、內(nèi)存管理、文件系統(tǒng)支持、網(wǎng)絡(luò)支持和所有設(shè)備驅(qū)動程序代碼都在這個分區(qū)加載。這個分區(qū)被所有進程共享。
一、在這一節(jié),我們詳細(xì)討論一下用戶模式分區(qū),用戶模式分區(qū)從地地址到高地址依次為:
1)代碼段,存放函數(shù)體的二進制代碼。
2)靜態(tài)數(shù)據(jù)區(qū)(分為以初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段)全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放 。
3)堆,一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。
......(未映射部分)(這個部分包含各種導(dǎo)入的dll等)
4)棧, 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
二、下面詳細(xì)介紹exe導(dǎo)入到執(zhí)行的全過程,以及地址空間的加載。
1)系統(tǒng)找到在調(diào)用CreateProcess時指定的exe文件。
2)系統(tǒng)創(chuàng)建一個新進程的內(nèi)核對象。
3)系統(tǒng)為這個新進程創(chuàng)建一個私有的地址空間。
4)系統(tǒng)保留一個足夠大的地址空間區(qū)域,用來存放exe文件。這個區(qū)域的位置在exe文件中設(shè)定。默認(rèn)情況下,exe文件的基地址是0x0400000. (1.編譯器處理每個源代碼模塊,生成obj文件。2.鏈接程序?qū)⑺衞bj模塊的內(nèi)容組合在一起,生成一個單獨的可執(zhí)行映射文件即exe,該映射文件包含用于可執(zhí)行模塊的所有二進制代碼以及全局/靜態(tài)數(shù)據(jù)變量,同時也包含一個導(dǎo)入部分,列出了該可執(zhí)行模塊所需要的所有dll模塊的名字,對于每個列出的 dll名,該導(dǎo)入部分指明了那些函數(shù)和變量符號是被可執(zhí)行的二進制代碼所引用的)
5)在將exe文件映射到進程的地址空間之后,系統(tǒng)會訪問exe 文件中的一個段(這個段列出了一些DLL文件),并列出exe文件代碼中調(diào)用函數(shù)dll文件的部分。然后,系統(tǒng)為每個dll文件調(diào)用loadlibrary函數(shù),如果某個dll文件需要調(diào)用更多的 dll,那么系統(tǒng)會再次調(diào)用loadlibrary函數(shù),來加載這個dll。系統(tǒng)保留一個足夠大的地址空間區(qū)域,用來存放這個dll文件。默認(rèn)情況下,微軟創(chuàng)建dll文件基地址0x10000000。 windows提供的所有標(biāo)準(zhǔn)系統(tǒng)dll都有不同的基地址,這樣,即使加載到單個地址空間,他們之間也不會重疊。(1.編譯器處理每個源代碼模塊,生成一個obj模塊。2.鏈接程序?qū)⑺衞bj模塊的內(nèi)容組合在一起,生成一個單獨的dll映像文件,該映像文件包含用于dll的所有二進制代碼以及全局/靜態(tài)數(shù)據(jù)變量。3.如果鏈接程序檢查到dll的源代碼模塊至少導(dǎo)出了一個函數(shù)或變量,則鏈接程序同時生成一個單獨的lib文件,這個lib文件很小,只是簡單地列出了所有被導(dǎo)出的函數(shù)和變量的符號名)
6)當(dāng)把所有的exe文件和dll文件都映射到進程的地址空間之后,系統(tǒng)就會創(chuàng)建一個線程內(nèi)核對象,并使用該線程以DLL_PROCESS_ATTACH為參數(shù)來調(diào)用每個DLL的DllMain函數(shù),當(dāng)所有映射的DLL都對此通知做出相應(yīng)后,系統(tǒng)將驅(qū)使主線程開始執(zhí)行exe文件的啟動代碼(winmainCRTStartup 函數(shù)),這個函數(shù)負(fù)責(zé)對c/c++運行時庫進行初始化和調(diào)用函數(shù)入口函數(shù)(main 或 winmain)。
下面強調(diào)一些dll和lib的加載區(qū)別:
dll允許可執(zhí)行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數(shù)的可執(zhí)行代碼所需的信息(即將dll附帶的lib加載到可執(zhí)行模塊中)。
對于lib文件,鏈接器從靜態(tài)鏈接庫LIB獲取所有被引用函數(shù),并將庫同代碼一起放到可執(zhí)行文件中。
三、堆和棧的理論知識
3.1申請方式
stack: 由系統(tǒng)自動分配。 例如,聲明在函數(shù)中一個局部變量 int b; 系統(tǒng)自動在棧中為b開辟空間
heap: 需要程序員自己申請,并指明大小,在c中malloc函數(shù) ,在C++中用new運算符 。
3.2 申請后系統(tǒng)的響應(yīng)
棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。
堆:首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請時,
會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的'空間分配給程序,另外,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內(nèi)存空間。另外,由于找到的堆結(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中。
3.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
3.4申請效率的比較:
棧由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內(nèi)存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內(nèi)存,雖然用起來最不方便。但是速度快,也最靈活。
3.5堆和棧中的存儲內(nèi)容
棧: 在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址,然后是函數(shù)的各個參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的,然后是函數(shù)中的局部變量。注意靜態(tài)變量是不入棧的。
當(dāng)本次函數(shù)調(diào)用結(jié)束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地址,也就是主函數(shù)中的下一條指令,程序由該點繼續(xù)運行。
堆:一般是在堆的頭部用一個字節(jié)存放堆的大小。堆中的具體內(nèi)容有程序員安排。
3.6 “棧(stack)”和“堆(heap)”是兩種不同的動態(tài)數(shù)據(jù)區(qū),棧是一種先進后出的線性結(jié)構(gòu),棧頂?shù)刂房偸切∮诘扔跅5幕刂?。堆是一種鏈?zhǔn)浇Y(jié)構(gòu)。進程的每個線程都有私有的“?!保悦總€線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動態(tài)數(shù)據(jù)區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量。
四、下面說明一下啊函數(shù)的調(diào)用堆棧變換,來更好的理解堆棧的原理。(VS2005測試)
壓棧的順序是從高地址向低地址方向。
1)參數(shù)以從右到左的次序壓入堆棧。
2)壓入EBP的值(書上分析這個位置插入一個函數(shù)返回指令地址,但分析時沒有發(fā)現(xiàn)因為間隔只有4個字節(jié))
3)壓入局部變量
4)返回值放入EAX寄存器中。因為win32匯編一般用eax返回結(jié)果 所以如果最終結(jié)果不是在eax里面的話 還要把它放到eax。所以返回值的釋放過程在參數(shù)之后進行。
;