Reputation: 8456
Is there any way to set a system wide memory limit a process can use in Windows XP? I have a couple of unstable apps which do work ok for most of the time but can hit a bug which results in eating whole memory in a matter of seconds (or at least I suppose that's it). This results in a hard reset as Windows becomes totally unresponsive and I lose my work.
I would like to be able to do something like the /etc/limits on Linux - setting M90, for instance (to set 90% max memory for a single user to allocate). So the system gets the remaining 10% no matter what.
Upvotes: 53
Views: 128781
Reputation: 442
From an end-user perspective, there are some helpful answers (and comments) at the superuser question “Is it possible to limit the memory usage of a particular process on Windows”, including discussions of how to set recursive quota limits on any or all of:
… mostly via the built-in Windows ‘Job Objects’ system (as mentioned in @Adam Mitz’s answer and @Stephen Martin’s comment above), using:
(Note: nested Job Objects ~may~ not have been available under all earlier versions of Windows, but the un-nested version appears to date back to Windows XP)
As far as overall per-user quotas:
(NTFS does support per-user file system ~storage~ quotas, though)
Besides simple BIOS or ‘energy profile’ restrictions:
Footnotes, regarding per-process and other resource quotas / QoS for non-Windows systems:
renice
, others?Upvotes: 3
Reputation: 16509
Use the Application Verifier (AppVerifier) tool from Microsoft.
In my case I need to simulate memory no longer being available so I did the following in the tool:
After 2 minutes my program could no longer allocate new memory and I was able to see how everything was handled.
Upvotes: 24
Reputation: 6846
No way to do this that I know of, although I'm very curious to read if anyone has a good answer. I have been thinking about adding something like this to one of the apps my company builds, but have found no good way to do it.
The one thing I can think of (although not directly on point) is that I believe you can limit the total memory usage for a COM+ application in Windows. It would require the app to be written to run in COM+, of course, but it's the closest way I know of.
The working set stuff is good (Job Objects also control working sets), but that's not total memory usage, only real memory usage (paged in) at any one time. It may work for what you want, but afaik it doesn't limit total allocated memory.
Upvotes: 3
Reputation: 6043
Use Windows Job Objects. Jobs are like process groups and can limit memory usage and process priority.
Upvotes: 39
Reputation: 19863
Depending on your applications, it might be easier to limit the memory the language interpreter uses. For example with Java you can set the amount of RAM the JVM will be allocated.
Otherwise it is possible to set it once for each process with the windows API
SetProcessWorkingSetSize Function
Upvotes: 4