This dissertation presents algorithms and mechanisms that enable self-managed, scalable and efficient deployment of large-scale scientific and engineering applications in a highly dynamic and unpredictable distributed environment. Typically these applications are composed of a large number of distributed components and it is important to meet the computational power and network bandwidth requirements of those components and their interactions. However satisfying these requirements in a large-scale, shared, heterogeneous, and highly dynamic distributed environment is a significant challenge. This dissertation focuses on the modeling of the application and underlying architecture into a common abstraction and on the incorporation of autonomic features into those abstractions to achieve self-managed deployment. The experimental results show that it is possible to achieve and maintain efficient deployment by applying the utility function derived in this dissertation based solely on locally available information and without costly global communication or synchronization. The self-management is therefore decentralized and provides better adaptability, scalability and robustness.