2016-03-29 2 views
0

Наш продукт работает на серверах наших клиентов только с JRE (без JDK) в Windows.Получите кучу дампа от JRE только на Windows

Я знаю, что могу получить кучу кучи на OutOfMemoryError через флаг.

Однако есть ли способ получить кучу кучи от JRE JVM-процесса проактивно?

Я планировал получить несколько полезных дампов кучи и сравнить их с дампом кучи, полученным на OutOfMemoryError.

Желательно, чтобы я мог попросить клиента загрузить этот инструмент/утилиту, а затем запустить его на сервере, чтобы получить кучу кучи по желанию.

Я попробовал jvisualvm, но jvisualvm не указал наш продукт jVM. Он будет перечислять только некоторые из JVM, запущенных в то время, и не все запущенные в это время JVM. PLUS jvisualvm очень громоздкий.

P.S: Существуют ли сторонние утилиты, которые могут быть выполнены на хосте JVM для сброса кучи? Кроме того, клиент не может обновить JRE в этот момент времени. И ни один из ответов на предыдущий вопрос не выбран в качестве ответа!

Спасибо,

+0

Я видел этот вопрос. Учитывая, что вопрос был задан 2 года назад, я ищу, есть ли утилит и т. Д., Которые могут выполнить задачу. – anjanb

ответ

1
  1. Чтобы сбросить кучу внутри JVM, используйте com.sun.management.HotSpotDiagnosticMXBean:

    HotSpotDiagnosticMXBean hs = 
          ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); 
        hs.dumpHeap("/path/to/heapdump.bin", false); 
    
  2. Чтобы сбросить кучу другого процесса снаружи, используйте HotSpot Dynamic Attach mechanism.
    Я написал для этого крошечную утилиту, см. https://github.com/apangin/jattach.

    Построить программу с make, а затем запустить

    jattach <PID> dumpheap /path/to/heapdump.bin 
    
+0

делает jattach dump a .hprof? – anjanb

+0

Я попытался построить на cygwin/windows, но не смог его построить. я создаю проблему для того же самого в github. – anjanb

+0

@anjanb Да, он сбрасывает .hprof, точно так же, как делает jmap. Я добавил реализацию jattach для Windows. – apangin