2010-03-23 15 views
11

Wirtualna maszyna Java obsługuje kilka strategii usuwania śmieci.Jak mogę sprawdzić, który javascript używa java

Ten article wyjaśnia je.

Teraz zastanawiam się który (wybierane automatycznie) strategia moja aplikacja używa, czy jest jakiś sposób, aby umożliwić JVM (wersja 1.6) wydrukować tę informację?

Edytuj: JVM wykrywa, czy jest w trybie klienta lub serwera. Tak naprawdę pytanie brzmi: jak mogę zobaczyć, które zostało wykryte?

+2

nocie, że artykuł opowiada o ** jedno konkretne wdrożenie ** (konkretnie HotSpot JVM od Słońca JRE). –

+0

Tak, masz rację. – Thirler

+0

Należy pamiętać, że niekoniecznie korzystasz z jednej GC. Zwykle masz różne strategie dla różnych obszarów. Jeśli korzystasz z CMS, domyślnie używam "nowego równoległego" dla młodego obszaru. – Fredrik

Odpowiedz

13

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html która ma zastosowanie dla J2SE 6, a także stwierdza, że ​​domyślny jest równoległa Collector.

Przetestowaliśmy to raz na JVM 1.5 ustawiając tylko

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

a wyjście pokazał

 
41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs] 
41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs] 

gdzie stoi PS dla Parallel zmiatania

0

Co z informacjami dostarczonymi przez -verbose: gc i -XX: + Opcje wiersza poleceń PrintGCDetails? Czy to nie pomocne?

[Edit: Oczywiście nie]

+0

To nie drukuje, który śmieciarz jest używany. – Thirler

4

Jak Joachim już wskazałem, artykuł, do którego się odnosisz, opisuje strategie VM oferowane przez VM firmy Sun. Sama specyfikacja VM nie wymaga określonych algorytmów GC, a zatem nie ma sensu posiadanie np. wyliczone wartości dla tych w API.

Można jednak uzyskać pewne infos z interfejsu API zarządzania:

List<GarbageCollectorMXBean> beans = 
    ManagementFactory.getGarbageCollectorMXBeans(); 

iteracja tych ziaren, można uzyskać nazwę GC (choć tylko jako ciąg) i nazwy pul pamięci, które są zarządzane przez różne GC.

7

Umieścić to w JAVA_OPTS:

-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Dla UseSerialGC ujrzymy w dzienniku:

7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

Dla UseConcMarkSweepGC zobaczymy w dziennik:

5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

Dla UseParallelGC zobaczymy w dzienniku:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 
1

można napisać prosty progam która łączy poprzez JMX do procesu Java:

public class PrintJMX { 
    public static void main(String[] args) throws Exception { 
    String rmiHostname = "localhost"; 
    String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; 
    JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); 

    JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); 
    MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); 


    ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 

    for (ObjectName name : mbsc.queryNames(gcName, null)) { 
     GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, 
     name.getCanonicalName(), 
     GarbageCollectorMXBean.class); 

     System.out.println(gc.getName()); 
    } 

    } 
} 
4

Wygląda na to, że mają wygodniejszy sposób definiowania wersji GC w czasie wykonywania. Zawsze używaj narzędzi, mojej sugestii. Aby określić wersję GC musimy dwa narzędzia, które pochodzą z JVM (umieszczony w katalogu jdk/bin):

  1. VisualVM - uruchom go i spróbować profil jakiś proces (na przykład możesz sam profil VisualVM). Twój profil pokaże Ci proces (zobacz zielone prostokąty na zrzucie ekranu).
  2. jMap - start tego narzędzia z -heap <PID> opcji i znaleźć ciąg poświęconą typu Garbage Collector (patrz różową linię przy zrzucie)

enter image description here

1

Najlepszy sposób, aby uzyskać to: Go aby wydać polecenie Linia i wprowadzić następujące polecenie.

java -XX: + PrintCommandLineFlags -version

pokaże spowodować jak:

C:\windows\system32>java -XX:+PrintCommandLineFlags -version 
-XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl 
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd 
**ividualAllocation -XX:+UseParallelGC** 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here` 
Powiązane problemy