Jblew.pl - Notatnik młodego programisty. Elektronika, webmastering, programowanie.

Jak zwiększyć zużycie ramu w Javie

We wszystkich podręcznikach o programowaniu przytacza się zasadę, że kodu nie wolno optymalizować. I nawet nie próbuj programisto, bo popsujesz! Nie jestem zwolennikiem takiego myślenia, bowiem czasem zdarza się, że napiszemy bardzo nieoptymalny kod i warto go zoptymalizować (oczywiście, cudzego kodu optymalizować nie wypada ;P).

Dlaczego to piszę? Jak we wszystkich poprzednich postach, znowu muszę wspomnieć o mudzie… Podczas pisania zauważyłem, że gdy użytkownik wyda jakąkolwiek komendę, zużycie ramu zwiększa się nawet o 50kb! Na szczęście szybko znalazłem przyczynę. Okazało się, że, jak zwykle winny jest programista, a nie kto inny. Otóż gdy użytkownik wpisywał komendę tworzona była nowa klasa Command, która tą komendę przetwarzała. I tu był błąd! Przy każdym tworzeniu tej klasy kompilator musiał zarezerwować pamięć. Szybko zorientowałem się, o co chodzi i poprawiłem kod tak, że klasa Command jest tworzona, gdy użytkownik wejdzie do gry, a potem jest wywoływana tylko jej metoda. Wspaniały profiler netbeansa pokazał wyraźnie różnicę w zużyciu pamięci.










Skrypty w javie…

Jak już wcześniej pisałem już od pewnego czasu piszemy muda w czystej javie. Mamy już sporo funkcji i obsługę wieli mudowych problemów, w związku z czym nadszedł czas na rozpoczęcie tworzenia obsługi MOB-ów, czyli postaci sterowanych przez komputer. Każdy mob ma swój program, nazywany mobprogiem. Cały problem polega na tym, żeby móc edytować program moba bez ponownej kompilacji całego programu. Dość długo szukałem optymalnego rozwiązania. Zastanawiałem się m.in. nad dynamicznym kompilowaniem kodu, nad językiem lua…

Ale najlepsze okazało się dedykowane API dla skryptów – javax.script.

Jest bardzo proste w obsłudze. Poniżej przedstawiamprzykład i opis:


package scriptingtest;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");

Proba p = new Proba(); //zawiera tylko pole int i

engine.put("p", p);
p.i = 7;
System.out.println(p.i);

engine.eval(""
+ "importPackage(java.lang);"
+ "importClass(Packages.scriptingtest.Proba);"
+ ""
+ "p.i = 2;");

System.out.println(p.i);
}
}

Klasa Próba zawiera tylko pole public int i = 0; . Uruchamiając program zobaczymy, że skrypt zmieni wartość i z 7 na 2. To wszystko. Jak widać jest to bardzo proste i może być przydatne w dużych aplikacjach, szczególnie w grach.

Należy tylko pamiętać, że jeśli chcemy zaimportować jakąś klasę z wewnątrz jara, w którym uruchamiamy program, muśimy dodać na początku Packages.nazwapakietu.




Tagi

Bannery

Create your own banner at mybannermaker.com!