2012-11-08 22 views
6

bekommen diese seltsamen Fehler:Analysieren von Heap dum, Map # size() ist keine Funktion?

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: size is not a function, it is null. (#1)

Während ein Heapdump Analyse und Ausführen diese OQL-Abfrage auf VisualVM:

select { map: x } 
from java.util.concurrent.ConcurrentHashMap x 
where x.size() < 10 

Das Problem liegt auf der where Klausel, irgendwie ist es nicht, obwohl Map Arbeits hat offensichtlich eine Größenmethode.

Antwort

2

Wenn ich durch schaue, habe ich nicht den Eindruck, dass es Java-Methodenaufrufe unterstützt, nur Java-Felder. (Einige ihrer Beispiele enthalten .toString(), aber das ist eindeutig das JavaScript .toString() und nicht das Java, da sie es verwenden, um ein Java String-Objekt in eine JavaScript-Zeichenfolge zu konvertieren.) So zum Beispiel ihre Länge einer Zeichenfolge Beispiele alle verwenden das private Feld count anstelle der öffentlichen Methode length(), und ihr Vektorlängenbeispiel verwendet das private Feld elementCount anstelle der öffentlichen Methode size().

Der Fehler, den Sie bekommen, ist, weil ConcurrentHashMap kein Feld mit dem Namen size hat.

Leider für Ihre Anfrage, ConcurrentHashMap speichert nicht seine Größe in einem Feld —, dass seine Fähigkeit, — so denken zu vermeiden, gefährden würde blockiert ich Sie, so etwas zu schreiben haben:

select { map: x } 
from java.util.concurrent.ConcurrentHashMap x 
where sum(x.segments, 'it.count') < 10 

zu summiere alle Segmentgrößen selbst. (Haftungsausschluss: 100% vollständig ungetestet.)

+0

oops - meine vorherigen URLs wurden irgendwie irgendwie verstümmelt: ich meinte http://eclipse.org/forums/index.php/m/564977/ und http://www.eclipse.org/forums/index.php/m/3655/(die Endstriche machen den Unterschied.) –

+0

@BrianHenry: Ah, OK; diese Seiten sind unendlich relevant - äh, danke. (Warum macht ein Schrägstrich so einen Unterschied? Wer schreibt Web-Software auf diese Weise ?!) – ruakh

+0

Ich habe noch nie etwas ähnliches gesehen. aber warum es so geschrieben ist, ist vielleicht eine Frage für einen anderen Stackoverflow-Post ... –

3

@ ruakhs Antwort ist sehr gut, bis auf eine kleine Sache. Ein Segment könnte manchmal null sein, was sum(x.segments, 'it.count') vermasselt. Ersetzen Sie es durch

sum(x.segments, 'it != null ? it.count : 0') 

und es wird gut funktionieren. Getestet auf mein Wort.