# RMI macht Anwendung langsam?



## K-Man (12. Dez 2005)

Hallo
Ich habe folgendes Problem. Eine fertige Anwendung soll netzwerkfähig gemacht werden. Doch seit RMI ist die Anwendung deutlich langsamer geworden. Es geht dabei nicht um die Datenübertragung übers Netz, sondern die Anwendung selber. Ich erzeuge eigentlich nur ein einziges Remoteobjekt, welches aber nicht mal benutzt wird. Trotzdem ist die Anwendung sehr langsam geworden. Kann es ein, dass RMI eine Anwendung bremst?

Hier die Methode, die den Server erzeugt:

```
public void setUp(String remoteNaming)
{
try
{
	LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (RemoteException e1)
{
	e1.printStackTrace();
}
if (System.getSecurityManager() == null)
{
	System.out.println("No security manager found. Initialise new one...");
	URL policyFile = ClassLoader.getSystemResource("xxx/java.policy");
	System.setProperty("java.security.policy", policyFile.toString());
	System.setSecurityManager(new RMISecurityManager());
}
try
{
	Server server = new ServerImpl();
	UnicastRemoteObject.exportObject(server);
	Naming.rebind(remoteNaming, server);
	System.out.println("Server bound");
}
catch (Exception e)
{
	System.err.println("Server exception: " + e.getMessage());
	e.printStackTrace();
}
}
```
Funktioniert auch alles...ich kann auch auf Methoden der Remote-Objekte zugreifen.

In der Anwendung wird der Server so erzeugt:

```
new Setup().setUp(SERVER_NAME);
```

Nur alleine durch den Aufruf der Setup-Methode wird die komplette Anwendung extrem langsam. Erzeugen der Registry, zugreifen auf entfernte Objekte, alles funktioniert einwandfrei. Aber auch ohne irgendwelche Zugriffe ist die Anwendung deutlich langsamer geworden...Hoffentlich kann mir jemand helfen. Liegt es an RMI? Ist RMI überhaupt empfehlenswert, oder sollte RMI eigentlich eine Anwendung nicht verlangsamen?


----------



## K-Man (12. Dez 2005)

Also ich hab zumindest schon herausgefunden, dass die Anwendung nur langsam ist, wenn der Server local erzeugt wird.
Ist der Server auf einem anderen Rechner, dann läuft alles wie gewohnt. Ist der Server aber local auf dem selben Rechner, dann ist die Performance deutlich langsamer..


----------



## Guest (12. Dez 2005)

Auf dem anderen Rechner ist der Server auch lokal. Es ist nur eine Frage 
des Standpunkts. :wink:


----------



## K-Man (12. Dez 2005)

Schon klar. Trotzdem ist es komisch.
Wenn ich den Server auf einem entfernten Rechner starte und ich mich mit der Anwendung an den Server verbinden, dann geht eigentlich alles ohne Probleme. Sobald ich aber einen Server auf den Computer erstelle, auf dem auch die Anwendung läuft, dann ist die Performance der Anwendung sehr schlecht...


----------



## André B. (12. Dez 2005)

Ist das denn schlimm? Soll den die Anwendung eine Netzwerkverbindung von localhost zu localhost herstellen?  ???:L


----------



## Guest (13. Dez 2005)

Welches Betriebssystem? Es klingt als wäre der Loopbackadapter die Spassbremse.
Wie wird der Hostname aufgelöst? Ist es auch dann langsam, wenn der PC nicht 
online ist? Irgendeine paranoide Firewall drauf?
Starte den Server mit dem Parameter 

-Djava.rmi.server.logCalls=true

Tauchen da andere Adressen als 127.0.0.1 auf?
Es kann zig Ursachen haben. Normal ist es nicht, wenn auch "langsam" ein subjektiver
Eindruck ist.


----------



## K-Man (13. Dez 2005)

Also log sieht so aus:

13.12.2005 09:23:40 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-10.1.150.21: [10.1.150.21: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
13.12.2005 09:23:41 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(2)-10.1.150.21: [10.1.150.21: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
13.12.2005 09:23:41 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(3)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]

10.1.150.21 bin ich selber, Firewall ist nur die von WindowsXP oben, aber Java ist "freigeschaltet".
Langsam ist es nur, wenn der Server auf 127.0.0.1 erzeugt wird. Wird kein Server verwendet oder ist der Server auf einem anderen Rechner im Netz, dann gehts ohne Probleme...(ach ja. Mit langsam ist hier sehr viel langsamer gemeint)


----------



## Murray (13. Dez 2005)

Wenn es an der Namensauflösung liegt, müsste ping 127.0.0.1 auch entsprechend langsam sein. Hast Du das mal probiert?


----------



## K-Man (13. Dez 2005)

Ping ist normal. Bin dem Problem aber etwas näher gekommen. Es liegt wohl am SecurityManager. Sobald ich den ausschalte, dann gehts auf einmal wieder. Mit SecurityManager gehts zwar ohne Probleme, aber nicht, wenn der Server local ist. Schalte ich den aus, dann gehts auch mit lokalen Server schneller. Permission wurden zum Testen auf AllPermission gesetzt. Aber warum bremst der SecurityManager einen lokalen Server aus?


----------

