Как быстро использовать оперативную память для проверки сборки мусора?

Windows Server 2008. Как я могу быстро израсходовать ОЗУ, чтобы включить GC в моем приложении. Если есть способ сделать это без использования Visual Studio или установки языковой среды выполнения, это было бы хорошо.

РЕДАКТИРОВАТЬ: я не хочу, чтобы написать приложение, а затем скопировать его на сервер. Я ищу способ сделать это быстро без написания приложения, которое требует IDE или установки среды выполнения / компилятора. Возможно, PowerShell или пакетный скрипт? ...

10.11.2009 18:51:30
Мне любопытно, почему вы когда-нибудь нуждаетесь или хотите сделать это. На языках, которые собирают мусор, вы должны доверять сборщику мусора, чтобы он правильно выполнял свою работу.
Thomas Owens 10.11.2009 18:54:03
У меня утечка памяти, которая исчезает, когда я вручную вызываю GC: - /
Mr. Flibble 10.11.2009 18:59:03
@Mr Flibble: Какой язык / время выполнения вы используете?
Sam Harwell 10.11.2009 19:01:05
@Mr Flibble: Если утечка исчезает, когда вы вызываете сборщик мусора, разве это не дисквалифицирует ее как «утечку»?
axel_c 10.11.2009 19:14:44
кто всех недооценивает, не объясняя почему? все эти ответы имели смысл до того, как плакат отредактировал вопрос. он попросил ответы и сказал, что предпочел бы не программирование, но также подразумевалось, что ответы на вопросы программирования возможны.
Peter Recore 10.11.2009 19:23:09
3 ОТВЕТА
РЕШЕНИЕ

Я не думаю, что использование RAM вне вашего процесса обязательно вызовет GC.

Если я правильно понимаю ваш вопрос, у вас есть программа Foo.exe, написанная на каком-то неизвестном языке, работающая в неизвестном времени выполнения (вам не разрешено публиковать подробности по какой-либо причине, или вы просто не знаете?), И Вы хотите попытаться заставить среду выполнения этой программы запустить сборку мусора. Однако вы хотите сделать это, используя RAM вне foo.exe.

Вы можете сделать это, создав простой пакетный файл, который запускает сотни копий IE или Word или любой другой программы, которую вы хотите. Тем не менее, я не думаю, что это сделает то, что вы хотите. Если ваш процесс уже выделил определенный объем памяти, он не обязательно откажется от этой памяти или вызовет GC только потому, что запускаются другие процессы. Он может перелистывать страницы на диск или заставлять другие программы перелистывать страницы на диск. Но не все сборщики мусора одинаковы, поэтому мы не можем помочь без более подробной информации. Я почти уверен, что некоторые виртуальные машины никогда не возвращают память, даже когда они выделены, даже после GC.

3
10.11.2009 19:18:45
Спасибо, Питер. Поэтому внешняя нехватка памяти (внешняя по отношению к моему приложению) не вызовет сборку мусора. Моя ошибка. К сожалению, я работаю в среде .NET в IIS (приложение ASP.NET MVC). У меня есть текст данных LINQ2SQL, который создается с помощью контейнера Windsor IoC для каждого веб-запроса. По какой-то причине текст данных LINQ2SQL не получает GCed естественным образом и вызывает исключения OutOfMemory в моем приложении. Если я вызову GC вручную, когда я закончу с текстом данных, утечка памяти исчезнет.
Mr. Flibble 10.11.2009 19:24:39
@Г-н. Flibble: DataContextреализует IDisposable. Вы правильно его утилизируете (например, usingблоком)?
Daniel Pryden 10.11.2009 19:28:39
Даниэль, его нет в usingблоке, но я попытался позвонить, .Disposeно это не дало эффекта. Вызов GC имеет эффект без звонка.Dispose
Mr. Flibble 10.11.2009 19:31:49
Я бы сказал, что ваша проблема в том, что где-то у вас есть IDisposableобъект, от которого вы не избавляетесь. GC управляет только «управляемыми» распределениями. В вашем случае вы выполняете LINQ to SQL, поэтому ваш драйвер SQL Server будет выделять большие объекты данных непосредственно из ОС (как «неуправляемая» память). ГХ не может выпустить эти объекты обратно в ОС. Все, что может сделать GC - это освободить управляемый объект, который содержит указатель на неуправляемый объект. Если вам повезет, у управляемого объекта будет финализатор, и принудительное выполнение GC заставит этот финализатор запустить и освободить объект.
Daniel Pryden 10.11.2009 19:40:01
Но вся причина в том, что IDisposableинтерфейс существует, заключается в том, что вы можете явно освобождать неуправляемые ресурсы, удерживаемые управляемым объектом. Таким образом, вам нужно просто просмотреть свой код и каждый раз, когда вы создаете какой-либо объект, который реализует IDisposable, убедитесь, что он находится в usingблоке, или же есть finallyпредложение, которое вызывает .Dispose().
Daniel Pryden 10.11.2009 19:41:44

Вы можете запустить вашу программу на виртуальной машине, такой как Virtual Box , где вы определяете потолок памяти гостевой операционной системы.

У меня проблемы с воображением сценария, где это было бы необходимо, хотя. Не могли бы вы предоставить больше информации о проблеме?

-1
10.11.2009 18:56:59

Если вы используете Java, вы можете указать максимальный объем памяти, используя Xmx. Поиск настроек памяти JVM

-1
10.11.2009 19:10:01