2014-11-26 22 views
7

Während des Lebenszyklus einer Java HashMap gibt es eine Möglichkeit festzustellen, wie viele Kollisionen/Verkettungen aufgetreten sind. Wie oft wurde die Größe der HashMap geändert und wie lange dauerte jedes Resize Event?Statistiken für Java HashMap

Ich habe Quellcode für HashMap (1.6), und es sieht aus wie es erweitert werden kann, um die oben genannten Funktionen hinzuzufügen.

Ein wenig Hintergrund, ich habe einige Legacy-Anwendung geerbt, und da wir CMS-GC verwenden, die nicht-Kompaktierung sein geschieht. Diese Hashtabellen können mehr als eine Million Einträge enthalten. Wir stehen vor einigen Performance-Problemen in der Produktion, die nur während Aktivitätsspitzen auftreten. Und wir konnten sie in unserem Produktionsreplikat nicht reproduzieren.

In meinem vorherigen Projekt haben wir die unsere Cache-Nutzungsstatistiken regelmäßig ihre Wirksamkeit bestimmen drucken.

würde schätzen auch Ihre Meinung/Kritik dazu, ob eine richtige Linie des Denkens?

+3

'Ich habe den Quellcode für HashMap (1.6) überprüft, und es sieht so aus, als ob er erweitert werden könnte, um die obige Funktionalität hinzuzufügen.Was hast du gesehen, was dich dazu gebracht hat zu denken, und welchen Ansatz hast du vor? Außerdem - warum vermuten Sie jetzt, dass dieser Ansatz * nicht funktioniert, so dass Sie hier fragen? –

+0

Ich suchte entweder Kritik (schlechte Idee) oder Meinung (bitte sehen Sie diese Open-Source-Bibliothek). Die Google-Suche brachte keine Ergebnisse, also war ich überrascht. In der Regel werden die meisten Fragen von Google Ergebnissen beantwortet. Hier ist eine interessante [link] (http://www.javamex.com/tutorials/collections/hash_codes_advanced_statistics.shtml) Ich fand, nicht sicher über die Mathematik dahinter. Ich werde eine Folge dieser Übung veröffentlichen. – yichuan

+0

Java 8 enthält einige nützliche Aktualisierungen für die Leistung von HashMap. Wenn Sie Glück haben, Java 8 verwenden zu können, sollten Sie es versuchen –

Antwort

1

Sie sind auf dem richtigen Weg. Sie können Hashmap erweitern und die Methoden mithilfe von counts überschreiben. Basierend auf den Bedingungen können Sie die Anzahl erhöhen.

Update: Sie können versuchen, die ManagementFactory-APIs von Java zu verwenden, die Ihnen mehr Einblicke in hashmap geben.

+0

Danke Abhijeet! – yichuan

0

Wenn ich Sie wäre würde ich ein Profiling-Tool wie Dynatrace verwenden, um zur Laufzeit direkt auf Ihrer Produktionsumgebung zu verstehen, was vor sich geht. Das verwenden wir in meiner Firma.

Als Alternative, wenn Sie nicht über eine Lizenz Dynatrace (noch wollen eine POC zu tun, es zu versuchen) Ich würde versuchen, Java Instrumentation API oder Aspekte zu verwenden (mit aspectj) einer Profilierung zu tun. Das ist eine bessere Lösung als das Erweitern von HashMap, da Sie die realen Klassen verwenden, die Ihre aktuelle Anwendung verwendet, und daher keine Nebenwirkungen haben.

Eine weitere OTS Option ist es, ein Werkzeug zu benutzen, wie Collection Spy (aber um ehrlich zu sein, habe ich es nie).

Ich fand auch diesen interessanten Artikel über profiling java applications with opensource tools.

+0

Java Instrumentation API sieht interessant aus, wir werden das sicherlich in der nächsten Version versuchen. Wird Collection Spy auch in Nicht-Pro-Umgebungen eine Drehung versetzen - es hat eine zweiwöchige Probezeit. – yichuan