Ihr Kollege hat keine Ahnung, wovon er spricht.
Ihre teuerste Operation wäre es, ihnen zuzuhören . Sie haben Ihre Zeit damit verschwendet, Sie zu Informationen zu verleiten, die mehr als ein Jahrzehnt veraltet sind (ab dem ursprünglichen Datum, an dem diese Antwort veröffentlicht wurde), und Sie mussten Zeit damit verbringen, hier zu posten und im Internet nach der Wahrheit zu suchen.
Hoffentlich erbrechen sie etwas, das sie vor mehr als einem Jahrzehnt gehört oder gelesen haben, nur unwissentlich und wissen es nicht besser. Ich würde alles andere, was sie sagen, auch als verdächtig ansehen. Dies sollte ein bekannter Irrtum von jedem sein, der so oder so auf dem Laufenden bleibt.
Alles ist ein Objekt (außer primitives
)
Alles andere als Grundelemente ( int, long, double
usw.) sind Objekte in Java. Es gibt keine Möglichkeit, die Objekterstellung in Java zu umgehen.
Die Objekterstellung in Java ist aufgrund seiner Speicherzuweisungsstrategien in den meisten Fällen schneller als in C ++ und kann für alle praktischen Zwecke im Vergleich zu allem anderen in der JVM als "frei" betrachtet werden .
Bereits in den frühen 2000er-Jahren der späten 1990er-Jahre hatten JVM-Implementierungen einen gewissen Performance-Overhead bei der tatsächlichen Zuweisung von Objekten. Dies ist seit mindestens 2005 nicht mehr der Fall.
Wenn Sie so einstellen -Xms
, dass der gesamte für die ordnungsgemäße Ausführung Ihrer Anwendung erforderliche Arbeitsspeicher unterstützt wird, muss der GC in den modernen GC-Implementierungen möglicherweise nie ausgeführt und den größten Teil des Mülls beseitigt werden.
Es wird nicht versucht, den freien Speicherplatz zu maximieren, was ohnehin ein roter Hering ist, sondern es wird die Leistung der Laufzeit maximiert. Wenn dies bedeutet, dass der JVM-Heap fast immer zu 100% zugeordnet ist, ist dies auch der Fall. Freier JVM-Heapspeicher gibt Ihnen sowieso nichts, was Sie nur dort sitzen.
Es besteht ein Missverständnis, dass der GC auf nützliche Weise Speicher für den Rest des Systems freigibt. Dies ist völlig falsch!
Der JVM-Heap wächst und schrumpft nicht, sodass der Rest des Systems durch den freien Speicher im JVM-Heap positiv beeinflusst wird . -Xms
Weist ALLES zu, was beim Start angegeben wird, und seine Heuristik besteht darin, nie wirklich etwas von diesem Speicher für das Betriebssystem freizugeben, um es mit anderen Betriebssystemprozessen zu teilen, bis diese Instanz der JVM vollständig beendet wird. -Xms=1GB -Xmx=1GB
Weist 1 GB RAM zu, unabhängig davon, wie viele Objekte tatsächlich zu einem bestimmten Zeitpunkt erstellt wurden. Es gibt einige Einstellungen, mit denen Prozentsätze des Heapspeichers freigegeben werden können. In der Praxis kann die JVM jedoch nie genug Speicher freigeben, damit dies jemals passieren kannDaher kann kein anderer Prozess diesen Speicher zurückfordern, sodass auch der Rest des Systems nicht davon profitiert, dass der JVM-Heap-Speicher frei ist. Eine RFE dafür wurde am 29. November 2006 "akzeptiert" , aber es wurde noch nie etwas dagegen unternommen. Dieses Verhalten wird von niemandem mit Autorität als bedenklich angesehen.
Es gibt ein Missverständnis, dass das Erstellen vieler kleiner, kurzlebiger Objekte dazu führt, dass die JVM für längere Zeit pausiert. Dies ist nun ebenfalls falsch
Derzeitige GC-Algorithmen sind für die Erstellung vieler kleiner Objekte mit kurzer Lebensdauer optimiert. Dies ist im Grunde die 99% -ige Heuristik für Java-Objekte in jedem Programm. Versuche, Objekte zusammenzufassen , führen in den meisten Fällen zu einer Verschlechterung der Leistung der JVM.
Die einzigen Objekte, die heute gepoolt werden müssen, sind Objekte, die sich auf endliche Ressourcen außerhalb der JVM beziehen . Sockets, Dateien, Datenbankverbindungen usw. können wiederverwendet werden. Regelmäßige Objekte können nicht werden gepoolt im gleichen Sinne wie in Sprachen , die Sie direkten Zugriff auf Speicherplätze ermöglichen. Objekt- Caching ist ein anderes Konzept und kann oder kann nicht das sein, was manche Leute naiv als Pooling bezeichnen . Die beiden Konzepte sind nicht dasselbe und sollten nicht miteinander verschmolzen werden.
Die modernen GC-Algorithmen haben dieses Problem nicht, da sie nicht nach einem Zeitplan freigegeben werden, sondern freigegeben werden, wenn in einer bestimmten Generation freier Speicher benötigt wird. Wenn der Heap groß genug ist, werden die Zuordnungen nicht lange genug aufgehoben, um Pausen zu verursachen.
Objektorientiert Dynamische Sprachen schlagen C auch heute noch bei rechenempfindlichen Tests.