對 .NET程序2G虛擬地址緊張崩潰 的最后一次反思

一:背景

1. 講故事

最近接連遇到了幾起 2G 虛擬地址緊張 導致的程序崩潰,基本上 90% 都集中在醫療行業,真的很無語,他們用的都是一些上古的 XP,Windows7 x86,我也知道技術人很難也基本無法推動硬件系統和設備的升級,這里蘊含了巨大的人情世故。

寫這一篇的目的是想系統化的整理一下如何配置 3G 開關讓程序吃到更多的內存,讓程序崩潰的不那么頻繁一些,以及如何驗證是否成功開啟!

二:32位操作系統

1. 測試代碼

首先大家要有一個理念:就是 32bit系統上跑的程序,默認只能吃到 2G 內存,因為這涉及到公平,用戶態吃2G,內核態吃2G,為了方便演示,向一個 List 塞入 5000w 的 string,大概占用 2G 內存,然后把程序跑在 Windows7 32bit 操作系統上。

static void Main(string[] args){var list = new List<string>();for (int i = 0; i < 50000000; i++){list.Add(i.ToString());if (i % 10000 == 0) { Console.WriteLine($"i={i}"); }}Console.WriteLine("ok");Console.ReadLine();}

從圖中可以清楚的看到當內存到了631M 的時候就扛不住了,可能有些朋友好奇,為什么才這么點就不行了,這是因為 List 的底層是 2倍 擴容,所以內存大概會漲到 0.63G + 1.2G = 1.83G

有些朋友可能會問,這不是還沒到2G嗎?一般來說內存到了 1.2G+ 的時候崩潰風險就會劇增,這個要謹記!

2. 如何解決

剛才也說了,醫療行業現狀如此,只能通過人情世故去推動,那這 2G 數據真的無處安放嗎? 這時候就只能啟動 3G 開關,那如何啟動呢?

  1. 開啟程序級的 Large Address Aware

這個 Large Address Aware 字段俗稱大地址,途徑就是在 PE 頭里打開一個開關,讓Windows加載器決定是否給程序打開 3G 的綠色通道。

當然看 PE頭 的工具有很多,對于.NET程序個人感覺最好的就是用 DnSpy,它把 File Header 中的 Characteristics 字段具化了,我們選中 Large Address Aware 復選框然后保存,截圖如下:

  1. 開啟機器級別 3G 開關

在32bit操作系統上讓用戶態程序吃到 3G 內存這對操作系統來說是非常謹慎的,畢竟這對內核態是非常不公平的,言外之意就是讓出自己的 1G 給用戶態,這騷操作可能就會把自己坑慘,謹慎起見需要人工開啟機器級別的 3G 開關,命令如下:


bcdedit /set IncreaseUserVa 3072

做了這兩步之后,繼續讓程序跑起來,截圖如下:

從圖中可以清晰的看到,終于有出息了。

更多操作系統配置,可參考這篇文章:https://www.autodesk.com.cn/support/technical/article/caas/sfdcarticles/sfdcarticles/CHS/How-to-enable-a-3GB-switch-on-Windows-Vista-Windows-7-or-Windows-XP-s.html?v=2018

3. 如何驗證是否開啟了 3G

這確實是一個好問題,最簡單的方式就是用!address 觀察下地址空間。


0:000> !addressBaseAddr EndAddr+1 RgnSize     Type       State                 Protect             Usage
-----------------------------------------------------------------------------------------------
...
+ bffde000 bffdf000     1000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     TEB        [~0; aa4.fb8]
+ bffdf000 bffe0000     1000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     PEB        [aa4]
+ bffe0000 bfff0000    10000 MEM_PRIVATE MEM_RESERVE PAGE_NOACCESS                      <unknown>  0:000> ? bfff0000/0x100000
Evaluate expression: 3071 = 00000bff

上面卦中的 bfff0000 轉換過來就是 3G,如果你看到的是這個值,那就恭喜你啦!

如果有朋友想問如何驗證 dump程序是否開啟了大地址,這個可以用windbg提供的 !dh 命令。


0:000> lm
start    end        module name
001e0000 001e8000   ConsoleApp4 C (pdb symbols)          D:\code\MyApplication\ConsoleApp4\obj\x86\Debug\ConsoleApp4.pdb
66dd0000 678c8000   mscorlib_ni   (deferred)             
678d0000 67e61000   mscorwks   (deferred)             
6c7a0000 6c83b000   msvcr80    (deferred)  
...
0:000> !dh ConsoleApp4File Type: EXECUTABLE IMAGE
FILE HEADER VALUES14C machine (i386)3 number of sections
EDB20AC7 time date stamp0 file pointer to symbol table0 number of symbolsE0 size of optional header122 characteristicsExecutableApp can handle >2gb addresses32 bit word machine

