[英]How does memory management in Java and C# differ?
我正在閱讀2010年CWE / SANS排名前25位最危險的編程錯誤 ,其中一個條目是緩沖區復制而不檢查輸入大小 。 它建議使用具有功能的語言來預防或緩解此問題,並說:
例如,許多執行自己的內存管理的語言(如Java和Perl)不會受到緩沖區溢出的影響。 其他語言(如Ada和C#)通常提供溢出保護,但程序員可以禁用保護。
我不知道Java和C#在內存管理方面有任何有意義的不同。 Java如何不受緩沖區溢出的影響,而C#只能防止溢出? 如何在C#中禁用這種保護?
好的答案。 我想補充一點,Java依賴於堆棧或堆內存位置的使用。 C#也是如此。 使用原始指針的想法是C#的一個補充,它來自它的C代碼背景。 雖然C#和C / C ++不是相同的代碼語言,但它們確實共享一些共性語義。 使用“不安全”代碼的想法允許您避免在堆上保留大對象,其中內存限制為每個運行時實例大約2GB(對於每個CLR的C#,對於每個JVM實例的Java),而不會因垃圾回收而導致性能急劇下降。 在某些情況下,您可以使用C#的能力來利用不安全或手動管理的內存指針來解決這樣的事實,即在堆外部緩存等問題的第三方工具並不多。
我會提醒您,如果您使用不安全的代碼,請務必熟悉“一次性類型”和“終結器”。 這可能是一個相當先進的做法,並且沒有正確處理對象的后果與C代碼相同......可怕的MEMORY LEAK。 你的應用程序內存不足會導致內存不足(不好)。 這就是為什么C#默認不允許它,並且您需要使用“unsafe”關鍵字覆蓋任何手動控制指針的使用。 這確保了任何手動處理的內存都是有意的。 在處理“unsafe”關鍵字時,請加上您的C代碼帽。
對此的一個很好的參考是Andrew Troelsen撰寫的“Pro C#2010和.Net平台”中的“理解對象生命周期”一章。 如果您更喜歡在線參考,請參閱MSDN網站實施最終確定和處理以清理非托管資源
最后一點 - 非托管內存在對象的終結器部分釋放(~ObjectName(){...})。 這些模式確實會增加性能開銷,因此如果您處理較低延遲的情況,最好通過保持對象輕松來實現。 如果您正在處理人類反應,那么您應該在絕對必要的情況下考慮這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.