Отличается ли сборщик мусора от eclipse по умолчанию? - PullRequest
3 голосов
/ 12 мая 2010

Из вопросов, размещенных здесь, и из моего старого, у меня создалось впечатление, что вы не можете явно запускать сборщик мусора Java в любое время.

Если вы звоните по этому номеру, вы просто даете команду системе вызывать ее всякий раз, когда она может или считает это целесообразным.

Но в затмении, если вы нажмете кнопку «Запустить сборщик мусора», вы увидите немедленное сокращение использования памяти. Как это возможно? Использует ли Eclipse другой сборщик мусора, имеет ли он доступ к некоторому секретному API, которого у нас нет, или моя концепция неправильной работы GC?

Ответы [ 3 ]

6 голосов
/ 12 мая 2010

«Нормальная» Java-программа не может принудительно запустить сборщик мусора. Однако, используя Интерфейс Java Virtual Machine Tool (JVMTI, API для подключения, например, отладчиков к JVM), вы можете форсировать сборку мусора.

Я не знаю, просто ли Eclipse вызывает System.gc() (что не заставляет сборщик мусора) или использует API JVMTI для реального запуска GC.

С помощью JVisualVM (входит в Sun JDK 6) вы можете подключиться к другим работающим процессам Java и нажать кнопку, чтобы запустить сборщик мусора в этих процессах.

3 голосов
/ 12 мая 2010

Вы не можете сказать о запуске ГХ, но вы можете попросить об этом , используя System.gc().

Я подозреваю, что Eclipse просто называет это, и большую часть времени GC решает что-то сделать.

2 голосов
/ 12 мая 2010

Затмение звонит System.gc(). System.gc() не принудительно сборщик мусора, он просто инструктирует JVM попробовать. JVM вправе игнорировать это. Однако на практике поведение JVM от Sun по умолчанию заключается в запуске GC при вызове System.gc().

Обратите внимание на следующее:

  • JVM от Sun можно запустить с флагом командной строки -XX:-DisableExplicitGC. С этим флагом System.gc() становится бездействующим. ВМ по-прежнему будет работать с GC, когда это необходимо, но она будет просто игнорировать любой явный вызов System.gc().

  • Заставить GC работать независимо от того, как вы это делаете, редко бывает хорошей идеей. GC оптимизирован с учетом некоторых эвристических приближений кода работающего приложения (большинство из которых имеет дело со сложным, но важным вопросом о локальности кэша), и явные вызовы GC не являются частью этой эвристики. Компульсивный запуск ГК обычно оказывается сложным способом замедления.

  • Может быть, я должен назвать это Oracle JVM? Oracle купила Sun, и теперь на всех страницах Java есть логотип Oracle.

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