Как я могу увидеть, какой сборщик мусора использует Java - PullRequest
14 голосов
/ 23 марта 2010

Виртуальная машина Java поддерживает несколько стратегий сбора мусора.

Эта статья объясняет их.

Теперь мне интересно, какую (автоматически выбранную) стратегию использует мое приложение, есть ли способ разрешить JVM (версия 1.6)распечатать эту информацию?

Редактировать: JVM определяет, работает ли она в режиме клиента или сервера.Таким образом, вопрос в том, как я могу увидеть, что было обнаружено?

Ответы [ 7 ]

15 голосов
/ 06 апреля 2010

jmap -heap

Печать сводки кучи.Используемый алгоритм GC, конфигурация кучи и мудрое использование кучи генерируются.

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

13 голосов
/ 23 марта 2010

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html, который также применим для J2SE 6, утверждает, что по умолчанию используется параллельный коллектор.

Мы протестировали это один раз на JVM 1.5, установив только

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

и вывод показал

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]

, где PS обозначает параллельную очистку

8 голосов
/ 21 февраля 2011

Поместите это в JAVA_OPTS:

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

Для UseSerialGC мы увидим в журнале:

 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]

Для UseConcMarkSweepGC мы увидим в журнале:

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

Для UseParallelGC мы увидим в журнале:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs]
5 голосов
/ 01 июня 2016

Похоже, у нас есть более удобный способ определения версии GC во время выполнения.Всегда используйте инструменты, мое предложение.Чтобы определить версию GC, нам нужны два инструмента, которые поставляются с JVM (находятся в вашем каталоге jdk/bin):

  1. VisualVM - запустите его и попробуйте профилировать какой-то процесс (например, вы можете профилировать VisualVMсам).Ваш профиль покажет вам PID процесса (см. Зеленые прямоугольники на скриншоте).
  2. jMap - запустите этот инструмент с параметрами -heap <PID> и найдите строку, посвященнуюТип сборщика мусора (см. Розовую линию на скриншоте)

enter image description here

5 голосов
/ 23 марта 2010

Как уже упоминал Йоахим, в статье, на которую вы ссылаетесь, описываются стратегии виртуальных машин, предлагаемые виртуальной машиной Sun.Сама спецификация VM не требует специальных алгоритмов GC и, следовательно, не имеет смысла, например, перечислять значения для них в API.

Однако вы можете получить некоторую информацию из API управления:

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

Итерируя по этим компонентам, вы можете получить имя GC (хотя только в виде строки) и именапулы памяти, которыми управляют разные GC.

2 голосов
/ 25 января 2017

Лучший способ получить это: Перейдите в командную строку и введите следующую команду.

java -XX: + PrintCommandLineFlags -version

Он покажет вам результат как:

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`
1 голос
/ 26 сентября 2014

Вы можете написать простую программу, которая подключается через jmx к вашему процессу 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());
    }

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...