2013-11-28 8 views
7

Angenommen, ich habe etwas asm.js Code, wahrscheinlich von emscripten erstellt. Angenommen, es hat eine ziemlich große, dem Heap zugeordnete Struktur, die von einer asm.js-Funktion als Zeiger zurückgegeben wird, der von einer JavaScript-Bibliothek aufgegriffen wird, um sie in ein nettes JavaScript-Objekt einzubetten. Gut so weit.Finalizer für JavaScript-Objekte

Aber was passiert, wenn das Objekt den Rahmen sprengt und Müll gesammelt wird. Im Moment hat der asm.js-Code keine Möglichkeit, davon zu wissen, so dass der Speicher der Struktur zugewiesen bleibt, was zu einem Speicherleck führt.

Gibt es eine Möglichkeit, ein JavaScript-Objekt aus JavaScript in einen Finalizer einzufügen?

Eine solche Finalizerthread verwendet werden, um den Speicher in asm.js freizugeben, so dass die Speicherverlust zu vermeiden. Bis jetzt konnte ich keinen dokumentierten, also tragbaren Weg finden, um dies zu erreichen, aber vielleicht habe ich an den falschen Stellen gesucht.

+0

Ich denke, Sie sollten asm.js nicht mit JavaScript mischen. –

+0

mögliches Duplikat von [Wann sind JavaScript-Objekte zerstört?] (Http://stackoverflow.com/questions/10112670/when-are-javascript-objects-destroyed) – user

+0

@ user3075942: Nicht wirklich: Diese Frage betrifft die * wann * während mir die Zeit egal ist, solange ich von der Veranstaltung benachrichtigt werde. Java hat Garbage Collection und Finalizer, und ich hoffte auf etwas ähnliches in javaScript. – MvG

Antwort

3

Die einfache Antwort ist, dass es keine Unterstützung dafür gibt.

Da asm.js-Code seinen eigenen Speicher verwalten muss, muss alles, was mit auf der asm-Seite gespeicherten Objekten interagiert, den von asm verwendeten Speichermanager und nicht den vom Browser verwendeten Speichermanager berücksichtigen. Das Beste, was Sie tun können, ist, explizit eine Methode für jedes Objekt aufzurufen, das auf internen Asm-Speicher verweist, wenn Sie einen Verweis darauf erstellen oder löschen.