簡體   English   中英

Java和C#中的內存管理有何不同?

[英]How does memory management in Java and C# differ?

我正在閱讀2010年CWE / SANS排名前25位最危險的編程錯誤 ,其中一個條目是緩沖區復制而不檢查輸入大小 它建議使用具有功能的語言來預防或緩解此問題,並說:

例如,許多執行自己的內存管理的語言(如Java和Perl)不會受到緩沖區溢出的影響。 其他語言(如Ada和C#)通常提供溢出保護,但程序員可以禁用保護。

我不知道Java和C#在內存管理方面有任何有意義的不同。 Java如何不受緩沖區溢出的影響,而C#只能防止溢出? 如何在C#中禁用這種保護?

java不支持原始指針(嚴格來說它不支持指針運算)。

在C#中,您可以使用不安全的代碼和指針以及非托管內存,這會使緩沖區溢出成為可能。 請參閱unsafe關鍵字。

為了保持類型安全性和安全性,默認情況下C#不支持指針算法。 但是,通過使用unsafe關鍵字,您可以定義可以使用指針的不安全上下文。 有關指針的更多信息,請參閱指針類型主題。

好的答案。 我想補充一點,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM