# 不~怎麼又 OOM 啦!Intellij VisualVM Launcher  ## 聞風喪膽的 OOM 大多人對於下面的錯誤訊息一定不陌生 ```log Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ``` 在一般非預期的情況下,就是有某處的程式碼一下讀取了過多的資料進到記憶體中,又或者是某個地方的迴圈沒有寫好 使用一段最簡單的程式碼來重現這個錯誤 ```java public class Main { public static void main(String[] args) { final List<Integer> list = new ArrayList<>(); while(true){ list.add(1); } } } ``` 並且在執行的時候加上一些 vm 參數來限制記憶體大小,讓錯誤更快產生 ```java -Xms18m -Xmx18m ``` ## 分析 通常錯誤發生時,我們最想要知道的就是當下的記憶體的使用情況,透過觀察某類別的資料大小,可以推敲出是什麼地方可能有 memory leak 的風險,才能加以改善。 這邊會在 vm 參數加上 ```java -Xms18m -Xmx18m -XX:+HeapDumpOnOutOfMemoryError ``` 讓程式在遇到 OOM 錯誤的時候產出一份 .hprof 的檔案,通常會使用 mat (Memory Analyzer Tool) 來進行分析,但這都是事發之後才來做的事情,如果我們想要觀測這個錯誤的產生過程,可以怎麼做? ## VisualVM >VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities. download:https://visualvm.github.io/download.html 運行 `/bin/visualvm` 即可透過 VisualVM 來觀察目前的 Java Application 記憶體變化   有了這樣的幫助,我們就可以在 local 環境上觀察程式運作的記憶體變化,從這個過程中來發現是不是某個方法不如預期中的進行,佔用到了過多的記憶體。 ## Intellij VisualVM Launcher plugin:https://plugins.jetbrains.com/plugin/7115-visualvm-launcher 不過這樣的方式每次都還要自己手動開啟稍嫌麻煩,是不是可以在 Intellij 也提供一個快捷的方式來啟動? 那就要安裝 `VisualVM Launcher` 來幫忙了。 安裝後,指定 VisualVM 的執行位置即可  在熟悉的 IDEA 右上角,原本應該只有 run/debug,現在還多了有 `Run with VisualVM`  透過上述的配置,我們就可以在運行程式碼的同時,也啟動 VisualVM 一併觀察記憶體的變化,來找出真正 memory leak 的所在之處。 ## 如何善用 我們在前面的文章 [Spring Data JPA - MySQL using streams (1)](https://hackmd.io/KePD8UeBQ4K0rf2-rflroQ?view) 中提到可以使用 stream 來穩定過程中的記憶體使用量,那看完這篇文章之後,就可以搭配使用,在 local 運行的階段中,來觀察記憶體用量是不是如文中所述,而不是一口氣的記憶體暴增(將查詢結果都存到記憶體中)。 ###### tags: `blog` `java` `IDEA`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up