Java Speicherauslastung verringern
Fand ich heraus, dass wenn meine Bewerbung hat viel freien Speicherplatz es verbraucht mehr Speicher, als es braucht. Ich habe gehört, dass dieses Verhalten üblich ist für alle Java-Anwendungen, aber es ist für mich nicht akzeptabel.
Also die Frage ist, wie kann ich erzwingen, Java zu verwenden, die weniger Speicher?
Ich weiß, dass ich anrufen kann System.gc()
manuell alle paar Sekunden, aber ist es okay, so zu tun und gibt es noch andere Methoden?
P. S. meine Anwendung wird regelmäßig aktualisiert auf Produktions-server und ich brauche, um Speichernutzung zu überwachen, die für einige Lecks und so weiter (in der Regel gibt es keine Lecks, aber wenn einer erscheint, ich sollte sehen, so schnell wie möglich), und auch ich brauche, um die Uhrzeit Vorhersagen, Wann sollte ich ein upgrade meiner hardware. All diese Dinge sind sehr schwer zu tun, wenn die jvm unvorhersehbar ändert seinen Speicher hunger. Also das einzige was ich will, ist eine Kraft, die jvm zu sein, berechenbar memory-Nutzung (wenn die Zahl der Nutzer verdoppelt Speicher sollte verdoppelt auch)
- Kann es Zeit, neu zu denken, warum es nicht akzeptabel ist. Können Sie geben einen technischen Grund, oder ist es etwas, das macht Sie unbequem?
- Vielleicht sollten Sie nicht tun, Ihre Prüfung auf einem Produktions-server? Und nur bereitstellen, wenn Sie wissen, gibt es keine Lecks?
- dies ist nicht ein Test, natürlich habe ich Test-server zu, aber es läuft mit unterschiedlicher Last
- Es klingt wie Sie brauchen, um Speicher-Profil der Anwendung, so dass Sie verstehen, wie Speicher verwendet wird. Blick auf den maximalen Speicher, den Sie geben, die Anwendung ist nicht sehr nützlich. Eine bessere Zahl zu betrachten ist, wie viel Speicher verwendet wird, nachdem eine GC. Angesichts der Kosten von Speicher ist ziemlich gering ich vorschlagen, immer mehr Speicher, als Sie wahrscheinlich brauchen, und Sie nicht haben, um es überwachen oder aktualisieren Sie den server später (spart Geld, rundum)
- 32 GB : 8 x 4 GB Speicher 1600 kostet rund 160 Dollar. Wenn Sie beginnen, mit so viel Speicher, die Sie vielleicht nicht brauchen, um zu überwachen, was könnte leicht sparen Sie so viel Speicher über die Lebensdauer des Systems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, was du meinst "mehr Speicher, als es muss". Wenn du meinst, mehr als die minimale Speicher darstellen, Ihre Anwendung Objekte, dann sind Sie richtig.
Es ist standard-Verhalten, dass Java verwendet mehr Speicher als das absolute minimum, es könnte theoretisch sofort mit. "Schlimmer noch", die meisten JVMs nicht geben, die Speicher wieder auf die OS ... auch wenn dass der Speicher freigegeben wurde, von der GC. Diese beiden Eigenschaften sind notwendig für den effizienten Betrieb einer general purpose garbage collector.
Wenn das für Sie inakzeptabel ist, sollten Sie nicht verwenden einer garbage Collection Sprache. In C oder C++. (Aber auch bewusst sein, dass es ungewöhnlich ist für C /C++ memory allocators in der Lage sein zu geben, den Speicher wieder an das Betriebssystem entweder ..., auch wenn die Implementierung erlaubt es.)
Die positive Seite dieser ist, dass Java (und in der Tat alle GC ' ed Sprache) wird tatsächlich besser laufen, wenn Sie viel Speicher. Moderne GC-effizienter arbeiten als das Verhältnis der Müll nicht Müll erhöht, und einen größeren Haufen macht, dass passieren. (Natürlich können Sie zu weit gehen, vor allem, wenn die Anwendung konkurriert mit anderen Dingen, die für den realen Speicher.)
Anderen Antworten gesagt, ruft
System.gc()
nicht helfen. Es ist unwahrscheinlich, dass das Ergebnis in jedem Speicher wird zurück gegeben. Schlimmer noch, Sie werden wahrscheinlich führen die GC, wenn der garbage-Niveau ist zu niedrig für einen effizienten Betrieb, so dass Sie die Erhöhung der CPU-Zeit, die für Sie keinen nutzen.Über Ihre "PS":
Ich glaube nicht, dass es eine Möglichkeit gibt (zuverlässig) erkennen, die Existenz von ein Speicher-Leck ... abgesehen von der überwachung der Speichernutzung trends.
Ich glaube nicht, dass es eine Möglichkeit gibt (zuverlässig) Vorhersagen, Wann Sie neue hardware ... abgesehen von mahnenden memory-Nutzung (und andere) trends.
Ich glaube nicht, dass es einen Weg gibt, Euch zu zwingen, Anwendung Speichernutzung proportional zu der Anzahl der Benutzer ... abgesehen von der Gestaltung /Programmierung Ihrer Anwendung, so dass es Skalen in der Weise, die Sie wollen.
Auf der anderen Seite, man könnte sagen, die gleiche Sache über eine C /C++ - Anwendung.
Können Sie sagen, es zu verwenden weniger Speicher durch Aufruf von java mit den
-Xmx
parameter ie:läuft mit max 128Mb (standardmäßig in Java 6 ist "Kleiner 1/4. der physikalische Speicher oder 1GB")
Nicht nennen
System.gc()
die ganze Zeit...es ist Ihre Zeit, Sie werden verschwenden 😉Auch, warum sind Sie sich Gedanken über das? Bei java bekommt in der Nähe der maximalen Speicher-es ist erlaubt, es wird ein sweep-GC sowieso
System.gc()
wird, um das zu beheben...Zuerst, wie ist Ihre GRATIS-Speicher zu helfen, wenn Sie call-System.gc()? Und aufrufenden System.gc() ist nicht einmal eine gute option. Wenn Sie möchten, eine mehr aggressive garbage collector gibt es Richtlinien für, die.
Was man stattdessen tun sollte, ist starten Sie es mit weniger Speicher mit dem -Xmx
Nein, das ist nicht in Ordnung. System.gc() nicht garantieren, ob/Wann der garbage collector zu starten. Mehr "System".gc() nennen könnte, dass der garbage collector was oft mehr Zeit verbracht, Müll sammeln als die Anwendung ausgeführt wird.
Die Lösung ist, um zu bestimmen, die maximale Menge an Speicher, die von Ihrer Anwendung benötigt(footprint) und starten Sie die virtuelle Maschine mit etwas mehr Speicher als die Stellfläche. Ich nehme an hier, dass Ihre Anwendung hat keine Speicherverluste.