Say, "run myApp.jar with cpu=800 and memory=1024"
Ive been doing java programming for many years and it is an embarrasment to ask this question. I don't even know whether this is possible or not. And if so, how?
What I just want know is if it is possible to set a java program's maximum memory and cpu usage. I suddenly thought of this because of I recently started developing mobile apps. I want to know how the app will behave on the device which has very limited memory and processor.
I saw physics engines with demo apps that run on the browser or I can execute on my PC. What if I run them on a mobile device? Will the performance be the same? Rather than developing a sample mobile app to test the library's performance, I'd rather run it with a specific cpu and memory using my PC first.
I tried googling by the way... all i found was monitoring and performance tuning. I may be using wrong keywords.
you can limit memory usage by -Xmx option and you can limit CPU usage by setting priority of the process and/or CPU affinity.
The JVM has no control over CPU usage nor priority.
JVM has control over max/min Memory usage.
There is a workaround. It is possible to run each JVM in a separate Docker container. And control the resource (Memory, CPU, Network, IO) allocation for each container. That is exactly the added value of the Docker containers.
In this scenario it might help to run the app on a Mobile emulator (E.g. Android).
With this you can emulate a mobile device with specific CPU/Memory. So, you should get performance this is comparable to a device that has slower CPU and lesser RAM.
Android / Nokia emulator are free and available for download from developer sections of Nokia/Google sites.
https://github.com/haosdent/jcgroup
jcgroup is your best choice. You could use this library to limit the CPU shares, Disk I/O speed, Network bandwidth and etc.
Please, be careful with memory and CPU options when running jvm 8 or earlier.
There are a couple of very nice articles about that. Check it out:
https://developers.redhat.com/blog/2017/03/14/java-inside-docker/
https://jaxenter.com/nobody-puts-java-container-139373.html
Having said that, containerization - is the right way to go for microservice architecture regardless of the stack, and jvm is not as exception to that. It is however, important to be aware of the caveats.
For CPU you can try my new lib :).
https://github.com/dyorgio/cpu-watcher
Example of use:
// Limit process by PID to 25% of host cpu usage
CpuWatcher cpuWatcher = new CpuWatcher(pid, 25f);
cpuWatcher.start();