2014-10-26 28 views
1

這是一個奇怪的問題。 在我的工作中,我使用了一個軟件(沒有人可以修改或採用源代碼的視覺),不幸的是,這個軟件非常糟糕。它在啓動時使用大約1GB內存,但是正在運行和使用,它將數據存儲在內存中,幾個小時後佔用超過4g的內存,並且如果不停止的話,可以累積更多的內存。由於不是我公司的所有電腦都能處理這個問題,所以它們會崩潰有沒有一種方法可以清除從c#中其他軟件編程中的ram中未使用的數據? 我只需要一個提示,我在C#程序。 我很抱歉我的英語,如果這個問題有點不對。 感謝您的時間。清除c中其他軟件的垃圾內存#

編輯:我會添加一些關於這個軟件的信息,更好地理解我能做什麼,以及我能做什麼。 因爲我不會獲得任何黑客入侵這個軟件,但我會有一個更好的生活(不僅僅是我,而是我的同事和員工),我沒有看到任何黑客入侵這個軟件的問題。 (好吧,我的首領沒有問題,他的主管也是)。 我會嘗試Arunasr提示,我在C#中編程,並知道這個功能。我只需要反編譯它。 我必須刪除這個問題嗎? 感謝您給我的所有回覆和所有幫助。

+0

爲什麼你的應用程序分配這麼多的內存?它真的有必要嗎? – Ian 2014-10-26 19:31:20

+0

我不確定你是否不能釋放你不擁有的內存,但是如果你能夠做到,我確信這個程序會更頻繁地崩潰,然後他們不會責怪原始的開發者,但是你的嘗試解決它。不是一個明智的計劃......你可以嘗試連接一個調試器來查明問題,但不僅如此...... – rene 2014-10-26 19:32:19

+1

您是否在問如何修復您無權訪問或API的應用程序中的內存泄漏?我不認爲會有一種方法來修改該應用程序的內部狀態。 對我來說,這個問題似乎是因爲你認爲內存泄漏是「未使用的內存」,但如果是這樣的話,那麼GC就會首先將它回收。有問題的RAM比未使用的更加濫用,這實際上並不是您可以在封閉的應用程序中輕鬆實現的那種區別。 – furkle 2014-10-26 19:33:08

回答

2

在殺死和重新啓動該任務之外,沒有這種方法。如果它是一個Windows服務,您可以使用PowerShell,命令行實用程序SC.exe的,或本C#代碼:

public static void RestartService(string serviceName, int timeoutMilliseconds) 
{ 
    ServiceController service = new ServiceController(serviceName); 
    try 
    { 
    int millisec1 = Environment.TickCount; 
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

    service.Stop(); 
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

    // count the rest of the timeout 
    int millisec2 = Environment.TickCount; 
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1)); 

    service.Start(); 
    service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
    } 
    catch 
    { 
    // ... 
    } 
} 

參考:http://www.csharp-examples.net/restart-windows-service/

2

.NET運行時垃圾回收往往是懶惰和只收集當空閒內存即將耗盡時。您可以強制使用GC.Collect()進行垃圾回收,但請注意性能:如果頻繁執行,則代價很高。

如果庫實際上累積了數據(即數據仍然是引用而GC不能觸及它),除了破解庫之外,你無法做其他事情,找出吃掉內存並釋放不必要對象的東西。反編譯.NET字節碼並不困難。在極端情況下,您可以在加載後使用反射來修改程序集字節碼。除非你絕望,否則我不會推薦它。

您可以使用GC來追蹤真實的內存使用情況統計信息。

+0

該OP沒有權限的來源...它不是他自己的軟件的一部分.... – rene 2014-10-26 19:35:29

+0

@rene我注意到。當然,他確實有程序集,可以將其反編譯爲C#。這是黑客行爲,除非真的絕望,否則不應嘗試。 – ArunasR 2014-10-26 19:37:39

+0

@arunasr「任何人都無法修改或理解源代碼」似乎更多地表明瞭許可問題,而不是無法解釋或不瞭解可執行文件的知識。雖然我確信,如果許可證禁止反編譯,它可能會禁止任何修改其行爲的內容。 – furkle 2014-10-26 19:39:31