如果看到上面卦中的 App can handle >2gb addresses 字樣就表示你開啟成功啦!

三:64位操作系統

1. 如何吃更多內存

在 x64系統上就方便多了, 只需要做第一步開啟 Large Address Aware 即可,畢竟 x64系統 的虛擬地址空間不要太充足,在 48根地址總線上就是2的48次方,所以開啟大地址后,會給 x32 程序4G的尋址空間,即 2 的 32 次方。

接下來直接把剛才的 ConsoleApp4.exe 程序從 Windows7 x86 搬遷到 Windows 10 x64 系統上,然后用 windbg 附加運行, 跑完后使用 !address 查看。


0:007> !address BaseAddr EndAddr+1 RgnSize     Type       State                 Protect             Usage
-----------------------------------------------------------------------------------------------
+        0   c60000   c60000             MEM_FREE    PAGE_NOACCESS                      Free     
...
+ ff671000 ff680000     f000             MEM_FREE    PAGE_NOACCESS                      Free       
+ ff680000 ff6b3000    33000 MEM_MAPPED  MEM_COMMIT  PAGE_READONLY                      Other      [NLS Tables]
+ ff6b3000 ffff0000   93d000             MEM_FREE    PAGE_NOACCESS                      Free       0:007> ? ffff0000 /0x100000
Evaluate expression: 4095 = 00000fff

如果在你的卦中也看到了上面的 ffff0000 ,那就恭喜你,你程序的內存尋址空間擴展到了 4G 。

三:總結

本篇說了這么多,其實都是一些不得已而為之的事情,很心酸,這世上很多東西不是靠技術就能解決的,更需要靠人情事故!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167055.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抖音獲客策略:讓你的品牌在短視頻平臺一鳴驚人!

一、背景介紹 隨著移動互聯網的快速發展&#xff0c;抖音作為一款流行的短視頻平臺&#xff0c;已經成為越來越多企業的獲客渠道。抖音用戶規模龐大&#xff0c;日活用戶數量不斷增長&#xff0c;為企業提供了廣闊的市場空間。本文將介紹抖音獲客策略&#xff0c;幫助企業更好…

UNETR++:深入研究高效和準確的3D醫學圖像分割

論文&#xff1a;https://arxiv.org/abs/2212.04497 代碼&#xff1a;GitHub - Amshaker/unetr_plus_plus: UNETR: Delving into Efficient and Accurate 3D Medical Image Segmentation 機構&#xff1a;Mohamed Bin Zayed University of Artificial Intelligence1, Univers…

哦?是嗎|兜兜轉轉,最后還是選擇了蓋雅排班系統

在之前發布的和「人效案例集」中&#xff0c;我們為大家呈現了很多關于人效提升的理論方法&#xff0c;以及各家企業的人效提升提升實踐。 回過頭來&#xff0c;我們發現&#xff1a;排班管理滲透于人效九宮格之中&#xff0c;也因此成為很多企業人效提升的一個重要中介&#x…

深度學習八股文:混合精度訓練過程出nan怎么辦

其實如果是FP32的訓練&#xff0c;基本的調試方法還是差不多&#xff0c;這里就講一下混合精度訓練過程中的nan。 混合精度訓練使用較低的數值精度&#xff08;通常是半精度浮點數&#xff0c;例如FP16&#xff09;來加速模型訓練&#xff0c;但在一些情況下&#xff0c;可能會…

盤點43個Python登錄第三方源碼Python愛好者不容錯過

盤點43個Python登錄第三方源碼Python愛好者不容錯過 學習知識費力氣&#xff0c;收集整理更不易。 知識付費甚歡喜&#xff0c;為咱碼農謀福利。 項目名稱 bnuz中國電信校園網模擬登錄&#xff0c;python selenium BNUZ教務系統認證爬蟲Python語言實現&#xff0c;你可以用…

NX二次開發UF_CSYS_create_temp_csys 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_temp_csys Defined in: uf_csys.h int UF_CSYS_create_temp_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates …

win10 tensorrt源碼編譯onnx

直接利用官方源碼&#xff0c;如下圖&#xff0c;trtexec源碼在TensorRT安裝目錄下&#xff0c;雙擊trtexec.sln文件&#xff0c;使用vs2019打開源碼工程。 如下圖&#xff0c;以yolov8為例子&#xff0c;編譯成功項目之后&#xff0c;設置命令行參數&#xff1a; --onnxd:/yo…

便攜式工業RFID讀寫器怎么選?

便攜式工業RFID讀寫器在物流、零售、制造等行業都有著極為廣泛的應用。企業利用RFID手持終端設備&#xff0c;可以將采集到的物品信息自動傳輸到中央信息系統&#xff0c;實現數據的實時交換和共享。目前市面上RFID手持終端品牌、型號眾多&#xff0c;ANDEAWELL作為國內物聯網產…

