Ich habe ein kleines Spiel, das ein Freund und ich in Java schreiben. Es ist schlecht codiert und wir arbeiten daran, es zu refactoring, aber das ist jetzt nicht wirklich das Problem. Wir beide haben 64-Bit-Maschinen und ich denke, bevor wir beide 32-Bit-JDKs verwendet haben, aber kürzlich hatte ich einige Probleme und so entfernte ich alle JDKs und installierte die neueste 64-Bit-JDK, und ich bin mir nicht sicher, wann aber mein Freund auch ist Jetzt läuft ein 64-Bit-JDK. Unser Spiel lief im 32-Bit-JDK gut, aber mit der 64-Bit-Version wird das Spiel nicht starten. Ich habe versucht, es mit Eclipse zu debuggen, aber es war ein bisschen Schmerz.Alle Fehler oder Inkompatibilitäten in 64-Bit-JVM?
Unser Spiel ist vernetzt und Multithread, und ich denke, wir haben einige Probleme mit, wie wir die Dinge synchronisiert haben (Ich habe die ganze Idee der Synchronisation nicht verstanden, als ich es vorher schrieb). Wir hatten unsere run() Methoden synchronisiert, was keinen Effekt hat, aber trotz der Dummheiten großer Teile unseres Codes läuft das Zeug immer noch auf einer 32 Bit JVM (Windows und Linux).
Das Spiel startet, wenn eine Person ein Spiel hostet, und dann können andere beitreten, bis der Host das Spiel beginnt. Es sendet dann eine Aufforderung an alle Spieler und fragt, ob sie anfangen wollen, und wenn alle Ja sagen, beginnt das Spiel. Was auf der 64-Bit-JVM passiert, ist, dass es die Nachricht sendet, aber es scheint, dass die Antwort verloren geht oder etwas, oder der Server zählt nicht korrekt, dass jeder OK hat, weil das Spiel nicht startet. Tatsächlich erhält der Host ein paar weitere Nachrichten, die der/die andere (n) Spieler nicht bekommt und sich beim Starten des Spiels etwas weiter bewegt, aber der Server scheint irgendwo stecken zu bleiben.
Irgendwelche Ideen, was könnte das Problem sein? Unser Code ist auf github, wenn jemand einen Blick darauf werfen möchte. Ich wäre sehr glücklich, wenn Sie das täten, aber ich erwarte nicht, dass jemand unseren hässlichen Code durchwühlt. Vielen Dank!
Übrigens laufen wir beide auf 64-Bit Windows Vista und JDK 1.6 u12 und u14, aber wir betreiben auch Linux, obwohl ich es noch nicht auf einer 64-Bit Linux JVM testen konnte. Oh, mehr Details darüber, warum ich ziemlich sicher bin, ist es eine 64-Bit-JVM isssue:
So arbeiteten wir auf diese im Grunde im Herbst Semester, und hörten auf für eine Weile daran zu arbeiten. Nach 6 Monaten nehmen wir es wieder auf, taumeln bei unserem schrecklichen Code und versuchen es zu säubern. Dann erkennen wir, dass keiner von uns es richtig ausführen kann. Ich versuche, eine Revision zu finden, die funktioniert, aber ich komme zur letzten Überarbeitung, bevor wir diesen Sommer angefangen haben, daran zu arbeiten, und es funktioniert immer noch nicht. Ich habe dann sogar einige Binärdateien (.jars) überprüft, die ich zuvor kompiliert hatte, und selbst die früheste Version, die ich habe, funktioniert nicht auf der 64-Bit-JVM. Ich habe dann eine 32-Bit-Linux-VM mit der Sun JDK1.6-JVM eingecheckt, und es hat gut funktioniert. Daher bin ich mir ziemlich sicher, dass es ein 64-Bit-Problem ist, da zuvor die gleichen Binärdateien einwandfrei funktionierten.
Ich habe auch bemerkt, dass Vista aus irgendeinem Grund IPv6-Adressen zu meinen Sockets zugewiesen, wenn Sie eine Verbindung zu einem Server auf meinem eigenen Rechner (0: 0: 0: 0: 0 statt 127.0.0.1) aber Ich habe alles repariert, was IPv4-spezifisch war, und es funktioniert immer noch nicht.
Ich habe gerade ein anderes Problem auf meinem Github-Repository erstellt, was eine ganze andere Geschichte von Weh ist, so dass ich meinen neuesten Build auf einer anderen Maschine nicht gerade testen kann. Aber der letzte Build vor dem Refactoring funktioniert gut auf einer 32-Bit-JVM mit einem Dual-Core, so dass es nicht wie eine Race-Condition aussieht.
Oh, eine andere Sache, genau dasselbe Problem läuft unter OpenJDK 6 64 Bit unter Linux. Ich schätze, es ist eine Race Condition, die die 64-Bit-Version irgendwie hervorbringt.
Warum glauben Sie, dass Sie die 64-Bit-JVM überhaupt verwenden müssen? Der einzige Vorteil, der mir bekannt ist, ist eine größere zulässige Heap-Größe, und das ist nur relevant für große Eisen-Server. – skaffman
Kein Grund, ich habe es gerade zufällig installiert. Der Hauptpunkt ist, dass ich wissen möchte, ob die Probleme, die ich habe, wegen der 64-Bit-JVM oder eines zugrunde liegenden Problems in meinem eigenen Code sind. Ich lehne mich jetzt dem letzteren zu. – Ibrahim