Ich entwickle ein Spiel in Java, die im Grunde jede 1/60 Sekunde aktualisiert wird. Während eines solchen Updates werden viele Daten erzeugt, herumgereicht und dann nicht referenziert, nennen wir diese Daten-DTOs. Nach meinem Verständnis speichern die JVM und das Betriebssystem diese Daten auf dem Heap des Programms. Der Heap wird so aufgebaut, bis der JAVA GC ausgeführt wird, wodurch alle nicht referenzierten Daten als frei markiert und wiederverwendet werden können.erstellen und verwenden Sie einen temporären Heap
Jetzt, wie ich es sehe, ist dies unnötig und anfällig für gelegentliche Verzögerungen. Die Art und Weise, wie ich das Problem lösen möchte, besteht darin, einen zugewiesenen Teil des Speichers als temporären Heap zu verwenden. Dieser Heap wird verwendet, um alle temporären Daten zu speichern, die ich während des Aktualisierungsintervalls erstellt und weitergegeben habe. Und sobald ich das Ende meines Updates erreicht habe, ist keine Analyse mehr erforderlich, aber ich kann einfach sagen, dass der gesamte Chunk frei ist und auf diese Weise das gleiche Heap-Space-Update nach dem Update wieder verwendet. Ein bisschen wie tail-rekursive Stack-Frames. Eine andere Lösung wäre, nur änderbare DTO-Objekte zu verwenden und eine Menge davon zuzuordnen und sie einfach wiederzuverwenden, aber ich nutze den Vorteil, Dinge so unveränderbar wie möglich zu machen.
Dies ist ein Versuch, zu zeigen, was ich mit dem Code bedeuten:
void start(){
Data data = System.allocateDatainMb(500); //allocate 500Mb of virtual memory
MagicHeap() mh = System.createAMagicHeap(data); //make a heap of it
mh.use(); //set all constructors to allocate on this heap
while(true){
update();
mh.clear();
}
}
void update(){
TmpData dto = Gamesystem.createALargePieceOfTemporaryData();
someClass.doUpdateStuff(dto);
}
ich mit nicht allzu vertraut bin, wie Java verwaltet Speicher, aber ich hoffe, dass Sie meine Bedeutung bekommen.
Ist es in gewissem Maße möglich?
Nein. Java ist nicht die geeignete Sprache für diese Tricks. Wechseln Sie zu C++, oder verwenden Sie Ihre Objekte erneut. – RealSkeptic
Ich frage mich, warum Sie das für ein Problem halten? Ist Ihnen tatsächlich aufgefallen, dass GC Ihr Programm verlangsamt? Wenn nicht, sind Sie möglicherweise ohne Grund besorgt. – puhlen
Ich bin nicht besonders besorgt, noch habe ich ein echtes Problem. Der GC ist jedoch bemerkenswert, aber ich habe hauptsächlich aus Neugier gefragt. – Jake