In recent years, the world has witnessed the rapid emergence of several novel technologies and computing environments, including cloud computing, ubiquitous computing and sensor networks. These environments have been rapidly capitalised upon for building new types of applications, and bringing added-value to users. At the same time, the resulting applications have been raising a number of new significant challenges, mainly related to system design, deployment and life-cycle management during runtime. Such challenges stem from the very nature of these novel environments, characterized by large scales, high distribution, resource heterogeneity and increased dynamism. The main objective of this thesis is to provide a generic, reusable and extensible self-management solution for these types of applications, in order to help alleviate this stringent problem. We are particularly interested in providing support for the runtime management of system architecture and life-cycle, focusing on applications that are component-based and that run in highly dynamic, distributed and large-scale environments.