案例精選|聚銘網絡流量智能分析審計系統加強南京市溧水區人社局信息安全防護能力

一字排開的社保綜合服務窗口、實時滾動的數“智”人社大屏、便捷快速的社保卡自助服務機……每位到溧水市民中心人社大廳進行業務辦理的市民對高效的社保服務經辦效率贊嘆不已。 黨的二十大報告提出&#xff0c;健全覆蓋全民、統籌城鄉、公平統一、安全規范、可持續的多層次社…

淺談Linux bash腳本----截取字符串

# 用于刪除左起第一個匹配內容&#xff0c;即截取右側內容 ## 用于刪除右起第一個匹配內容&#xff0c;即截取右側內容 % 用于刪除右起第一個匹配內容&#xff0c;即截取左側內容 %% 用于刪除左起第一個匹配內容&#xff0c;即截取左側內容 舉例 file/dir1/dir2/dir3/…

GPT2-chitchat項目運行

git clone https://github.com/yangjianxin1/GPT2-chitchat.git把項目拉下來 下載模型文件&#xff1a; 從[模型分享]中下載模型文件&#xff0c;例如 model_epoch40_50w。 將模型文件放到正確的位置&#xff1a; 將下載的模型文件夾 model_epoch40_50w 放到項目的 model 目錄…

深入理解數據結構:隊列的實現及其應用場景

文章目錄 &#x1f342;前言&#x1f342;隊列的基本概念和特性&#x1f342;隊列的實現方式?&#x1f331;順序隊列?&#x1f331;鏈式隊列 &#x1f342;隊列的基本操作及示例代碼?&#x1f951;創建隊列?&#x1f951;判空操作?&#x1f951;入隊操作?&#x1f951;出…

GEE:APP中的遙感圖像下載接口設計

作者:CSDN @ _養樂多_ 本文將詳細介紹如何通過Google Earth Engine(GEE)的用戶界面(ui)模塊創建一個下載按鈕,以觸發遙感圖像下載的操作。通過按鈕的點擊事件,我們生成了包含特定參數的圖像下載鏈接,實現了一鍵式遙感圖像下載功能,使整個過程更加智能和直觀。 此外,…

java操作富文本插入到word模板

最近項目有個需求&#xff0c;大致流程是前端保存富文本&#xff08;html的代碼&#xff09;到數據庫&#xff0c;后臺需要將富文本代碼轉成帶格式的文字&#xff0c;插入到word模板里&#xff0c;然后將word轉成pdf&#xff0c;再由前端調用接口下載pdf文件&#xff01; 1、思…

代碼隨想錄算法訓練營第30天|回溯總結 332. 重新安排行程

回溯是遞歸的副產品&#xff0c;只要有遞歸就會有回溯&#xff0c;所以回溯法也經常和二叉樹遍歷&#xff0c;深度優先搜索混在一起&#xff0c;因為這兩種方式都是用了遞歸。 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 回溯算法能解…

Linux安裝Tesseract-OCR(操作系統CentOS)

Linux安裝Tesseract-OCR 第一步&#xff0c;安裝依賴第二步&#xff0c;下載安裝包第三步&#xff0c;安裝leptonica庫第四步&#xff0c;安裝tesseract第五步&#xff0c;添加語言包第六步&#xff0c;測試 第一步&#xff0c;安裝依賴 sudo yum install libpng-devel rpm -q…

從零學算法400

400.給你一個整數 n &#xff0c;請你在無限的整數序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的數字。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;n 11 輸出&#xff1a;0 解釋&#xff1a;第…

ubuntu22.04 arrch64版在線安裝mysql8

腳本 # todo參考鏈接 Ubuntu服務器配置mysql8_ubuntu安裝mysql8-CSDN博客

樂得瑞LDR6020 VR串流線方案:實現同時充電傳輸視頻信號

VR&#xff08;Virtual Reality&#xff09;&#xff0c;俗稱虛擬現實技術&#xff0c;是一項具有巨大潛力的技術創新&#xff0c;正在以驚人的速度改變我們的生活方式和體驗&#xff0c;利用專門設計的設備&#xff0c;如頭戴式顯示器&#xff08;VR頭盔&#xff09;、手柄、定…

三菱PLC定時中斷應用編程(計數器+比較器)

三菱PLC如何開啟定時中斷可以查看下面文章鏈接: PLC定時中斷程序應用注意事項(西門子三菱信捷)_plc設置斷點之后會怎樣_RXXW_Dor的博客-CSDN博客文章瀏覽閱讀2.5k次,點贊5次,收藏6次。首先我們了解下什么是中斷。中斷(打斷的意思),在PLC執行當前程序時,由于系統出現了…