2015-12-03 5 views
0

Я случайно наткнулся на это, пытаясь отладить утечку памяти в приложении. Сеть, в которую был загружен мой компьютер, была перенесена, и когда коммутатор был отключен, JVM использовал кучу, которая перестала расти.JVM Используемая куча растет при подключении к Интернету

Когда компьютер имеет активное сетевое соединение, память, используемая JVM, растет (в конечном итоге она получит GC). Это работает на Java-программах, которые имеют и не имеют интернет-соединений.

Example.java:

public class Example { 

    public static void main(String[] args) { 

     while (true){ 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

При запуске Визуальная VM вы заметите, что память используется постоянно растет. Если вы должны были отключиться от сети, это плоские линии.

Я, к сожалению, не могу загрузить изображение, поскольку сеть не позволит мне.

Почему это?

EDIT: Если кабель повторно подключить используемый ворох вновь начнет

ответ

1

VisualVM использует совсем немного памяти для работы расти. Он выполняет ряд вызовов RMI через JMX, который производит довольно много мусора.

Некоторые из этих вызовов проверяют DNS-имя используемых IP-адресов, поэтому, когда вы вытаскиваете сеть, скорее всего, вы прекращаете ее работу или заставляете ее замедлять время, так как частота дискретизации резко снижается.

Вы можете настроить VisualVM на выборку реже, но вы также можете использовать профилировщик, который не создает столько мусора.

КСТАТИ Чтобы проверить программа ничего не делает я использую

System.in.read(); 

Для контроля использования памяти в более легком весе, как вы можете использовать jstat -gcusage {pid} Это будет производить меньше мусора.

Смежные вопросы