1. A method of managing a distributed-memory parallel application running on multiple servers, the method comprising: partitioning the distributed-memory parallel application into a plurality of executable program components, the plurality of executable program components being configured to communicate with one another; packaging the executable program components separately into a plurality of virtual machines; assigning the plurality of virtual machines to one or more physical servers; and dynamically migrating the virtual machines between the one or more physical servers, wherein said partitioning comprises calculating said partitions according to semantics, and wherein a computational power applied to the plurality of executable program components is updated based on how much computational power each one of the plurality of executable program components requires.