Java-Speicherbereinigung, klassenbasiertes Tenuring

9

Ich habe mit den Parametern des Java-Garbage-Collectors gespielt, und ich sehe teure und häufige kleinere Garbage-Collections, wenn der eden / survivor-Space voll ist. Dies liegt daran, dass ich einen Pool sehr großer Objekte zugewiesen habe. Diese Objekte, die ich kenne, sind "permament", insofern sie wiederverwendet werden, aber niemals gewertet werden. Ich versuche daher, einen Weg zu finden, Objekte dieser Art in der alten statt in der neuen Generation "automatisch" zu platzieren.

Ich bin gerade dabei, dieses Problem durch die Zuteilung einer sehr großen neuen Generation zu umgehen (um die sehr häufigen kleinen GCs zu vermeiden), das bedeutet leider, dass jede einzelne Sammlung teurer ist.

Ich würde gerne in der Lage sein, für jede Klasse eine Nutzungsdauer anzugeben und sie auf sehr niedrig für die spezifischen Objektklassen zu setzen, von denen ich weiß, dass sie niemals GED erhalten (und die sehr sehr groß sind). (In seinem Fall geht es um

Meine Anwendung ist sehr latenzempfindlich.

Meine aktuelle Konfiguration verwendet CMS mit einer Min / Max-Heap-Größe von 48.

Ist das möglich? Ich habe alle möglichen JVM-Flags durchsucht und kann nichts finden, was zu diesem Ergebnis führt, und sehe keinen Weg, dies mit einem benutzerdefinierten Klassenlader zu tun.

    
user1018513 02.04.2014, 15:06
quelle

1 Antwort

2

Unter Berücksichtigung von Hotspot gibt es kein solches Flag, mit dem Sie bestimmte Klasseninstanzen direkt in OldGen zuweisen können.

Wenn der Pool wirklich wiederverwendet wird und "permanent" ist, sollten Sie nur während der Poolzuweisung häufige kleinere gcs erhalten. Sie müssen Ihre Anwendung für einen längeren Zeitraum ausführen und sehen, ob der Pool tatsächlich feststand. Danach sollten Sie keine geringfügige GC aufgrund der Poolnutzung sehen.

    
Ales 03.04.2014, 23:43
quelle