Mobile agents were introduced as a design paradigm for distributed systems to reduce network traffic as compared to client-server based approaches, simply by moving code close to the data instead of moving large amount of data to the client. Although this thesis has been proved in many application scenarios, it was also shown that the performance of mobile agents suffers from too simple migration strategies in many other scenarios. In this paper we identify several reasons for mobile agents' poor performance, most of them related to the Java programming language. We propose solutions to all of these problems and present results of first experiments to show the effectiveness of our approaches.