2013-07-03 6 views
5

Ich habe dieses Basisprogramm, das nichts tut, aber es für die Eingabe wartet sitzen:Warum wächst die Cache-Größe für Java-Code?

import java.io.*; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Basic { 
    public static void main(String[] args) throws Exception{ 
     try{ 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      String input; 
      input=br.readLine(); 
     }catch(IOException io){ 
      io.printStackTrace(); 
     } 
    } 
} 

Und wenn ich dies auszuführen:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15001 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Basic 

ich über JConsole verbinden, das sehen:

codecache increasing

Ist das einfach, weil core java bytcode zuerst kompiliert wird? Wie kann der Codecache zunehmen, wenn der Prozess nichts tut?

Und wenn ich diese Version haben (die Thread.sleep verwendet):

codecache increasing

So ... warum ist das passiert:

public class Basic { 
    public static void main(String[] args) throws Exception{ 
     while(true) { 
      Thread.sleep(5000); 
     } 
    } 
} 

ich diese bekommen?

P.S. dies ist die Ausgabe von java -version:

java version "1.6.0_37" 
Java(TM) SE Runtime Environment (build 1.6.0_37-b06) 
Java HotSpot(TM) Client VM (build 20.12-b01, mixed mode, sharing) 
+0

Nur weil der 'main' Thread nichts macht, bedeutet das nicht, dass die JVM nichts tut. GC überprüft wahrscheinlich, ob es ausgeführt werden muss und Überwachungsthreads ausgeführt werden, damit JConsole funktionieren kann. – Jeffrey

Antwort

1

Ich vermute, dass es jconsole selbst, die das Problem verursacht. Genauer gesagt, das jmxremote Zeug, das jconsole ermöglicht zu sehen, was in Ihrer JVM vor sich geht.

Mein Rat:

  • Mach dir keine Sorgen. Es sieht so aus, als ob es fast einen stabilen Zustand erreicht hat.

  • Wenn das nicht gut genug ist, lassen Sie jconsole für eine sehr lange Zeit laufen und beobachten Sie, ob das Wachstum der Speicherauslastung vollständig stoppt.

  • Wenn das nicht gut genug ist, dann könnten Sie versuchen, es zu profilieren ... obwohl das Aufspüren kleiner Speicherlecks im jmxremote-Code (mit oder ohne Quellcode) eine Herausforderung darstellen könnte.

Verwandte Themen