I was monitoring a new version of our trading software running on a staging
server and noticed through
htop that it was using much more memory than I
But I hadn’t set up remote profiling! I didn’t want to restart the JVM with profiling enabled, because it took several days for the potential issue I was now seeing to occur.
Luckily we control our system from a REPL, and if you’re using Clojure, chances are that you also control your system from a REPL.
You could read through and translate the 70 or so lines of Java on Oracle’s blog (which gives an excellent overview of how to cause a heap dump programmatically), but you should also feel free to just copy and paste this Clojure equivalent. :)
(import 'java.lang.management.ManagementFactory) (import 'com.sun.management.HotSpotDiagnosticMXBean) (let [server (ManagementFactory/getPlatformMBeanServer) bean-name "com.sun.management:type=HotSpotDiagnostic" bean (ManagementFactory/newPlatformMXBeanProxy server bean-name HotSpotDiagnosticMXBean) live-objects-only? false] (.dumpHeap bean "dump.hprof" live-objects-only?))
Hope this is useful to somebody else out there!